Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 May 2009 14:54:20 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r193173 - head/sys/fs/nullfs
Message-ID:  <200905311454.n4VEsK9s046758@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun May 31 14:54:20 2009
New Revision: 193173
URL: http://svn.freebsd.org/changeset/base/193173

Log:
  Do not drop vnode interlock in null_checkvp(). null_lock() verifies that
  v_data is not-null before calling NULLVPTOLOWERVP(), and dropping the
  interlock allows for reclaim to clean v_data and free the memory.
  
  While there, remove unneeded semicolons and convert the infinite loops
  to panics. I have a will to remove null_checkvp() altogether, or leave
  it as a trivial stub, but not now.
  
  Reported and tested by:	pho

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

Modified: head/sys/fs/nullfs/null_subr.c
==============================================================================
--- head/sys/fs/nullfs/null_subr.c	Sun May 31 14:52:45 2009	(r193172)
+++ head/sys/fs/nullfs/null_subr.c	Sun May 31 14:54:20 2009	(r193173)
@@ -269,20 +269,14 @@ null_hashrem(xp)
 
 #ifdef DIAGNOSTIC
 
-#ifdef KDB
-#define	null_checkvp_barrier	1
-#else
-#define	null_checkvp_barrier	0
-#endif
-
 struct vnode *
 null_checkvp(vp, fil, lno)
 	struct vnode *vp;
 	char *fil;
 	int lno;
 {
-	int interlock = 0;
 	struct null_node *a = VTONULL(vp);
+
 #ifdef notyet
 	/*
 	 * Can't do this check because vop_reclaim runs
@@ -290,9 +284,8 @@ null_checkvp(vp, fil, lno)
 	 */
 	if (vp->v_op != null_vnodeop_p) {
 		printf ("null_checkvp: on non-null-node\n");
-		while (null_checkvp_barrier) /*WAIT*/ ;
 		panic("null_checkvp");
-	};
+	}
 #endif
 	if (a->null_lowervp == NULLVP) {
 		/* Should never happen */
@@ -301,32 +294,24 @@ null_checkvp(vp, fil, lno)
 		for (p = (u_long *) a, i = 0; i < 8; i++)
 			printf(" %lx", p[i]);
 		printf("\n");
-		/* wait for debugger */
-		while (null_checkvp_barrier) /*WAIT*/ ;
 		panic("null_checkvp");
 	}
-	if (mtx_owned(VI_MTX(vp)) != 0) {
-		VI_UNLOCK(vp);
-		interlock = 1;
-	}
-	if (vrefcnt(a->null_lowervp) < 1) {
+	VI_LOCK_FLAGS(a->null_lowervp, MTX_DUPOK);
+	if (a->null_lowervp->v_usecount < 1) {
 		int i; u_long *p;
 		printf("vp = %p, unref'ed lowervp\n", (void *)vp);
 		for (p = (u_long *) a, i = 0; i < 8; i++)
 			printf(" %lx", p[i]);
 		printf("\n");
-		/* wait for debugger */
-		while (null_checkvp_barrier) /*WAIT*/ ;
 		panic ("null with unref'ed lowervp");
-	};
-	if (interlock != 0)
-		VI_LOCK(vp);
+	}
+	VI_UNLOCK(a->null_lowervp);
 #ifdef notyet
 	printf("null %x/%d -> %x/%d [%s, %d]\n",
 	        NULLTOV(a), vrefcnt(NULLTOV(a)),
 		a->null_lowervp, vrefcnt(a->null_lowervp),
 		fil, lno);
 #endif
-	return a->null_lowervp;
+	return (a->null_lowervp);
 }
 #endif



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