svn commit: r351472 - head/sys/fs/nullfs
Mateusz Guzik
mjg at FreeBSD.org
Sun Aug 25 05:13:16 UTC 2019
Author: mjg
Date: Sun Aug 25 05:13:15 2019
New Revision: 351472
URL: https://svnweb.freebsd.org/changeset/base/351472
Log:
nullfs: reduce areas protected by vnode interlock
Some places only take the interlock to hold the vnode, which was a requiremnt
before they started being manipulated with atomics. Use the newly introduced
vholdnz to bump the count.
Reviewed by: kib
Tested by: pho
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D21358
Modified:
head/sys/fs/nullfs/null_vnops.c
Modified: head/sys/fs/nullfs/null_vnops.c
==============================================================================
--- head/sys/fs/nullfs/null_vnops.c Sun Aug 25 05:11:43 2019 (r351471)
+++ head/sys/fs/nullfs/null_vnops.c Sun Aug 25 05:13:15 2019 (r351472)
@@ -668,7 +668,7 @@ null_lock(struct vop_lock1_args *ap)
* We prevent it from being recycled by holding the vnode
* here.
*/
- vholdl(lvp);
+ vholdnz(lvp);
error = VOP_LOCK(lvp, flags);
/*
@@ -710,31 +710,16 @@ static int
null_unlock(struct vop_unlock_args *ap)
{
struct vnode *vp = ap->a_vp;
- int flags = ap->a_flags;
- int mtxlkflag = 0;
struct null_node *nn;
struct vnode *lvp;
int error;
- if ((flags & LK_INTERLOCK) != 0)
- mtxlkflag = 1;
- else if (mtx_owned(VI_MTX(vp)) == 0) {
- VI_LOCK(vp);
- mtxlkflag = 2;
- }
nn = VTONULL(vp);
if (nn != NULL && (lvp = NULLVPTOLOWERVP(vp)) != NULL) {
- VI_LOCK_FLAGS(lvp, MTX_DUPOK);
- flags |= LK_INTERLOCK;
- vholdl(lvp);
- VI_UNLOCK(vp);
- error = VOP_UNLOCK(lvp, flags);
+ vholdnz(lvp);
+ error = VOP_UNLOCK(lvp, 0);
vdrop(lvp);
- if (mtxlkflag == 0)
- VI_LOCK(vp);
} else {
- if (mtxlkflag == 2)
- VI_UNLOCK(vp);
error = vop_stdunlock(ap);
}
@@ -845,10 +830,8 @@ null_getwritemount(struct vop_getwritemount_args *ap)
VI_LOCK(vp);
xp = VTONULL(vp);
if (xp && (lowervp = xp->null_lowervp)) {
- VI_LOCK_FLAGS(lowervp, MTX_DUPOK);
+ vholdnz(lowervp);
VI_UNLOCK(vp);
- vholdl(lowervp);
- VI_UNLOCK(lowervp);
VOP_GETWRITEMOUNT(lowervp, ap->a_mpp);
vdrop(lowervp);
} else {
More information about the svn-src-all
mailing list