Module Name:    src
Committed By:   hannken
Date:           Thu Jun 24 07:54:48 UTC 2010

Modified Files:
        src/share/man/man9: vnodeops.9
        src/sys/coda: coda_vnops.c
        src/sys/fs/nilfs: nilfs_vnops.c
        src/sys/fs/udf: udf_vnops.c
        src/sys/fs/unionfs: unionfs_subr.c unionfs_vnops.c
        src/sys/kern: vfs_subr.c
        src/sys/miscfs/genfs: genfs_vnops.c
        src/sys/nfs: nfs_vfsops.c
        src/sys/sys: lock.h
        src/sys/ufs/lfs: lfs_subr.c lfs_vnops.c

Log Message:
Clean up vnode lock operations:

 - VOP_LOCK(vp, flags): Limit the set of allowed flags to LK_EXCLUSIVE,
   LK_SHARED and LK_NOWAIT.  LK_INTERLOCK is no longer allowed as it
   makes no sense here.

- VOP_ISLOCKED(vp): Remove the for some time unused return value
  LK_EXCLOTHER.  Mark this operation as "diagnostic only".
  Making a lock decision based on this operation is no longer allowed.

Discussed on tech-kern.


To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 src/share/man/man9/vnodeops.9
cvs rdiff -u -r1.71 -r1.72 src/sys/coda/coda_vnops.c
cvs rdiff -u -r1.4 -r1.5 src/sys/fs/nilfs/nilfs_vnops.c
cvs rdiff -u -r1.57 -r1.58 src/sys/fs/udf/udf_vnops.c
cvs rdiff -u -r1.7 -r1.8 src/sys/fs/unionfs/unionfs_subr.c
cvs rdiff -u -r1.1 -r1.2 src/sys/fs/unionfs/unionfs_vnops.c
cvs rdiff -u -r1.405 -r1.406 src/sys/kern/vfs_subr.c
cvs rdiff -u -r1.178 -r1.179 src/sys/miscfs/genfs/genfs_vnops.c
cvs rdiff -u -r1.212 -r1.213 src/sys/nfs/nfs_vfsops.c
cvs rdiff -u -r1.84 -r1.85 src/sys/sys/lock.h
cvs rdiff -u -r1.74 -r1.75 src/sys/ufs/lfs/lfs_subr.c
cvs rdiff -u -r1.227 -r1.228 src/sys/ufs/lfs/lfs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/share/man/man9/vnodeops.9
diff -u src/share/man/man9/vnodeops.9:1.78 src/share/man/man9/vnodeops.9:1.79
--- src/share/man/man9/vnodeops.9:1.78	Wed May 19 13:20:32 2010
+++ src/share/man/man9/vnodeops.9	Thu Jun 24 07:54:46 2010
@@ -1,4 +1,4 @@
-.\"     $NetBSD: vnodeops.9,v 1.78 2010/05/19 13:20:32 pooka Exp $
+.\"     $NetBSD: vnodeops.9,v 1.79 2010/06/24 07:54:46 hannken Exp $
 .\"
 .\" Copyright (c) 2001, 2005, 2006 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd May 19, 2010
+.Dd June 24, 2010
 .Dt VNODEOPS 9
 .Os
 .Sh NAME
@@ -1063,9 +1063,16 @@
 is the vnode of the file to be locked.
 The argument
 .Fa flags
-is a set of
-.Xr lockmgr 9
-flags.
+is
+.Dv LK_EXCLUSIVE
+to take the lock exclusively or
+.Dv LK_SHARED
+to take a shared lock.
+If
+.Fa flags
+contains
+.Dv LK_NOWAIT
+and the lock is busy, the operation will return immediately with an error code.
 If the operation is successful zero is returned, otherwise an
 appropriate error code is returned.
 .Fn VOP_LOCK
@@ -1100,6 +1107,9 @@
 .Dv LK_SHARED
 or 0 for lock held exclusively by the calling thread, shared lock held
 by anyone or unlocked, respectively.
+.Pp
+This function must never be used to make locking decisions at run time:
+it is provided only for diagnostic purposes.
 .It Fn VOP_BMAP "vp" "bn" "vpp" "bnp" "runp"
 Convert the logical block number
 .Fa bn

Index: src/sys/coda/coda_vnops.c
diff -u src/sys/coda/coda_vnops.c:1.71 src/sys/coda/coda_vnops.c:1.72
--- src/sys/coda/coda_vnops.c:1.71	Mon Nov 23 02:13:44 2009
+++ src/sys/coda/coda_vnops.c	Thu Jun 24 07:54:46 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: coda_vnops.c,v 1.71 2009/11/23 02:13:44 rmind Exp $	*/
+/*	$NetBSD: coda_vnops.c,v 1.72 2010/06/24 07:54:46 hannken Exp $	*/
 
 /*
  *
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.71 2009/11/23 02:13:44 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.72 2010/06/24 07:54:46 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2018,6 +2018,7 @@
 	 * lock, and if we should serialize getpages calls by some
 	 * mechanism.
 	 */
+	/* XXX VOP_ISLOCKED() may not be used for lock decisions. */
 	waslocked = VOP_ISLOCKED(vp);
 
 	/* Drop the vmobject lock. */

Index: src/sys/fs/nilfs/nilfs_vnops.c
diff -u src/sys/fs/nilfs/nilfs_vnops.c:1.4 src/sys/fs/nilfs/nilfs_vnops.c:1.5
--- src/sys/fs/nilfs/nilfs_vnops.c:1.4	Fri Jan  8 11:35:08 2010
+++ src/sys/fs/nilfs/nilfs_vnops.c	Thu Jun 24 07:54:46 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: nilfs_vnops.c,v 1.4 2010/01/08 11:35:08 pooka Exp $ */
+/* $NetBSD: nilfs_vnops.c,v 1.5 2010/06/24 07:54:46 hannken Exp $ */
 
 /*
  * Copyright (c) 2008, 2009 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.4 2010/01/08 11:35:08 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.5 2010/06/24 07:54:46 hannken Exp $");
 #endif /* not lint */
 
 
@@ -1161,14 +1161,22 @@
 	nilfs_node = VTOI(vp);
 
 	error = VOP_GETATTR(vp, &vap, FSCRED);
-	if (error)
+	if (error) {
+		VOP_UNLOCK(vp, 0);
 		return error;
+	}
 
 	/* check link count overflow */
-	if (vap.va_nlink >= (1<<16)-1)	/* uint16_t */
+	if (vap.va_nlink >= (1<<16)-1) {	/* uint16_t */
+		VOP_UNLOCK(vp, 0);
 		return EMLINK;
+	}
 
-	return nilfs_dir_attach(dir_node->ump, dir_node, nilfs_node, &vap, cnp);
+	error = nilfs_dir_attach(dir_node->ump, dir_node, nilfs_node,
+	    &vap, cnp);
+	if (error)
+		VOP_UNLOCK(vp, 0);
+	return error;
 }
 
 int
@@ -1188,9 +1196,6 @@
 	if (error)
 		VOP_ABORTOP(dvp, cnp);
 
-	if ((vp != dvp) && (VOP_ISLOCKED(vp) == LK_EXCLUSIVE))
-		VOP_UNLOCK(vp, 0);
-
 	VN_KNOTE(vp, NOTE_LINK);
 	VN_KNOTE(dvp, NOTE_WRITE);
 	vput(dvp);

Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.57 src/sys/fs/udf/udf_vnops.c:1.58
--- src/sys/fs/udf/udf_vnops.c:1.57	Fri Jan  8 11:35:09 2010
+++ src/sys/fs/udf/udf_vnops.c	Thu Jun 24 07:54:46 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.57 2010/01/08 11:35:09 pooka Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.58 2010/06/24 07:54:46 hannken Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.57 2010/01/08 11:35:09 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.58 2010/06/24 07:54:46 hannken Exp $");
 #endif /* not lint */
 
 
@@ -1509,14 +1509,21 @@
 	udf_node = VTOI(vp);
 
 	error = VOP_GETATTR(vp, &vap, FSCRED);
-	if (error)
+	if (error) {
+		VOP_UNLOCK(vp, 0);
 		return error;
+	}
 
 	/* check link count overflow */
-	if (vap.va_nlink >= (1<<16)-1)	/* uint16_t */
+	if (vap.va_nlink >= (1<<16)-1) {	/* uint16_t */
+		VOP_UNLOCK(vp, 0);
 		return EMLINK;
+	}
 
-	return udf_dir_attach(dir_node->ump, dir_node, udf_node, &vap, cnp);
+	error = udf_dir_attach(dir_node->ump, dir_node, udf_node, &vap, cnp);
+	if (error)
+		VOP_UNLOCK(vp, 0);
+	return error;
 }
 
 int
@@ -1536,9 +1543,6 @@
 	if (error)
 		VOP_ABORTOP(dvp, cnp);
 
-	if ((vp != dvp) && (VOP_ISLOCKED(vp) == LK_EXCLUSIVE))
-		VOP_UNLOCK(vp, 0);
-
 	VN_KNOTE(vp, NOTE_LINK);
 	VN_KNOTE(dvp, NOTE_WRITE);
 	vput(dvp);

Index: src/sys/fs/unionfs/unionfs_subr.c
diff -u src/sys/fs/unionfs/unionfs_subr.c:1.7 src/sys/fs/unionfs/unionfs_subr.c:1.8
--- src/sys/fs/unionfs/unionfs_subr.c:1.7	Fri Jun 18 16:29:01 2010
+++ src/sys/fs/unionfs/unionfs_subr.c	Thu Jun 24 07:54:46 2010
@@ -484,7 +484,7 @@
 	 */
 	mutex_enter(&vp->v_interlock);
 	unp->un_uppervp = uvp;
-	KASSERT(rw_write_held(&lvp->v_lock.vl_lock));
+	KASSERT(VOP_ISLOCKED(lvp) == LK_EXCLUSIVE);
 	mutex_exit(&vp->v_interlock);
 }
 

Index: src/sys/fs/unionfs/unionfs_vnops.c
diff -u src/sys/fs/unionfs/unionfs_vnops.c:1.1 src/sys/fs/unionfs/unionfs_vnops.c:1.2
--- src/sys/fs/unionfs/unionfs_vnops.c:1.1	Mon Feb 18 16:44:22 2008
+++ src/sys/fs/unionfs/unionfs_vnops.c	Thu Jun 24 07:54:46 2010
@@ -471,7 +471,6 @@
 {
 	struct vop_close_args *ap = v;
 	int		error;
-	int		locked;
 	struct unionfs_node *unp;
 	struct unionfs_node_status *unsp;
 	kauth_cred_t   cred;
@@ -479,14 +478,10 @@
 
 	UNIONFS_INTERNAL_DEBUG("unionfs_close: enter\n");
 
-	locked = 0;
+	KASSERT(VOP_ISLOCKED(ap->a_vp) == LK_EXCLUSIVE);
 	unp = VTOUNIONFS(ap->a_vp);
 	cred = ap->a_cred;
 
-	if (VOP_ISLOCKED(ap->a_vp) != LK_EXCLUSIVE) {
-		vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
-		locked = 1;
-	}
 	unionfs_get_node_status(unp, &unsp);
 
 	if (unsp->uns_lower_opencnt <= 0 && unsp->uns_upper_opencnt <= 0) {
@@ -522,9 +517,6 @@
 unionfs_close_abort:
 	unionfs_tryrem_node_status(unp, unsp);
 
-	if (locked != 0)
-		VOP_UNLOCK(ap->a_vp, 0);
-
 	UNIONFS_INTERNAL_DEBUG("unionfs_close: leave (%d)\n", error);
 
 	return (error);
@@ -1538,11 +1530,6 @@
 	flags = ap->a_flags;
 	error = 0;
 
-	if ((flags & LK_INTERLOCK) != 0) {
-		mutex_exit(&ap->a_vp->v_interlock);
-		flags &= ~LK_INTERLOCK;
-	}
-
 	if (lvp != NULLVP) {
 		error = VOP_LOCK(lvp, flags);
 	}

Index: src/sys/kern/vfs_subr.c
diff -u src/sys/kern/vfs_subr.c:1.405 src/sys/kern/vfs_subr.c:1.406
--- src/sys/kern/vfs_subr.c:1.405	Fri Jun 18 16:29:02 2010
+++ src/sys/kern/vfs_subr.c	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_subr.c,v 1.405 2010/06/18 16:29:02 hannken Exp $	*/
+/*	$NetBSD: vfs_subr.c,v 1.406 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.405 2010/06/18 16:29:02 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.406 2010/06/24 07:54:47 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -347,15 +347,8 @@
 		}
 		if (!mutex_tryenter(&vp->v_interlock))
 			continue;
-		/*
-		 * Our lwp might hold the underlying vnode
-		 * locked, so don't try to reclaim a VI_LAYER
-		 * node if it's locked.
-		 */
-		if ((vp->v_iflag & VI_XLOCK) == 0 &&
-		    ((vp->v_iflag & VI_LAYER) == 0 || VOP_ISLOCKED(vp) == 0)) {
+		if ((vp->v_iflag & VI_XLOCK) == 0)
 			break;
-		}
 		mutex_exit(&vp->v_interlock);
 	}
 
@@ -1901,7 +1894,8 @@
 	active = (vp->v_usecount > 1);
 
 	/* XXXAD should not lock vnode under layer */
-	VOP_LOCK(vp, LK_EXCLUSIVE | LK_INTERLOCK);
+	mutex_exit(&vp->v_interlock);
+	VOP_LOCK(vp, LK_EXCLUSIVE);
 
 	/*
 	 * Clean out any cached data associated with the vnode.

Index: src/sys/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.178 src/sys/miscfs/genfs/genfs_vnops.c:1.179
--- src/sys/miscfs/genfs/genfs_vnops.c:1.178	Sun Jun  6 08:01:31 2010
+++ src/sys/miscfs/genfs/genfs_vnops.c	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_vnops.c,v 1.178 2010/06/06 08:01:31 hannken Exp $	*/
+/*	$NetBSD: genfs_vnops.c,v 1.179 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.178 2010/06/06 08:01:31 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.179 2010/06/24 07:54:47 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -289,11 +289,6 @@
 	struct vnode *vp = ap->a_vp;
 	int flags = ap->a_flags;
 
-	if ((flags & LK_INTERLOCK) != 0) {
-		flags &= ~LK_INTERLOCK;
-		mutex_exit(&vp->v_interlock);
-	}
-
 	return (vlockmgr(&vp->v_lock, flags));
 }
 

Index: src/sys/nfs/nfs_vfsops.c
diff -u src/sys/nfs/nfs_vfsops.c:1.212 src/sys/nfs/nfs_vfsops.c:1.213
--- src/sys/nfs/nfs_vfsops.c:1.212	Sat May 15 20:24:57 2010
+++ src/sys/nfs/nfs_vfsops.c	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_vfsops.c,v 1.212 2010/05/15 20:24:57 dholland Exp $	*/
+/*	$NetBSD: nfs_vfsops.c,v 1.213 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993, 1995
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.212 2010/05/15 20:24:57 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_vfsops.c,v 1.213 2010/06/24 07:54:47 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_nfs.h"
@@ -965,14 +965,19 @@
 			continue;
 		mutex_enter(&vp->v_interlock);
 		/* XXX MNT_LAZY cannot be right? */
-		if (waitfor == MNT_LAZY || VOP_ISLOCKED(vp) ||
+		if (waitfor == MNT_LAZY ||
 		    (LIST_EMPTY(&vp->v_dirtyblkhd) &&
 		     UVM_OBJ_IS_CLEAN(&vp->v_uobj))) {
 			mutex_exit(&vp->v_interlock);
 			continue;
 		}
 		mutex_exit(&mntvnode_lock);
-		if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK)) {
+		error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK);
+		if (error != 0) {
+			if (error != ENOENT) {
+				mutex_enter(&mntvnode_lock);
+				continue;
+			}
 			(void)vunmark(mvp);
 			goto loop;
 		}

Index: src/sys/sys/lock.h
diff -u src/sys/sys/lock.h:1.84 src/sys/sys/lock.h:1.85
--- src/sys/sys/lock.h:1.84	Fri Jun 18 16:29:02 2010
+++ src/sys/sys/lock.h	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: lock.h,v 1.84 2010/06/18 16:29:02 hannken Exp $	*/
+/*	$NetBSD: lock.h,v 1.85 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2006, 2007 The NetBSD Foundation, Inc.
@@ -77,7 +77,6 @@
 #define	LK_SHARED	0x00000001	/* shared lock */
 #define	LK_EXCLUSIVE	0x00000002	/* exclusive lock */
 #define	LK_RELEASE	0x00000006	/* release any type of lock */
-#define	LK_EXCLOTHER	0x00000008	/* other process holds lock */
 
 #define	LK_NOWAIT	0x00000010	/* do not sleep to await lock */
 #define	LK_INTERLOCK	0x00010000	/* unlock passed simple lock after

Index: src/sys/ufs/lfs/lfs_subr.c
diff -u src/sys/ufs/lfs/lfs_subr.c:1.74 src/sys/ufs/lfs/lfs_subr.c:1.75
--- src/sys/ufs/lfs/lfs_subr.c:1.74	Tue Feb 16 23:20:30 2010
+++ src/sys/ufs/lfs/lfs_subr.c	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_subr.c,v 1.74 2010/02/16 23:20:30 mlelstv Exp $	*/
+/*	$NetBSD: lfs_subr.c,v 1.75 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_subr.c,v 1.74 2010/02/16 23:20:30 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_subr.c,v 1.75 2010/06/24 07:54:47 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -361,9 +361,9 @@
 	for (ip = TAILQ_FIRST(&fs->lfs_dchainhd); ip != NULL; ip = nip) {
 		nip = TAILQ_NEXT(ip, i_lfs_dchain);
 		vp = ITOV(ip);
-		if (VOP_ISLOCKED(vp) == LK_EXCLOTHER)
-			continue;
 		if ((VTOI(vp)->i_flag & (IN_ADIROP | IN_ALLMOD)) == 0) {
+			if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_RETRY))
+				continue;
 			--lfs_dirvcount;
 			--fs->lfs_dirvcount;
 			vp->v_uflag &= ~VU_DIROP;
@@ -371,7 +371,7 @@
 			wakeup(&lfs_dirvcount);
 			fs->lfs_unlockvp = vp;
 			mutex_exit(&lfs_lock);
-			vrele(vp);
+			vput(vp);
 			mutex_enter(&lfs_lock);
 			fs->lfs_unlockvp = NULL;
 		}

Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.227 src/sys/ufs/lfs/lfs_vnops.c:1.228
--- src/sys/ufs/lfs/lfs_vnops.c:1.227	Mon Mar 29 13:11:34 2010
+++ src/sys/ufs/lfs/lfs_vnops.c	Thu Jun 24 07:54:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.227 2010/03/29 13:11:34 pooka Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.228 2010/06/24 07:54:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.227 2010/03/29 13:11:34 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.228 2010/06/24 07:54:47 hannken Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1227,7 +1227,6 @@
 	struct vnode *vp;
 	extern int lfs_dostats;
 	struct segment *sp;
-	int waslocked;
 
 	ASSERT_MAYBE_SEGLOCK(fs);
 	KASSERT(fs->lfs_nadirop == 0);
@@ -1289,7 +1288,9 @@
 			mutex_enter(&lfs_lock);
 			continue;
 		}
-		waslocked = VOP_ISLOCKED(vp);
+		/* XXX see below
+		 * waslocked = VOP_ISLOCKED(vp);
+		 */
 		if (vp->v_type != VREG &&
 		    ((ip->i_flag & IN_ALLMOD) || !VPISEMPTY(vp))) {
 			lfs_writefile(fs, sp, vp);
@@ -1303,8 +1304,12 @@
 		KDASSERT(ip->i_number != LFS_IFILE_INUM);
 		(void) lfs_writeinode(fs, sp, ip);
 		mutex_enter(&lfs_lock);
-		if (waslocked == LK_EXCLOTHER)
-			LFS_SET_UINO(ip, IN_MODIFIED);
+		/*
+		 * XXX
+		 * LK_EXCLOTHER is dead -- what is intended here?
+		 * if (waslocked == LK_EXCLOTHER)
+		 *	LFS_SET_UINO(ip, IN_MODIFIED);
+		 */
 	}
 	mutex_exit(&lfs_lock);
 	/* We've written all the dirops there are */
@@ -1383,7 +1388,7 @@
 			continue;
 		mutex_exit(&lfs_lock);
 
-		if (VOP_ISLOCKED(vp)) {
+		if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_RETRY) != 0) {
 			lfs_vunref(vp);
 			mutex_enter(&lfs_lock);
 			continue;
@@ -1399,6 +1404,7 @@
 		KDASSERT(ip->i_number != LFS_IFILE_INUM);
 		(void) lfs_writeinode(fs, sp, ip);
 
+		VOP_UNLOCK(vp, 0);
 		lfs_vunref(vp);
 
 		if (error == EAGAIN) {
@@ -2208,6 +2214,7 @@
 		int locked;
 
 		DLOG((DLOG_PAGE, "lfs_putpages: flushing VU_DIROP\n"));
+		/* XXX VOP_ISLOCKED() may not be used for lock decisions. */
 		locked = (VOP_ISLOCKED(vp) == LK_EXCLUSIVE);
 		mutex_exit(&vp->v_interlock);
 		lfs_writer_enter(fs, "ppdirop");
@@ -2218,11 +2225,9 @@
 		lfs_flush_fs(fs, sync ? SEGM_SYNC : 0);
 		mutex_exit(&lfs_lock);
 
+		if (locked)
+			VOP_LOCK(vp, LK_EXCLUSIVE);
 		mutex_enter(&vp->v_interlock);
-		if (locked) {
-			VOP_LOCK(vp, LK_EXCLUSIVE | LK_INTERLOCK);
-			mutex_enter(&vp->v_interlock);
-		}
 		lfs_writer_leave(fs);
 
 		/* XXX the flush should have taken care of this one too! */

Reply via email to