Module Name:    src
Committed By:   riastradh
Date:           Mon Apr 20 13:44:16 UTC 2015

Modified Files:
        src/sys/fs/adosfs: advfsops.c
        src/sys/fs/tmpfs: tmpfs_subr.c
        src/sys/fs/udf: udf_subr.c
        src/sys/fs/union: union_subr.c
        src/sys/kern: vfs_cache.c vfs_mount.c vfs_vnode.c
        src/sys/miscfs/specfs: spec_vnops.c
        src/sys/miscfs/syncfs: sync_subr.c
        src/sys/sys: vnode.h
        src/sys/ufs/lfs: lfs_segment.c lfs_syscalls.c ulfs_ihash.c

Log Message:
Make vget always return vnode unlocked.

Convert callers who want locks to use vn_lock afterward.

Add extra argument so the compiler will report stragglers.


To generate a diff of this commit:
cvs rdiff -u -r1.73 -r1.74 src/sys/fs/adosfs/advfsops.c
cvs rdiff -u -r1.97 -r1.98 src/sys/fs/tmpfs/tmpfs_subr.c
cvs rdiff -u -r1.129 -r1.130 src/sys/fs/udf/udf_subr.c
cvs rdiff -u -r1.71 -r1.72 src/sys/fs/union/union_subr.c
cvs rdiff -u -r1.105 -r1.106 src/sys/kern/vfs_cache.c
cvs rdiff -u -r1.33 -r1.34 src/sys/kern/vfs_mount.c
cvs rdiff -u -r1.40 -r1.41 src/sys/kern/vfs_vnode.c
cvs rdiff -u -r1.146 -r1.147 src/sys/miscfs/specfs/spec_vnops.c
cvs rdiff -u -r1.49 -r1.50 src/sys/miscfs/syncfs/sync_subr.c
cvs rdiff -u -r1.251 -r1.252 src/sys/sys/vnode.h
cvs rdiff -u -r1.237 -r1.238 src/sys/ufs/lfs/lfs_segment.c
cvs rdiff -u -r1.156 -r1.157 src/sys/ufs/lfs/lfs_syscalls.c
cvs rdiff -u -r1.4 -r1.5 src/sys/ufs/lfs/ulfs_ihash.c

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

Modified files:

Index: src/sys/fs/adosfs/advfsops.c
diff -u src/sys/fs/adosfs/advfsops.c:1.73 src/sys/fs/adosfs/advfsops.c:1.74
--- src/sys/fs/adosfs/advfsops.c:1.73	Sat Mar 28 19:24:05 2015
+++ src/sys/fs/adosfs/advfsops.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: advfsops.c,v 1.73 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: advfsops.c,v 1.74 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1994 Christian E. Hopps
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.73 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.74 2015/04/20 13:44:16 riastradh Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -364,7 +364,7 @@ adosfs_statvfs(struct mount *mp, struct 
 
 /*
  * lookup an anode, if not found, create
- * return locked and referenced al la vget(vp, LK_EXCLUSIVE);
+ * return locked and referenced
  */
 int
 adosfs_vget(struct mount *mp, ino_t an, struct vnode **vpp)

Index: src/sys/fs/tmpfs/tmpfs_subr.c
diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.97 src/sys/fs/tmpfs/tmpfs_subr.c:1.98
--- src/sys/fs/tmpfs/tmpfs_subr.c:1.97	Mon Sep  8 14:49:46 2014
+++ src/sys/fs/tmpfs/tmpfs_subr.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_subr.c,v 1.97 2014/09/08 14:49:46 gson Exp $	*/
+/*	$NetBSD: tmpfs_subr.c,v 1.98 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2005-2013 The NetBSD Foundation, Inc.
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.97 2014/09/08 14:49:46 gson Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.98 2015/04/20 13:44:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/cprng.h>
@@ -282,11 +282,12 @@ again:
 		atomic_or_32(&node->tn_gen, TMPFS_RECLAIMING_BIT);
 		mutex_enter(vp->v_interlock);
 		mutex_exit(&node->tn_vlock);
-		error = vget(vp, LK_EXCLUSIVE);
+		error = vget(vp, 0, true /* wait */);
 		if (error == ENOENT) {
 			mutex_enter(&node->tn_vlock);
 			goto again;
 		}
+		vn_lock(vp, LK_EXCLUSIVE);
 		atomic_and_32(&node->tn_gen, ~TMPFS_RECLAIMING_BIT);
 		*vpp = vp;
 		return error;

Index: src/sys/fs/udf/udf_subr.c
diff -u src/sys/fs/udf/udf_subr.c:1.129 src/sys/fs/udf/udf_subr.c:1.130
--- src/sys/fs/udf/udf_subr.c:1.129	Mon Apr  6 08:39:23 2015
+++ src/sys/fs/udf/udf_subr.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_subr.c,v 1.129 2015/04/06 08:39:23 hannken Exp $ */
+/* $NetBSD: udf_subr.c,v 1.130 2015/04/20 13:44:16 riastradh Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.129 2015/04/06 08:39:23 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.130 2015/04/20 13:44:16 riastradh Exp $");
 #endif /* not lint */
 
 
@@ -6361,7 +6361,7 @@ derailed:
 		}
 
 		mutex_exit(&mntvnode_lock);
-		error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT);
+		error = vget(vp, LK_NOWAIT, false /* !wait */);
 		if (error) {
 			mutex_enter(&mntvnode_lock);
 			if (error == ENOENT)
@@ -6369,6 +6369,14 @@ derailed:
 			*ndirty += 1;
 			continue;
 		}
+		error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
+		if (error) {
+			KASSERT(error == EBUSY);
+			vrele(vp);
+			mutex_enter(&mntvnode_lock);
+			*ndirty += 1;
+			continue;
+		}
 
 		switch (pass) {
 		case 1:

Index: src/sys/fs/union/union_subr.c
diff -u src/sys/fs/union/union_subr.c:1.71 src/sys/fs/union/union_subr.c:1.72
--- src/sys/fs/union/union_subr.c:1.71	Tue Feb 24 16:08:01 2015
+++ src/sys/fs/union/union_subr.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: union_subr.c,v 1.71 2015/02/24 16:08:01 hannken Exp $	*/
+/*	$NetBSD: union_subr.c,v 1.72 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*
  * Copyright (c) 1994
@@ -72,7 +72,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.71 2015/02/24 16:08:01 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.72 2015/04/20 13:44:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -991,7 +991,7 @@ union_lowervp(struct vnode *vp)
 
 	if ((un->un_lowervp != NULLVP) &&
 	    (vp->v_type == un->un_lowervp->v_type)) {
-		if (vget(un->un_lowervp, 0) == 0)
+		if (vget(un->un_lowervp, 0, true /* wait */) == 0)
 			return (un->un_lowervp);
 	}
 

Index: src/sys/kern/vfs_cache.c
diff -u src/sys/kern/vfs_cache.c:1.105 src/sys/kern/vfs_cache.c:1.106
--- src/sys/kern/vfs_cache.c:1.105	Fri Jan 16 20:10:25 2015
+++ src/sys/kern/vfs_cache.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_cache.c,v 1.105 2015/01/16 20:10:25 dennis Exp $	*/
+/*	$NetBSD: vfs_cache.c,v 1.106 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.105 2015/01/16 20:10:25 dennis Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_cache.c,v 1.106 2015/04/20 13:44:16 riastradh Exp $");
 
 #include "opt_ddb.h"
 #include "opt_revcache.h"
@@ -555,7 +555,7 @@ cache_lookup(struct vnode *dvp, const ch
 	/*
 	 * Unlocked except for the vnode interlock.  Call vget().
 	 */
-	error = vget(vp, LK_NOWAIT);
+	error = vget(vp, LK_NOWAIT, false /* !wait */);
 	if (error) {
 		KASSERT(error == EBUSY);
 		/*
@@ -636,7 +636,7 @@ cache_lookup_raw(struct vnode *dvp, cons
 	/*
 	 * Unlocked except for the vnode interlock.  Call vget().
 	 */
-	error = vget(vp, LK_NOWAIT);
+	error = vget(vp, LK_NOWAIT, false /* !wait */);
 	if (error) {
 		KASSERT(error == EBUSY);
 		/*
@@ -724,7 +724,7 @@ cache_revlookup(struct vnode *vp, struct
 			mutex_enter(dvp->v_interlock);
 			mutex_exit(&ncp->nc_lock); 
 			mutex_exit(namecache_lock);
-			error = vget(dvp, LK_NOWAIT);
+			error = vget(dvp, LK_NOWAIT, false /* !wait */);
 			if (error) {
 				KASSERT(error == EBUSY);
 				if (bufp)

Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.33 src/sys/kern/vfs_mount.c:1.34
--- src/sys/kern/vfs_mount.c:1.33	Mon Mar  9 15:35:11 2015
+++ src/sys/kern/vfs_mount.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_mount.c,v 1.33 2015/03/09 15:35:11 pooka Exp $	*/
+/*	$NetBSD: vfs_mount.c,v 1.34 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.33 2015/03/09 15:35:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.34 2015/04/20 13:44:16 riastradh Exp $");
 
 #define _VFS_VNODE_PRIVATE
 
@@ -404,7 +404,7 @@ again:
 		TAILQ_INSERT_AFTER(&mp->mnt_vnodelist, vp, mvp, v_mntvnodes);
 		mvp->v_usecount = 1;
 		mutex_exit(&mntvnode_lock);
-		error = vget(vp, 0);
+		error = vget(vp, 0, true /* wait */);
 		KASSERT(error == 0 || error == ENOENT);
 	} while (error != 0);
 

Index: src/sys/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.40 src/sys/kern/vfs_vnode.c:1.41
--- src/sys/kern/vfs_vnode.c:1.40	Tue Mar 17 09:38:21 2015
+++ src/sys/kern/vfs_vnode.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnode.c,v 1.40 2015/03/17 09:38:21 hannken Exp $	*/
+/*	$NetBSD: vfs_vnode.c,v 1.41 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -116,7 +116,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.40 2015/03/17 09:38:21 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.41 2015/04/20 13:44:16 riastradh Exp $");
 
 #define _VFS_VNODE_PRIVATE
 
@@ -518,13 +518,14 @@ vremfree(vnode_t *vp)
  * vnode is no longer usable.
  */
 int
-vget(vnode_t *vp, int flags)
+vget(vnode_t *vp, int flags, bool waitok)
 {
 	int error = 0;
 
 	KASSERT((vp->v_iflag & VI_MARKER) == 0);
 	KASSERT(mutex_owned(vp->v_interlock));
-	KASSERT((flags & ~(LK_SHARED|LK_EXCLUSIVE|LK_NOWAIT)) == 0);
+	KASSERT((flags & ~LK_NOWAIT) == 0);
+	KASSERT(waitok == ((flags & LK_NOWAIT) == 0));
 
 	/*
 	 * Before adding a reference, we must remove the vnode
@@ -555,16 +556,10 @@ vget(vnode_t *vp, int flags)
 	}
 
 	/*
-	 * Ok, we got it in good shape.  Just locking left.
+	 * Ok, we got it in good shape.
 	 */
 	KASSERT((vp->v_iflag & VI_CLEAN) == 0);
 	mutex_exit(vp->v_interlock);
-	if (flags & (LK_EXCLUSIVE | LK_SHARED)) {
-		error = vn_lock(vp, flags);
-		if (error != 0) {
-			vrele(vp);
-		}
-	}
 	return error;
 }
 
@@ -1247,7 +1242,7 @@ again:
 		vp = node->vn_vnode;
 		mutex_enter(vp->v_interlock);
 		mutex_exit(&vcache.lock);
-		error = vget(vp, 0);
+		error = vget(vp, 0, true /* wait */);
 		if (error == ENOENT)
 			goto again;
 		if (error == 0)

Index: src/sys/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.146 src/sys/miscfs/specfs/spec_vnops.c:1.147
--- src/sys/miscfs/specfs/spec_vnops.c:1.146	Sat Mar 28 19:24:06 2015
+++ src/sys/miscfs/specfs/spec_vnops.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: spec_vnops.c,v 1.146 2015/03/28 19:24:06 maxv Exp $	*/
+/*	$NetBSD: spec_vnops.c,v 1.147 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.146 2015/03/28 19:24:06 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.147 2015/04/20 13:44:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -309,7 +309,7 @@ spec_node_lookup_by_dev(enum vtype type,
 		mutex_enter(vp->v_interlock);
 	}
 	mutex_exit(&device_lock);
-	error = vget(vp, 0);
+	error = vget(vp, 0, true /* wait */);
 	if (error != 0)
 		return error;
 	*vpp = vp;
@@ -344,7 +344,7 @@ spec_node_lookup_by_mount(struct mount *
 	}
 	mutex_enter(vq->v_interlock);
 	mutex_exit(&device_lock);
-	error = vget(vq, 0);
+	error = vget(vq, 0, true /* wait */);
 	if (error != 0)
 		return error;
 	*vpp = vq;

Index: src/sys/miscfs/syncfs/sync_subr.c
diff -u src/sys/miscfs/syncfs/sync_subr.c:1.49 src/sys/miscfs/syncfs/sync_subr.c:1.50
--- src/sys/miscfs/syncfs/sync_subr.c:1.49	Tue Feb 25 18:30:11 2014
+++ src/sys/miscfs/syncfs/sync_subr.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_subr.c,v 1.49 2014/02/25 18:30:11 pooka Exp $	*/
+/*	$NetBSD: sync_subr.c,v 1.50 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sync_subr.c,v 1.49 2014/02/25 18:30:11 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sync_subr.c,v 1.50 2015/04/20 13:44:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -239,11 +239,17 @@ sched_sync(void *arg)
 			synced = false;
 			if (mutex_tryenter(vp->v_interlock)) {
 				mutex_exit(&syncer_data_lock);
-				if (vget(vp, LK_EXCLUSIVE | LK_NOWAIT) == 0) {
-					synced = true;
-					(void) VOP_FSYNC(vp, curlwp->l_cred,
-					    FSYNC_LAZY, 0, 0);
-					vput(vp);
+				if (vget(vp, LK_NOWAIT, false /* !wait */)
+				    == 0) {
+					if (vn_lock(vp, LK_EXCLUSIVE|LK_NOWAIT)
+					    == 0) {
+						synced = true;
+						(void) VOP_FSYNC(vp,
+						    curlwp->l_cred, FSYNC_LAZY,
+						    0, 0);
+						VOP_UNLOCK(vp);
+					}
+					vrele(vp);
 				}
 				mutex_enter(&syncer_data_lock);
 			}

Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.251 src/sys/sys/vnode.h:1.252
--- src/sys/sys/vnode.h:1.251	Mon Apr 20 13:12:24 2015
+++ src/sys/sys/vnode.h	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnode.h,v 1.251 2015/04/20 13:12:24 riastradh Exp $	*/
+/*	$NetBSD: vnode.h,v 1.252 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -533,7 +533,7 @@ void	vdevgone(int, int, int, enum vtype)
 int	vfinddev(dev_t, enum vtype, struct vnode **);
 int	vflush(struct mount *, struct vnode *, int);
 int	vflushbuf(struct vnode *, int);
-int 	vget(struct vnode *, int);
+int 	vget(struct vnode *, int, bool);
 void 	vgone(struct vnode *);
 int	vinvalbuf(struct vnode *, int, kauth_cred_t, struct lwp *, bool, int);
 void	vprint(const char *, struct vnode *);

Index: src/sys/ufs/lfs/lfs_segment.c
diff -u src/sys/ufs/lfs/lfs_segment.c:1.237 src/sys/ufs/lfs/lfs_segment.c:1.238
--- src/sys/ufs/lfs/lfs_segment.c:1.237	Sat Mar 28 19:24:05 2015
+++ src/sys/ufs/lfs/lfs_segment.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_segment.c,v 1.237 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: lfs_segment.c,v 1.238 2015/04/20 13:44:16 riastradh 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_segment.c,v 1.237 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.238 2015/04/20 13:44:16 riastradh Exp $");
 
 #define _VFS_VNODE_PRIVATE	/* XXX: check for VI_MARKER, this has to go */
 
@@ -2781,7 +2781,7 @@ lfs_vref(struct vnode *vp)
  		return 0;
  	}
 
-	return vget(vp, LK_NOWAIT);
+	return vget(vp, LK_NOWAIT, false /* !wait */);
 }
 
 /*

Index: src/sys/ufs/lfs/lfs_syscalls.c
diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.156 src/sys/ufs/lfs/lfs_syscalls.c:1.157
--- src/sys/ufs/lfs/lfs_syscalls.c:1.156	Sat Mar 28 19:24:05 2015
+++ src/sys/ufs/lfs/lfs_syscalls.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_syscalls.c,v 1.156 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: lfs_syscalls.c,v 1.157 2015/04/20 13:44:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.156 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.157 2015/04/20 13:44:16 riastradh Exp $");
 
 #ifndef LFS
 # define LFS		/* for prototypes in syscallargs.h */
@@ -714,7 +714,8 @@ lfs_bmapv(struct proc *p, fsid_t *fsidp,
 				lfs_vunref(vp);
 				if (VTOI(vp)->i_lfs_iflags & LFSI_BMAP) {
 					mutex_enter(vp->v_interlock);
-					if (vget(vp, LK_NOWAIT) == 0) {
+					if (vget(vp, LK_NOWAIT,
+						false /* !wait */) == 0) {
 						if (! vrecycle(vp))
 							vrele(vp);
 					}
@@ -832,7 +833,7 @@ lfs_bmapv(struct proc *p, fsid_t *fsidp,
 		/* Recycle as above. */
 		if (ip->i_lfs_iflags & LFSI_BMAP) {
 			mutex_enter(vp->v_interlock);
-			if (vget(vp, LK_NOWAIT) == 0) {
+			if (vget(vp, LK_NOWAIT, false /* !wait */) == 0) {
 				if (! vrecycle(vp))
 					vrele(vp);
 			}

Index: src/sys/ufs/lfs/ulfs_ihash.c
diff -u src/sys/ufs/lfs/ulfs_ihash.c:1.4 src/sys/ufs/lfs/ulfs_ihash.c:1.5
--- src/sys/ufs/lfs/ulfs_ihash.c:1.4	Thu Feb 27 16:51:39 2014
+++ src/sys/ufs/lfs/ulfs_ihash.c	Mon Apr 20 13:44:16 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_ihash.c,v 1.4 2014/02/27 16:51:39 hannken Exp $	*/
+/*	$NetBSD: ulfs_ihash.c,v 1.5 2015/04/20 13:44:16 riastradh Exp $	*/
 /*  from NetBSD: ufs_ihash.c,v 1.31 2011/06/12 03:36:02 rmind Exp  */
 
 /*
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_ihash.c,v 1.4 2014/02/27 16:51:39 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_ihash.c,v 1.5 2015/04/20 13:44:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -140,6 +140,8 @@ ulfs_ihashget(dev_t dev, ino_t inum, int
 	struct inode *ip;
 	struct vnode *vp;
 
+	KASSERT(flags == (flags & LK_EXCLUSIVE));
+
  loop:
 	mutex_enter(&ulfs_ihash_lock);
 	ipp = &ihashtbl[INOHASH(dev, inum)];
@@ -151,8 +153,14 @@ ulfs_ihashget(dev_t dev, ino_t inum, int
 			} else {
 				mutex_enter(vp->v_interlock);
 				mutex_exit(&ulfs_ihash_lock);
-				if (vget(vp, flags))
+				if (vget(vp, 0, true /* wait */) != 0)
 					goto loop;
+				if (flags & LK_EXCLUSIVE) {
+					if (vn_lock(vp, LK_EXCLUSIVE) != 0) {
+						vrele(vp);
+						goto loop;
+					}
+				}
 			}
 			return (vp);
 		}

Reply via email to