Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Aug 2019 05:13:15 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r351472 - head/sys/fs/nullfs
Message-ID:  <201908250513.x7P5DFFx017824@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201908250513.x7P5DFFx017824>