Lock the real null vnode lock before substitution of vp->v_vnlock.

This should not really matter for correctness, since vp->v_lock is
not locked before the call, and null_lock() holds the interlock,
but makes the control flow for reclaim more clear.

Tested by:	pho
This commit is contained in:
Konstantin Belousov 2009-05-31 14:52:45 +00:00
parent b1e4b9fcc4
commit cec9ed6d7f

View File

@ -683,14 +683,15 @@ null_reclaim(struct vop_reclaim_args *ap)
* Use the interlock to protect the clearing of v_data to * Use the interlock to protect the clearing of v_data to
* prevent faults in null_lock(). * prevent faults in null_lock().
*/ */
lockmgr(&vp->v_lock, LK_EXCLUSIVE, NULL);
VI_LOCK(vp); VI_LOCK(vp);
vp->v_data = NULL; vp->v_data = NULL;
vp->v_object = NULL; vp->v_object = NULL;
vp->v_vnlock = &vp->v_lock; vp->v_vnlock = &vp->v_lock;
if (lowervp) { VI_UNLOCK(vp);
lockmgr(vp->v_vnlock, LK_EXCLUSIVE | LK_INTERLOCK, VI_MTX(vp)); if (lowervp)
vput(lowervp); vput(lowervp);
} else else
panic("null_reclaim: reclaiming a node with no lowervp"); panic("null_reclaim: reclaiming a node with no lowervp");
free(xp, M_NULLFSNODE); free(xp, M_NULLFSNODE);