Page MenuHomeFreeBSD

D30337.diff
No OneTemporary

D30337.diff

diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c
--- a/sys/fs/tmpfs/tmpfs_subr.c
+++ b/sys/fs/tmpfs/tmpfs_subr.c
@@ -904,7 +904,7 @@
vp->v_object = object;
object->un_pager.swp.swp_tmpfs = vp;
vm_object_set_flag(object, OBJ_TMPFS);
- vn_irflag_set_locked(vp, VIRF_PGREAD);
+ vn_irflag_set_locked(vp, VIRF_PGREAD | VIRF_TEXT_REF);
VI_UNLOCK(vp);
VM_OBJECT_WUNLOCK(object);
break;
diff --git a/sys/fs/tmpfs/tmpfs_vfsops.c b/sys/fs/tmpfs/tmpfs_vfsops.c
--- a/sys/fs/tmpfs/tmpfs_vfsops.c
+++ b/sys/fs/tmpfs/tmpfs_vfsops.c
@@ -469,7 +469,7 @@
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_LOCAL;
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
- MNTK_TEXT_REFS | MNTK_NOMSYNC;
+ MNTK_NOMSYNC;
if (!nonc && (mp->mnt_flag & MNT_UNION) == 0)
mp->mnt_kern_flag |= MNTK_FPLOOKUP;
MNT_IUNLOCK(mp);
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1176,7 +1176,6 @@
vop_stdset_text(struct vop_set_text_args *ap)
{
struct vnode *vp;
- struct mount *mp;
int error, n;
vp = ap->a_vp;
@@ -1202,12 +1201,10 @@
* If requested by fs, keep a use reference to the
* vnode until the last text reference is released.
*/
- mp = vp->v_mount;
- if (mp != NULL && (mp->mnt_kern_flag & MNTK_TEXT_REFS) != 0 &&
- vp->v_writecount == 0) {
- VNPASS((vp->v_iflag & VI_TEXT_REF) == 0, vp);
- vp->v_iflag |= VI_TEXT_REF;
- vrefl(vp);
+ if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) {
+ if (vp->v_writecount == 0) {
+ vrefl(vp);
+ }
}
atomic_subtract_int(&vp->v_writecount, 1);
@@ -1242,11 +1239,12 @@
last = false;
VI_LOCK(vp);
if (vp->v_writecount < 0) {
- if ((vp->v_iflag & VI_TEXT_REF) != 0 &&
- vp->v_writecount == -1) {
- last = true;
- vp->v_iflag &= ~VI_TEXT_REF;
+ if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) {
+ if (vp->v_writecount == -1) {
+ last = true;
+ }
}
+
atomic_add_int(&vp->v_writecount, 1);
error = 0;
} else {
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -4179,7 +4179,9 @@
strlcat(buf, "|VIRF_PGREAD", sizeof(buf));
if (irflag & VIRF_MOUNTPOINT)
strlcat(buf, "|VIRF_MOUNTPOINT", sizeof(buf));
- flags = irflag & ~(VIRF_DOOMED | VIRF_PGREAD | VIRF_MOUNTPOINT);
+ if (irflag & VIRF_TEXT_REF)
+ strlcat(buf, "|VIRF_TEXT_REF", sizeof(buf));
+ flags = irflag & ~(VIRF_DOOMED | VIRF_PGREAD | VIRF_MOUNTPOINT | VIRF_TEXT_REF);
if (flags != 0) {
snprintf(buf2, sizeof(buf2), "|VIRF(0x%lx)", flags);
strlcat(buf, buf2, sizeof(buf));
@@ -4220,8 +4222,6 @@
snprintf(buf2, sizeof(buf2), "|VV(0x%lx)", flags);
strlcat(buf, buf2, sizeof(buf));
}
- if (vp->v_iflag & VI_TEXT_REF)
- strlcat(buf, "|VI_TEXT_REF", sizeof(buf));
if (vp->v_iflag & VI_MOUNT)
strlcat(buf, "|VI_MOUNT", sizeof(buf));
if (vp->v_iflag & VI_DOINGINACT)
@@ -4232,7 +4232,7 @@
strlcat(buf, "|VI_DEFINACT", sizeof(buf));
if (vp->v_iflag & VI_FOPENING)
strlcat(buf, "|VI_FOPENING", sizeof(buf));
- flags = vp->v_iflag & ~(VI_TEXT_REF | VI_MOUNT | VI_DOINGINACT |
+ flags = vp->v_iflag & ~(VI_MOUNT | VI_DOINGINACT |
VI_OWEINACT | VI_DEFINACT | VI_FOPENING);
if (flags != 0) {
snprintf(buf2, sizeof(buf2), "|VI(0x%lx)", flags);
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -471,7 +471,7 @@
#define MNTK_MARKER 0x00001000
#define MNTK_UNMAPPED_BUFS 0x00002000
#define MNTK_USES_BCACHE 0x00004000 /* FS uses the buffer cache. */
-#define MNTK_TEXT_REFS 0x00008000 /* Keep use ref for text */
+#define MNTK_UNUSED0 0x00008000 /* unused */
#define MNTK_VMSETSIZE_BUG 0x00010000
#define MNTK_UNIONFS 0x00020000 /* A hack for F_ISUNIONSTACK */
#define MNTK_FPLOOKUP 0x00040000 /* fast path lookup is supported */
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -251,8 +251,9 @@
#define VIRF_PGREAD 0x0002 /* Direct reads from the page cache are permitted,
never cleared once set */
#define VIRF_MOUNTPOINT 0x0004 /* This vnode is mounted on */
+#define VIRF_TEXT_REF 0x0008 /* Executable mappings ref the vnode */
-#define VI_TEXT_REF 0x0001 /* Text ref grabbed use ref */
+#define VI_UNUSED0 0x0001 /* unused */
#define VI_MOUNT 0x0002 /* Mount in progress */
#define VI_DOINGINACT 0x0004 /* VOP_INACTIVE is in progress */
#define VI_OWEINACT 0x0008 /* Need to call inactive */

File Metadata

Mime Type
text/plain
Expires
Thu, May 1, 5:27 AM (12 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17873788
Default Alt Text
D30337.diff (4 KB)

Event Timeline