[libvirt] [PATCH] storage: Fix several issues with transient pool cleanup

Jovanka Gulicoska jovanka.gulicoska at gmail.com
Mon Jun 20 16:18:59 UTC 2016


There are several cases where we do not handle transient pool destroy
and cleanup correctly. For example:

https://bugzilla.redhat.com/show_bug.cgi?id=1227475

Move the pool cleanup logic to a new function storagePoolSetInactive and
use it consistently.
---
 src/storage/storage_driver.c | 38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index e2d729f..74af35d 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -77,6 +77,21 @@ static void storageDriverUnlock(void)
 }
 
 static void
+storagePoolSetInactive(virStoragePoolObjPtr pool)
+{
+    pool->active = false;
+
+    if (pool->configFile == NULL) {
+        virStoragePoolObjRemove(&driver->pools, pool);
+        pool = NULL;
+    } else if (pool->newDef) {
+        virStoragePoolDefFree(pool->def);
+        pool->def = pool->newDef;
+        pool->newDef = NULL;
+    }
+}
+
+static void
 storagePoolUpdateState(virStoragePoolObjPtr pool)
 {
     bool active;
@@ -143,6 +158,7 @@ storagePoolUpdateAllState(void)
         virStoragePoolObjPtr pool = driver->pools.objs[i];
 
         virStoragePoolObjLock(pool);
+        storagePoolSetInactive(pool);
         storagePoolUpdateState(pool);
         virStoragePoolObjUnlock(pool);
     }
@@ -198,6 +214,7 @@ storageDriverAutostart(void)
                     unlink(stateFile);
                 if (backend->stopPool)
                     backend->stopPool(conn, pool);
+                storagePoolSetInactive(pool);
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("Failed to autostart storage pool '%s': %s"),
                                pool->def->name, virGetLastErrorMessage());
@@ -737,7 +754,7 @@ storagePoolCreateXML(virConnectPtr conn,
             unlink(stateFile);
         if (backend->stopPool)
             backend->stopPool(conn, pool);
-        virStoragePoolObjRemove(&driver->pools, pool);
+        storagePoolSetInactive(pool);
         pool = NULL;
         goto cleanup;
     }
@@ -1068,16 +1085,7 @@ storagePoolDestroy(virStoragePoolPtr obj)
                                             VIR_STORAGE_POOL_EVENT_STOPPED,
                                             0);
 
-    pool->active = false;
-
-    if (pool->configFile == NULL) {
-        virStoragePoolObjRemove(&driver->pools, pool);
-        pool = NULL;
-    } else if (pool->newDef) {
-        virStoragePoolDefFree(pool->def);
-        pool->def = pool->newDef;
-        pool->newDef = NULL;
-    }
+    storagePoolSetInactive(pool);
 
     ret = 0;
 
@@ -1197,13 +1205,7 @@ storagePoolRefresh(virStoragePoolPtr obj,
                                                 pool->def->uuid,
                                                 VIR_STORAGE_POOL_EVENT_STOPPED,
                                                 0);
-        pool->active = false;
-
-        if (pool->configFile == NULL) {
-            virStoragePoolObjRemove(&driver->pools, pool);
-            pool = NULL;
-        }
-        goto cleanup;
+        storagePoolSetInactive(pool);
     }
 
     event = virStoragePoolEventLifecycleNew(pool->def->name,
-- 
2.5.5




More information about the libvir-list mailing list