MFC r196592:

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:	re (rwatson), bz (mentor)
This commit is contained in:
Jamie Gritton 2009-08-31 14:13:45 +00:00
parent ee1db5ae45
commit f37b0a3db5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=196699

View File

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