mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
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:
parent
ecbe86c0c5
commit
8cc166e76e
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user