diff options
| -rw-r--r-- | sys/kern/vfs_subr.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index c9016d1810f1..c10842a2cfad 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1908,6 +1908,7 @@ vput(vp) struct thread *td = curthread; /* XXX */ KASSERT(vp != NULL, ("vput: null vp")); + ASSERT_VOP_LOCKED(vp, "vput"); VI_LOCK(vp); /* Skip this v_writecount check if we're going to panic below. */ VNASSERT(vp->v_writecount < vp->v_usecount || vp->v_usecount < 1, vp, @@ -1920,26 +1921,24 @@ vput(vp) return; } - if (vp->v_usecount == 1) { - v_incr_usecount(vp, -1); - if (VOP_ISLOCKED(vp, td) != LK_EXCLUSIVE && - VOP_LOCK(vp, LK_EXCLUPGRADE, td) != 0) - vp->v_iflag |= VI_OWEINACT; - else - vinactive(vp, td); - VOP_UNLOCK(vp, 0, td); - if (VSHOULDFREE(vp)) - vfree(vp); - else - vlruvp(vp); - VI_UNLOCK(vp); - - } else { + if (vp->v_usecount != 1) { #ifdef DIAGNOSTIC vprint("vput: negative ref count", vp); #endif panic("vput: negative ref cnt"); } + v_incr_usecount(vp, -1); + if (VOP_ISLOCKED(vp, td) != LK_EXCLUSIVE && + VOP_LOCK(vp, LK_EXCLUPGRADE, td) != 0) + vp->v_iflag |= VI_OWEINACT; + else + vinactive(vp, td); + VOP_UNLOCK(vp, 0, td); + if (VSHOULDFREE(vp)) + vfree(vp); + else + vlruvp(vp); + VI_UNLOCK(vp); } /* |
