mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
VMIO reads: enable for nullfs upper vnode if the lower vnode supports it.
Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D25968
This commit is contained in:
parent
fbca789fc3
commit
685cb01a18
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=364288
|
@ -258,6 +258,26 @@ null_nodeget(mp, lowervp, vpp)
|
|||
if (lowervp == MOUNTTONULLMOUNT(mp)->nullm_lowerrootvp)
|
||||
vp->v_vflag |= VV_ROOT;
|
||||
|
||||
/*
|
||||
* We might miss the case where lower vnode sets VIRF_PGREAD
|
||||
* some time after construction, which is typical case.
|
||||
* null_open rechecks.
|
||||
*/
|
||||
if ((lowervp->v_irflag & VIRF_PGREAD) != 0) {
|
||||
MPASS(lowervp->v_object != NULL);
|
||||
if ((vp->v_irflag & 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;
|
||||
VI_UNLOCK(vp);
|
||||
} else {
|
||||
MPASS(vp->v_object != NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Atomically insert our new node into the hash or vget existing
|
||||
* if someone else has beaten us to it.
|
||||
|
@ -265,6 +285,7 @@ null_nodeget(mp, lowervp, vpp)
|
|||
*vpp = null_hashins(mp, xp);
|
||||
if (*vpp != NULL) {
|
||||
vrele(lowervp);
|
||||
vp->v_object = NULL; /* in case VIRF_PGREAD set it */
|
||||
null_destroy_proto(vp, xp);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
@ -439,8 +439,17 @@ null_open(struct vop_open_args *ap)
|
|||
vp = ap->a_vp;
|
||||
ldvp = NULLVPTOLOWERVP(vp);
|
||||
retval = null_bypass(&ap->a_gen);
|
||||
if (retval == 0)
|
||||
if (retval == 0) {
|
||||
vp->v_object = ldvp->v_object;
|
||||
if ((ldvp->v_irflag & VIRF_PGREAD) != 0) {
|
||||
MPASS(vp->v_object != NULL);
|
||||
if ((vp->v_irflag & VIRF_PGREAD) == 0) {
|
||||
VI_LOCK(vp);
|
||||
vp->v_irflag |= VIRF_PGREAD;
|
||||
VI_UNLOCK(vp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (retval);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue