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