Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Sep 2019 02:52:00 +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: r351651 - head/sys/fs/nullfs
Message-ID:  <201909010252.x812q0WP020480@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Sun Sep  1 02:52:00 2019
New Revision: 351651
URL: https://svnweb.freebsd.org/changeset/base/351651

Log:
  nullfs: reduce areas protected by vnode interlock in null_lock
  
  Similarly to the other routine stop taking the interlock for the lower
  vnode. The interlock for nullfs vnode is still taken to ensure
  stability of ->v_data.
  
  Reviewed by:	kib
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D21480

Modified:
  head/sys/fs/nullfs/null_vnops.c

Modified: head/sys/fs/nullfs/null_vnops.c
==============================================================================
--- head/sys/fs/nullfs/null_vnops.c	Sun Sep  1 00:33:16 2019	(r351650)
+++ head/sys/fs/nullfs/null_vnops.c	Sun Sep  1 02:52:00 2019	(r351651)
@@ -638,16 +638,16 @@ static int
 null_lock(struct vop_lock1_args *ap)
 {
 	struct vnode *vp = ap->a_vp;
-	int flags = ap->a_flags;
+	int flags;
 	struct null_node *nn;
 	struct vnode *lvp;
 	int error;
 
-
-	if ((flags & LK_INTERLOCK) == 0) {
+	if ((ap->a_flags & LK_INTERLOCK) == 0)
 		VI_LOCK(vp);
-		ap->a_flags = flags |= LK_INTERLOCK;
-	}
+	else
+		ap->a_flags &= ~LK_INTERLOCK;
+	flags = ap->a_flags;
 	nn = VTONULL(vp);
 	/*
 	 * If we're still active we must ask the lower layer to
@@ -655,8 +655,6 @@ null_lock(struct vop_lock1_args *ap)
 	 * vop lock.
 	 */
 	if (nn != NULL && (lvp = NULLVPTOLOWERVP(vp)) != NULL) {
-		VI_LOCK_FLAGS(lvp, MTX_DUPOK);
-		VI_UNLOCK(vp);
 		/*
 		 * We have to hold the vnode here to solve a potential
 		 * reclaim race.  If we're forcibly vgone'd while we
@@ -669,6 +667,7 @@ null_lock(struct vop_lock1_args *ap)
 		 * here.
 		 */
 		vholdnz(lvp);
+		VI_UNLOCK(vp);
 		error = VOP_LOCK(lvp, flags);
 
 		/*
@@ -678,7 +677,7 @@ null_lock(struct vop_lock1_args *ap)
 		 * case by reacquiring correct lock in requested mode.
 		 */
 		if (VTONULL(vp) == NULL && error == 0) {
-			ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
+			ap->a_flags &= ~LK_TYPE_MASK;
 			switch (flags & LK_TYPE_MASK) {
 			case LK_SHARED:
 				ap->a_flags |= LK_SHARED;
@@ -695,8 +694,10 @@ null_lock(struct vop_lock1_args *ap)
 			error = vop_stdlock(ap);
 		}
 		vdrop(lvp);
-	} else
+	} else {
+		VI_UNLOCK(vp);
 		error = vop_stdlock(ap);
+	}
 
 	return (error);
 }



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