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 @@ -967,7 +967,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 @@ -1300,7 +1300,6 @@ vop_stdset_text(struct vop_set_text_args *ap) { struct vnode *vp; - struct mount *mp; int error, n; vp = ap->a_vp; @@ -1326,12 +1325,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); @@ -1366,11 +1363,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 @@ -4122,7 +4122,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)); @@ -4163,8 +4165,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) @@ -4175,7 +4175,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 @@ -489,7 +489,7 @@ #define MNTK_LOOKUP_EXCL_DOTDOT 0x00000800 #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 */