summaryrefslogtreecommitdiffstats
path: root/sys/fs/nullfs
diff options
context:
space:
mode:
authorsemenu <semenu@FreeBSD.org>2002-06-13 17:30:40 +0000
committersemenu <semenu@FreeBSD.org>2002-06-13 17:30:40 +0000
commit7baa028f375f33f5042fc2e26feba46a7aa2115f (patch)
tree32fbfa63f7c020bfd082349f319d2cf482ab7784 /sys/fs/nullfs
parent89a746a29dc8d07c5e18b9a23517ae6a4a7d6618 (diff)
downloadFreeBSD-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/nullfs')
-rw-r--r--sys/fs/nullfs/null_vnops.c17
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;
OpenPOWER on IntegriCloud