diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index f86bda2aa6f0..468310886ec0 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -3636,11 +3631,8 @@ vput_final(struct vnode *vp, enum vput_op func) break; case VPUT: want_unlock = true; - if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { - error = VOP_LOCK(vp, LK_UPGRADE | LK_INTERLOCK | - LK_NOWAIT); - VI_LOCK(vp); - } + error = VOP_LOCK(vp, LK_EXCLUSIVE | LK_INTERLOCK | LK_NOWAIT); + VI_LOCK(vp); break; case VUNREF: if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { @@ -3671,8 +3663,6 @@ vput_final(struct vnode *vp, enum vput_op func) } return; out: - if (func == VPUT) - VOP_UNLOCK(vp); vdropl(vp); } @@ -3709,10 +3699,9 @@ vput(struct vnode *vp) ASSERT_VOP_LOCKED(vp, __func__); ASSERT_VI_UNLOCKED(vp, __func__); - if (!refcount_release(&vp->v_usecount)) { - VOP_UNLOCK(vp); + VOP_UNLOCK(vp); + if (!refcount_release(&vp->v_usecount)) return; - } vput_final(vp, VPUT); }