Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F115902846
D30337.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D30337.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D30337: vfs: replace the MNTK_TEXT_REFS flag with VIRF_TEXT_REF
Attached
Detach File
Event Timeline
Log In to Comment