summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/vfs_vnops.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 2f085d9..0008209 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1292,15 +1292,17 @@ vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp)
ltype = VOP_ISLOCKED(vp);
KASSERT(ltype == LK_EXCLUSIVE || ltype == LK_SHARED,
("vn_vget_ino: vp not locked"));
- for (;;) {
- error = vfs_busy(mp, MBF_NOWAIT);
- if (error == 0)
- break;
+ error = vfs_busy(mp, MBF_NOWAIT);
+ if (error != 0) {
VOP_UNLOCK(vp, 0);
- pause("vn_vget", 1);
+ error = vfs_busy(mp, 0);
vn_lock(vp, ltype | LK_RETRY);
- if (vp->v_iflag & VI_DOOMED)
+ if (error != 0)
return (ENOENT);
+ if (vp->v_iflag & VI_DOOMED) {
+ vfs_unbusy(mp);
+ return (ENOENT);
+ }
}
VOP_UNLOCK(vp, 0);
error = VFS_VGET(mp, ino, lkflags, rvp);
OpenPOWER on IntegriCloud