]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nwfilter: reorder locks
authorStefan Berger <stefanb@us.ibm.com>
Fri, 27 May 2011 20:50:40 +0000 (16:50 -0400)
committerStefan Berger <stefanb@us.ibm.com>
Fri, 27 May 2011 20:50:40 +0000 (16:50 -0400)
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.

src/conf/nwfilter_conf.c
src/nwfilter/nwfilter_driver.c

index 3f69c1d9a70d65eb1965339175475bef691405f9..40516c7619ab42d9e912af3e3e60444047342bbe 100644 (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;
index d9ac17e86df6dc33a737792892bdbb1b70cb2771..44327ae1a2f4d2cf94e68317007096654d7c8040 100644 (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;