nwfilter: reorder locks

This patch reorders the locks for the nwfilter updates and the access
the nwfilter objects. In the case that the IP address learning thread
was instantiating filters while an update happened, the previous order
lead to a deadlock.
This commit is contained in:
Stefan Berger 2011-05-27 16:50:40 -04:00
parent ecbe86c0c5
commit 8cc166e76e
2 changed files with 9 additions and 4 deletions

View File

@ -2394,15 +2394,13 @@ virNWFilterTestUnassignDef(virConnectPtr conn,
{
int rc = 0;
virNWFilterLockFilterUpdates();
nwfilter->wantRemoved = 1;
/* trigger the update on VMs referencing the filter */
if (virNWFilterTriggerVMFilterRebuild(conn))
rc = 1;
nwfilter->wantRemoved = 0;
virNWFilterUnlockFilterUpdates();
return rc;
}
@ -2434,8 +2432,9 @@ virNWFilterObjAssignDef(virConnectPtr conn,
return NULL;
}
virNWFilterLockFilterUpdates();
if ((nwfilter = virNWFilterObjFindByName(nwfilters, def->name))) {
virNWFilterLockFilterUpdates();
nwfilter->newDef = def;
/* trigger the update on VMs referencing the filter */
if (virNWFilterTriggerVMFilterRebuild(conn)) {
@ -2452,6 +2451,8 @@ virNWFilterObjAssignDef(virConnectPtr conn,
return nwfilter;
}
virNWFilterUnlockFilterUpdates();
if (VIR_ALLOC(nwfilter) < 0) {
virReportOOMError();
return NULL;

View File

@ -372,6 +372,8 @@ nwfilterUndefine(virNWFilterPtr obj) {
nwfilterDriverLock(driver);
virNWFilterCallbackDriversLock();
virNWFilterLockFilterUpdates();
nwfilter = virNWFilterObjFindByUUID(&driver->nwfilters, obj->uuid);
if (!nwfilter) {
virNWFilterReportError(VIR_ERR_NO_NWFILTER,
@ -399,6 +401,8 @@ cleanup:
if (nwfilter)
virNWFilterObjUnlock(nwfilter);
virNWFilterUnlockFilterUpdates();
virNWFilterCallbackDriversUnlock();
nwfilterDriverUnlock(driver);
return ret;