summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-14 09:25:19 +0000
committerjeff <jeff@FreeBSD.org>2005-03-14 09:25:19 +0000
commit3fcb9112fb1915c98e275295e779c38aa7a0b32a (patch)
tree041dcebf7b2395ea0b4fe4cc8d7d94cafcae0642 /sys/kern/vfs_subr.c
parent41fb0028e9c567d939d26775ff018fa6d249aaff (diff)
downloadFreeBSD-src-3fcb9112fb1915c98e275295e779c38aa7a0b32a.zip
FreeBSD-src-3fcb9112fb1915c98e275295e779c38aa7a0b32a.tar.gz
- Increment the holdcnt once for each usecount reference. This allows us
to use only the holdcnt to determine whether a vnode may be recycled, simplifying the V* macros as well as vtryrecycle(), etc. Sponsored by: Isilon Systems, Inc.
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 97a52e4..8d0d6c2 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -745,7 +745,7 @@ vtryrecycle(struct vnode *vp)
* If someone ref'd the vnode while we were cleaning, we have to
* free it once the last ref is dropped.
*/
- if (vp->v_usecount || vp->v_holdcnt)
+ if (vp->v_holdcnt)
error = EBUSY;
VI_UNLOCK(vp);
done:
@@ -1781,6 +1781,7 @@ v_incr_usecount(struct vnode *vp, int delta)
{
vp->v_usecount += delta;
+ vp->v_holdcnt += delta;
if (vp->v_type == VCHR && vp->v_rdev != NULL) {
dev_lock();
vp->v_rdev->si_usecount += delta;
@@ -2018,7 +2019,7 @@ vdropl(struct vnode *vp)
{
if (vp->v_holdcnt <= 0)
- panic("vdrop: holdcnt");
+ panic("vdrop: holdcnt %d", vp->v_holdcnt);
vp->v_holdcnt--;
if (VSHOULDFREE(vp))
vfree(vp);
@@ -2326,7 +2327,7 @@ vgonel(struct vnode *vp, struct thread *td)
* incremented first, vgone would (incorrectly) try to
* close the previous instance of the underlying object.
*/
- if (vp->v_usecount == 0 && vp->v_holdcnt == 0 && !doomed) {
+ if (vp->v_holdcnt == 0 && !doomed) {
mtx_lock(&vnode_free_list_mtx);
if (vp->v_iflag & VI_FREE) {
TAILQ_REMOVE(&vnode_free_list, vp, v_freelist);
OpenPOWER on IntegriCloud