[Midnightbsd-cvs] src [8546] trunk/sys: fix the mis-handling of teh VV_TEXT on the nullfs vnodes.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Mon Sep 19 10:02:17 EDT 2016
Revision: 8546
http://svnweb.midnightbsd.org/src/?rev=8546
Author: laffer1
Date: 2016-09-19 10:02:17 -0400 (Mon, 19 Sep 2016)
Log Message:
-----------
fix the mis-handling of teh VV_TEXT on the nullfs vnodes.
Modified Paths:
--------------
trunk/sys/compat/linux/linux_misc.c
trunk/sys/fs/coda/coda_subr.c
trunk/sys/fs/nfsserver/nfs_nfsdport.c
trunk/sys/kern/imgact_elf.c
trunk/sys/kern/kern_exec.c
trunk/sys/kern/vfs_default.c
trunk/sys/kern/vfs_vnops.c
trunk/sys/kern/vnode_if.src
trunk/sys/nfsserver/nfs_serv.c
trunk/sys/vm/vm_object.c
trunk/sys/vm/vnode_pager.c
Modified: trunk/sys/compat/linux/linux_misc.c
===================================================================
--- trunk/sys/compat/linux/linux_misc.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/compat/linux/linux_misc.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -373,7 +373,7 @@
* XXX: Note that if any of the VM operations fail below we don't
* clear this flag.
*/
- vp->v_vflag |= VV_TEXT;
+ VOP_SET_TEXT(vp);
/*
* Lock no longer needed
Modified: trunk/sys/fs/coda/coda_subr.c
===================================================================
--- trunk/sys/fs/coda/coda_subr.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/fs/coda/coda_subr.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -486,7 +486,7 @@
cache_purge(CTOV(cp));
cp->c_flags &= ~(C_VATTR | C_ACCCACHE);
ASSERT_VOP_LOCKED(CTOV(cp), "coda HandleDownCall");
- if (CTOV(cp)->v_vflag & VV_TEXT)
+ if (VOP_IS_TEXT(CTOV(cp)))
error = coda_vmflush(cp);
CODADEBUG(CODA_ZAPFILE,
myprintf(("zapfile: fid = %s, refcnt = %d, error = "
@@ -532,7 +532,7 @@
cp->c_flags &= ~(C_VATTR | C_ACCCACHE);
ASSERT_VOP_LOCKED(CTOV(cp), "coda HandleDownCall");
if (!(IS_DIR(out->coda_purgefid.Fid))
- && (CTOV(cp)->v_vflag & VV_TEXT))
+ && VOP_IS_TEXT(CTOV(cp)))
error = coda_vmflush(cp);
CODADEBUG(CODA_PURGEFID, myprintf(("purgefid: fid "
"= %s, refcnt = %d, error = %d\n",
Modified: trunk/sys/fs/nfsserver/nfs_nfsdport.c
===================================================================
--- trunk/sys/fs/nfsserver/nfs_nfsdport.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/fs/nfsserver/nfs_nfsdport.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -253,7 +253,7 @@
* the inode, try to free it up once. If
* we fail, we can't allow writing.
*/
- if ((vp->v_vflag & VV_TEXT) != 0 && error == 0)
+ if (VOP_IS_TEXT(vp) && error == 0)
error = ETXTBSY;
}
if (error != 0) {
Modified: trunk/sys/kern/imgact_elf.c
===================================================================
--- trunk/sys/kern/imgact_elf.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/kern/imgact_elf.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -636,7 +636,7 @@
* Also make certain that the interpreter stays the same, so set
* its VV_TEXT flag, too.
*/
- nd->ni_vp->v_vflag |= VV_TEXT;
+ VOP_SET_TEXT(nd->ni_vp);
imgp->object = nd->ni_vp->v_object;
Modified: trunk/sys/kern/kern_exec.c
===================================================================
--- trunk/sys/kern/kern_exec.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/kern/kern_exec.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -473,9 +473,8 @@
* Remember if this was set before and unset it in case this is not
* actually an executable image.
*/
- textset = imgp->vp->v_vflag & VV_TEXT;
- ASSERT_VOP_ELOCKED(imgp->vp, "vv_text");
- imgp->vp->v_vflag |= VV_TEXT;
+ textset = VOP_IS_TEXT(imgp->vp);
+ VOP_SET_TEXT(imgp->vp);
error = exec_map_first_page(imgp);
if (error)
@@ -506,10 +505,8 @@
if (error) {
if (error == -1) {
- if (textset == 0) {
- ASSERT_VOP_ELOCKED(imgp->vp, "vv_text");
- imgp->vp->v_vflag &= ~VV_TEXT;
- }
+ if (textset == 0)
+ VOP_UNSET_TEXT(imgp->vp);
error = ENOEXEC;
}
goto exec_fail_dealloc;
@@ -527,7 +524,7 @@
* VV_TEXT will be set. The vnode lock is held over this
* entire period so nothing should illegitimately be blocked.
*/
- imgp->vp->v_vflag &= ~VV_TEXT;
+ VOP_UNSET_TEXT(imgp->vp);
/* free name buffer and old vnode */
if (args->fname != NULL)
NDFREE(&nd, NDF_ONLY_PNBUF);
Modified: trunk/sys/kern/vfs_default.c
===================================================================
--- trunk/sys/kern/vfs_default.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/kern/vfs_default.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -78,6 +78,10 @@
#define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
+static int vop_stdis_text(struct vop_is_text_args *ap);
+static int vop_stdset_text(struct vop_set_text_args *ap);
+static int vop_stdunset_text(struct vop_unset_text_args *ap);
+
/*
* This vnode table stores what we want to do if the filesystem doesn't
* implement a particular VOP.
@@ -126,6 +130,9 @@
.vop_unp_bind = vop_stdunp_bind,
.vop_unp_connect = vop_stdunp_connect,
.vop_unp_detach = vop_stdunp_detach,
+ .vop_is_text = vop_stdis_text,
+ .vop_set_text = vop_stdset_text,
+ .vop_unset_text = vop_stdunset_text,
};
/*
@@ -1073,6 +1080,29 @@
return (0);
}
+static int
+vop_stdis_text(struct vop_is_text_args *ap)
+{
+
+ return ((ap->a_vp->v_vflag & VV_TEXT) != 0);
+}
+
+static int
+vop_stdset_text(struct vop_set_text_args *ap)
+{
+
+ ap->a_vp->v_vflag |= VV_TEXT;
+ return (0);
+}
+
+static int
+vop_stdunset_text(struct vop_unset_text_args *ap)
+{
+
+ ap->a_vp->v_vflag &= ~VV_TEXT;
+ return (0);
+}
+
/*
* vfs default ops
* used to fill the vfs function table to get reasonable default return values.
Modified: trunk/sys/kern/vfs_vnops.c
===================================================================
--- trunk/sys/kern/vfs_vnops.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/kern/vfs_vnops.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -282,7 +282,7 @@
* the vnode, try to free it up once. If
* we fail, we can't allow writing.
*/
- if (vp->v_vflag & VV_TEXT)
+ if (VOP_IS_TEXT(vp))
return (ETXTBSY);
return (0);
Modified: trunk/sys/kern/vnode_if.src
===================================================================
--- trunk/sys/kern/vnode_if.src 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/kern/vnode_if.src 2016-09-19 14:02:17 UTC (rev 8546)
@@ -672,6 +672,24 @@
IN int inc;
};
+%% is_text vp L L L
+
+vop_is_text {
+ IN struct vnode *vp;
+};
+
+%% set_text vp E E E
+
+vop_set_text {
+ IN struct vnode *vp;
+};
+
+%% vop_unset_text vp E E E
+
+vop_unset_text {
+ IN struct vnode *vp;
+};
+
# The VOPs below are spares at the end of the table to allow new VOPs to be
# added in stable branches without breaking the KBI. New VOPs in HEAD should
# be added above these spares. When merging a new VOP to a stable branch,
Modified: trunk/sys/nfsserver/nfs_serv.c
===================================================================
--- trunk/sys/nfsserver/nfs_serv.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/nfsserver/nfs_serv.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -3891,7 +3891,7 @@
* If there's shared text associated with
* the inode, we can't allow writing.
*/
- if (vp->v_vflag & VV_TEXT)
+ if (VOP_IS_TEXT(vp))
return (ETXTBSY);
}
Modified: trunk/sys/vm/vm_object.c
===================================================================
--- trunk/sys/vm/vm_object.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/vm/vm_object.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -455,7 +455,7 @@
VOP_UNLOCK(vp, 0);
} else {
if (object->ref_count == 0)
- vp->v_vflag &= ~VV_TEXT;
+ VOP_UNSET_TEXT(vp);
VM_OBJECT_UNLOCK(object);
vput(vp);
}
Modified: trunk/sys/vm/vnode_pager.c
===================================================================
--- trunk/sys/vm/vnode_pager.c 2016-09-19 14:01:52 UTC (rev 8545)
+++ trunk/sys/vm/vnode_pager.c 2016-09-19 14:02:17 UTC (rev 8546)
@@ -275,7 +275,7 @@
vp->v_writecount--;
}
vp->v_object = NULL;
- vp->v_vflag &= ~VV_TEXT;
+ VOP_UNSET_TEXT(vp);
VM_OBJECT_UNLOCK(object);
while (refs-- > 0)
vunref(vp);
More information about the Midnightbsd-cvs
mailing list