Page MenuHomeFreeBSD

D27793.id81248.diff
No OneTemporary

D27793.id81248.diff

Index: sys/fs/nullfs/null_subr.c
===================================================================
--- sys/fs/nullfs/null_subr.c
+++ sys/fs/nullfs/null_subr.c
@@ -263,15 +263,15 @@
* some time after construction, which is typical case.
* null_open rechecks.
*/
- if ((lowervp->v_irflag & VIRF_PGREAD) != 0) {
+ if ((vn_irflag_read(lowervp) & VIRF_PGREAD) != 0) {
MPASS(lowervp->v_object != NULL);
- if ((vp->v_irflag & VIRF_PGREAD) == 0) {
+ if ((vn_irflag_read(vp) & VIRF_PGREAD) == 0) {
if (vp->v_object == NULL)
vp->v_object = lowervp->v_object;
else
MPASS(vp->v_object == lowervp->v_object);
VI_LOCK(vp);
- vp->v_irflag |= VIRF_PGREAD;
+ vn_irflag_set(vp, VIRF_PGREAD);
VI_UNLOCK(vp);
} else {
MPASS(vp->v_object != NULL);
Index: sys/fs/nullfs/null_vnops.c
===================================================================
--- sys/fs/nullfs/null_vnops.c
+++ sys/fs/nullfs/null_vnops.c
@@ -458,11 +458,11 @@
retval = null_bypass(&ap->a_gen);
if (retval == 0) {
vp->v_object = ldvp->v_object;
- if ((ldvp->v_irflag & VIRF_PGREAD) != 0) {
+ if ((vn_irflag_read(ldvp) & VIRF_PGREAD) != 0) {
MPASS(vp->v_object != NULL);
- if ((vp->v_irflag & VIRF_PGREAD) == 0) {
+ if ((vn_irflag_read(vp) & VIRF_PGREAD) == 0) {
VI_LOCK(vp);
- vp->v_irflag |= VIRF_PGREAD;
+ vn_irflag_set(vp, VIRF_PGREAD);
VI_UNLOCK(vp);
}
}
Index: sys/fs/tmpfs/tmpfs_subr.c
===================================================================
--- sys/fs/tmpfs/tmpfs_subr.c
+++ sys/fs/tmpfs/tmpfs_subr.c
@@ -698,7 +698,7 @@
vp->v_object = object;
object->un_pager.swp.swp_tmpfs = vp;
vm_object_set_flag(object, OBJ_TMPFS);
- vp->v_irflag |= VIRF_PGREAD;
+ vn_irflag_set(vp, VIRF_PGREAD);
VI_UNLOCK(vp);
VM_OBJECT_WUNLOCK(object);
break;
Index: sys/fs/tmpfs/tmpfs_vnops.c
===================================================================
--- sys/fs/tmpfs/tmpfs_vnops.c
+++ sys/fs/tmpfs/tmpfs_vnops.c
@@ -600,7 +600,7 @@
int error;
vp = v->a_vp;
- MPASS((vp->v_irflag & VIRF_PGREAD) != 0);
+ MPASS((vn_irflag_read(vp) & VIRF_PGREAD) != 0);
if (v->a_uio->uio_offset < 0)
return (EINVAL);
Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c
+++ sys/kern/vfs_subr.c
@@ -1821,7 +1821,7 @@
vp->v_rdev = NULL;
vp->v_fifoinfo = NULL;
vp->v_lasta = vp->v_clen = vp->v_cstart = vp->v_lastw = 0;
- vp->v_irflag = 0;
+ vn_irflag_read(vp) = 0;
vp->v_iflag = 0;
vp->v_vflag = 0;
bo->bo_flag = 0;
@@ -3868,14 +3868,14 @@
/*
* Don't vgonel if we're already doomed.
*/
- if (vp->v_irflag & VIRF_DOOMED)
+ if (VN_IS_DOOMED(vp))
return;
/*
* Paired with freevnode.
*/
vn_seqc_write_begin_locked(vp);
vunlazy_gone(vp);
- vp->v_irflag |= VIRF_DOOMED;
+ vn_irflag_set(vp, VIRF_DOOMED);
/*
* Check to see if the vnode is in use. If so, we have to
@@ -4001,6 +4001,7 @@
char buf[256], buf2[16];
u_long flags;
u_int holdcnt;
+ char irflag;
va_start(ap, fmt);
vprintf(fmt, ap);
@@ -4036,11 +4037,12 @@
buf[0] = '\0';
buf[1] = '\0';
- if (vp->v_irflag & VIRF_DOOMED)
+ irflag = vn_irflag_read(vp);
+ if (irflag & VIRF_DOOMED)
strlcat(buf, "|VIRF_DOOMED", sizeof(buf));
- if (vp->v_irflag & VIRF_PGREAD)
+ if (irflag & VIRF_PGREAD)
strlcat(buf, "|VIRF_PGREAD", sizeof(buf));
- flags = vp->v_irflag & ~(VIRF_DOOMED | VIRF_PGREAD);
+ flags = irflag & ~(VIRF_DOOMED | VIRF_PGREAD);
if (flags != 0) {
snprintf(buf2, sizeof(buf2), "|VIRF(0x%lx)", flags);
strlcat(buf, buf2, sizeof(buf));
@@ -6794,3 +6796,35 @@
vn_seqc_write_end_locked(vp);
VI_UNLOCK(vp);
}
+
+void
+vn_irflag_set(struct vnode *vp, char toset)
+{
+ char flags;
+
+ ASSERT_VI_LOCKED(vp, __func__);
+ flags = vn_irflag_read(vp);
+ VNPASS((flags & toset) == 0, vp);
+ atomic_store_char(&vp->v_irflag, flags | toset);
+}
+
+void
+vn_irflag_set_cond(struct vnode *vp, char toset)
+{
+ char flags;
+
+ ASSERT_VI_LOCKED(vp, __func__);
+ flags = vn_irflag_read(vp);
+ atomic_store_char(&vp->v_irflag, flags | toset);
+}
+
+void
+vn_irflag_unset(struct vnode *vp, char tounset)
+{
+ char flags;
+
+ ASSERT_VI_LOCKED(vp, __func__);
+ flags = vn_irflag_read(vp);
+ VNPASS((flags & tounset) == tounset, vp);
+ atomic_store_char(&vp->v_irflag, flags & ~tounset);
+}
Index: sys/kern/vfs_vnops.c
===================================================================
--- sys/kern/vfs_vnops.c
+++ sys/kern/vfs_vnops.c
@@ -991,7 +991,7 @@
* allows us to avoid unneeded work outright.
*/
if (vn_io_pgcache_read_enable && !mac_vnode_check_read_enabled() &&
- (vp->v_irflag & (VIRF_DOOMED | VIRF_PGREAD)) == VIRF_PGREAD) {
+ (vn_irflag_read(vp) & (VIRF_DOOMED | VIRF_PGREAD)) == VIRF_PGREAD) {
error = VOP_READ_PGCACHE(vp, uio, ioflag, fp->f_cred);
if (error == 0) {
fp->f_nextoff[UIO_READ] = uio->uio_offset;
Index: sys/sys/vnode.h
===================================================================
--- sys/sys/vnode.h
+++ sys/sys/vnode.h
@@ -797,6 +797,11 @@
#define vn_rangelock_trywlock(vp, start, end) \
rangelock_trywlock(&(vp)->v_rl, (start), (end), VI_MTX(vp))
+#define vn_irflag_read(vp) atomic_load_char(&(vp)->v_irflag)
+void vn_irflag_set(struct vnode *vp, char toset);
+void vn_irflag_set_cond(struct vnode *vp, char toset);
+void vn_irflag_unset(struct vnode *vp, char tounset);
+
int vfs_cache_lookup(struct vop_lookup_args *ap);
int vfs_cache_root(struct mount *mp, int flags, struct vnode **vpp);
void vfs_timestamp(struct timespec *);
@@ -979,7 +984,7 @@
#define VOP_UNSET_TEXT_CHECKED(vp) VOP_UNSET_TEXT((vp))
#endif
-#define VN_IS_DOOMED(vp) __predict_false((vp)->v_irflag & VIRF_DOOMED)
+#define VN_IS_DOOMED(vp) __predict_false(vn_irflag_read(vp) & VIRF_DOOMED)
void vput(struct vnode *vp);
void vrele(struct vnode *vp);
Index: sys/ufs/ufs/ufs_vnops.c
===================================================================
--- sys/ufs/ufs/ufs_vnops.c
+++ sys/ufs/ufs/ufs_vnops.c
@@ -283,9 +283,9 @@
ip = VTOI(vp);
vnode_create_vobject(vp, DIP(ip, i_size), ap->a_td);
- if (vp->v_type == VREG && (vp->v_irflag & VIRF_PGREAD) == 0) {
+ if (vp->v_type == VREG && (vn_irflag_read(vp) & VIRF_PGREAD) == 0) {
VI_LOCK(vp);
- vp->v_irflag |= VIRF_PGREAD;
+ vn_irflag_set(vp, VIRF_PGREAD);
VI_UNLOCK(vp);
}
@@ -2947,7 +2947,7 @@
uio = ap->a_uio;
vp = ap->a_vp;
- MPASS((vp->v_irflag & VIRF_PGREAD) != 0);
+ MPASS((vn_irflag_read(vp) & VIRF_PGREAD) != 0);
if (uio->uio_resid > ptoa(io_hold_cnt) || uio->uio_offset < 0 ||
(ap->a_ioflag & IO_DIRECT) != 0)

File Metadata

Mime Type
text/plain
Expires
Thu, May 21, 12:27 PM (7 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33391528
Default Alt Text
D27793.id81248.diff (6 KB)

Event Timeline