Fix a LOR between allprison_lock and vnode locks by releasing

allprison_lock before releasing a prison's root vnode.

PR:		kern/138004
Reviewed by:	kib
Approved by:	bz (mentor)
MFC after:	3 days
This commit is contained in:
Jamie Gritton 2009-08-27 16:15:51 +00:00
parent d1321a41a5
commit c4884ffa6f

View File

@ -2453,7 +2453,7 @@ prison_deref(struct prison *pr, int flags)
ppr = pr->pr_parent;
for (tpr = ppr; tpr != NULL; tpr = tpr->pr_parent)
tpr->pr_childcount--;
sx_downgrade(&allprison_lock);
sx_xunlock(&allprison_lock);
#ifdef VIMAGE
if (pr->pr_vnet != ppr->pr_vnet)
@ -2479,7 +2479,7 @@ prison_deref(struct prison *pr, int flags)
/* Removing a prison frees a reference on its parent. */
pr = ppr;
mtx_lock(&pr->pr_mtx);
flags = PD_DEREF | PD_LIST_SLOCKED;
flags = PD_DEREF;
}
}