Index: kern/vfs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/kern/vfs_vnops.c,v retrieving revision 1.258 diff -u -p -r1.258 vfs_vnops.c --- kern/vfs_vnops.c 13 Jan 2008 14:44:11 -0000 1.258 +++ kern/vfs_vnops.c 23 Mar 2008 02:23:41 -0000 @@ -862,27 +862,21 @@ _vn_lock(struct vnode *vp, int flags, ch { int error; - do { + /* + * With no lock type requested we're just polling for validity. + */ + if ((flags & LK_TYPE_MASK) == 0) { + error = 0; if ((flags & LK_INTERLOCK) == 0) VI_LOCK(vp); - if ((flags & LK_NOWAIT || (flags & LK_TYPE_MASK) == 0) && - vp->v_iflag & VI_DOOMED) { - VI_UNLOCK(vp); - return (ENOENT); - } - /* - * Just polling to check validity. - */ - if ((flags & LK_TYPE_MASK) == 0) { - VI_UNLOCK(vp); - return (0); - } - /* - * lockmgr drops interlock before it will return for - * any reason. So force the code above to relock it. - */ - error = VOP_LOCK1(vp, flags | LK_INTERLOCK, file, line); - flags &= ~LK_INTERLOCK; + if (vp->v_iflag & VI_DOOMED) + error = ENOENT; + VI_UNLOCK(vp); + return (error); + } + do { + 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 %d\n", flags)); /* Index: ufs/ffs/ffs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_vnops.c,v retrieving revision 1.181 diff -u -p -r1.181 ffs_vnops.c --- ufs/ffs/ffs_vnops.c 22 Mar 2008 09:15:16 -0000 1.181 +++ ufs/ffs/ffs_vnops.c 23 Mar 2008 02:23:41 -0000 @@ -361,16 +361,6 @@ ffs_lock(ap) vp = ap->a_vp; flags = ap->a_flags; for (;;) { - /* - * vnode interlock must be held to ensure that - * the possibly external lock isn't freed, - * e.g. when mutating from snapshot file vnode - * to regular file vnode. - */ - if ((flags & LK_INTERLOCK) == 0) { - VI_LOCK(vp); - flags |= LK_INTERLOCK; - } lkp = vp->v_vnlock; result = _lockmgr_args(lkp, flags, VI_MTX(vp), LK_WMESG_DEFAULT, LK_PRIO_DEFAULT, LK_TIMO_DEFAULT, @@ -390,7 +380,6 @@ ffs_lock(ap) ap->a_file, ap->a_line); if ((flags & LK_TYPE_MASK) == LK_UPGRADE) flags = (flags & ~LK_TYPE_MASK) | LK_EXCLUSIVE; - flags &= ~LK_INTERLOCK; } break; default: