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); }