diff options
-rw-r--r-- | sys/kern/vfs_vnops.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 601f3f2..2a07f66 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1549,28 +1549,21 @@ _vn_lock(struct vnode *vp, int flags, char *file, int line) int error; VNASSERT((flags & LK_TYPE_MASK) != 0, vp, - ("vn_lock called with no locktype.")); - do { -#ifdef DEBUG_VFS_LOCKS - KASSERT(vp->v_holdcnt != 0, - ("vn_lock %p: zero hold count", vp)); -#endif - error = VOP_LOCK1(vp, flags, file, line); - flags &= ~LK_INTERLOCK; /* Interlock is always dropped. */ - KASSERT((flags & LK_RETRY) == 0 || error == 0, - ("LK_RETRY set with incompatible flags (0x%x) or an error occurred (%d)", - flags, error)); - /* - * Callers specify LK_RETRY if they wish to get dead vnodes. - * If RETRY is not set, we return ENOENT instead. - */ - if (error == 0 && vp->v_iflag & VI_DOOMED && - (flags & LK_RETRY) == 0) { + ("vn_lock: no locktype")); + VNASSERT(vp->v_holdcnt != 0, vp, ("vn_lock: zero hold count")); +retry: + error = VOP_LOCK1(vp, flags, file, line); + flags &= ~LK_INTERLOCK; /* Interlock is always dropped. */ + KASSERT((flags & LK_RETRY) == 0 || error == 0, + ("vn_lock: error %d incompatible with flags %#x", error, flags)); + + if ((flags & LK_RETRY) == 0) { + if (error == 0 && (vp->v_iflag & VI_DOOMED) != 0) { VOP_UNLOCK(vp, 0); error = ENOENT; - break; } - } while (flags & LK_RETRY && error != 0); + } else if (error != 0) + goto retry; return (error); } @@ -1578,9 +1571,7 @@ _vn_lock(struct vnode *vp, int flags, char *file, int line) * File table vnode close routine. */ static int -vn_closefile(fp, td) - struct file *fp; - struct thread *td; +vn_closefile(struct file *fp, struct thread *td) { struct vnode *vp; struct flock lf; |