diff options
author | semenu <semenu@FreeBSD.org> | 2002-06-13 17:30:40 +0000 |
---|---|---|
committer | semenu <semenu@FreeBSD.org> | 2002-06-13 17:30:40 +0000 |
commit | 7baa028f375f33f5042fc2e26feba46a7aa2115f (patch) | |
tree | 32fbfa63f7c020bfd082349f319d2cf482ab7784 /sys/fs | |
parent | 89a746a29dc8d07c5e18b9a23517ae6a4a7d6618 (diff) | |
download | FreeBSD-src-7baa028f375f33f5042fc2e26feba46a7aa2115f.zip FreeBSD-src-7baa028f375f33f5042fc2e26feba46a7aa2115f.tar.gz |
Fix wrong locking in null_inactive and null_reclaim. This makes nullfs
relatively working back.
Reviewed by: mckusick, bp
Diffstat (limited to 'sys/fs')
-rw-r--r-- | sys/fs/nullfs/null_vnops.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/sys/fs/nullfs/null_vnops.c b/sys/fs/nullfs/null_vnops.c index 74b1ff2..1229e59 100644 --- a/sys/fs/nullfs/null_vnops.c +++ b/sys/fs/nullfs/null_vnops.c @@ -715,13 +715,16 @@ null_inactive(ap) } */ *ap; { struct vnode *vp = ap->a_vp; + struct thread *td = ap->a_td; + + VOP_UNLOCK(vp, 0, td); /* * If this is the last reference, then free up the vnode * so as not to tie up the lower vnodes. */ - if (vp->v_usecount == 0) - vrecycle(vp, NULL, ap->a_td); + vrecycle(vp, NULL, td); + return (0); } @@ -746,18 +749,12 @@ null_reclaim(ap) LIST_REMOVE(xp, null_hash); lockmgr(&null_hashlock, LK_RELEASE, NULL, td); - xp->null_lowervp = NULLVP; - if (vp->v_vnlock != NULL) { - vp->v_vnlock = &vp->v_lock; /* we no longer share the lock */ - } else - VOP_UNLOCK(vp, LK_THISLAYER, td); - /* * Now it is safe to drop references to the lower vnode. * VOP_INACTIVE() will be called by vrele() if necessary. */ - vput(lowervp); - vrele (lowervp); + vrele(lowervp); + vrele(lowervp); vdata = vp->v_data; vp->v_data = NULL; |