svn commit: r191895 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Thu May 7 18:14:23 UTC 2009
Author: kib
Date: Thu May 7 18:14:21 2009
New Revision: 191895
URL: http://svn.freebsd.org/changeset/base/191895
Log:
Eliminate the loop and the call to pause(9) in vfs_vget_ino(). If
vfs_busy(MBF_NOWAIT) failed, unlock the vnode and sleep in vfs_busy().
Suggested and reviewed by: jeff
Tested by: pho
MFC after: 3 weeks
Modified:
head/sys/kern/vfs_vnops.c
Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c Thu May 7 18:03:47 2009 (r191894)
+++ head/sys/kern/vfs_vnops.c Thu May 7 18:14:21 2009 (r191895)
@@ -1292,15 +1292,17 @@ vn_vget_ino(struct vnode *vp, ino_t ino,
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);
More information about the svn-src-all
mailing list