[PATCH 2/6] storage: Add storagePoolSetInactive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This function handles newDef assignment and transient pool removal
when an object is set inactive. The return value notifies callers
if the pool was removed, so they know not to try to access the
pool object anymore.

Some users don't gain anything from it at this point, but future
patches will improve that.
---
 src/storage/storage_driver.c | 54 +++++++++++++++++++++++++++++++-------------
 1 file changed, 38 insertions(+), 16 deletions(-)

diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 3bdc13f..c7ffea8 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -76,6 +76,32 @@ static void storageDriverUnlock(void)
     virMutexUnlock(&driver->lock);
 }
 
+/*
+ * storagePoolSetInactive:
+ * Helper for setting a pool object as 'inactive'. Handles reassigning
+ * newDef for persistent pools, and removing and freeing the object
+ * for transient pools.
+ *
+ * Returns true if pool was removed from driver->pools
+ */
+static bool
+storagePoolSetInactive(virStoragePoolObjPtr pool)
+{
+    bool ret = false;
+    pool->active = false;
+
+    if (pool->configFile == NULL) {
+        virStoragePoolObjRemove(&driver->pools, pool);
+        ret = true;
+    } else if (pool->newDef) {
+        virStoragePoolDefFree(pool->def);
+        pool->def = pool->newDef;
+        pool->newDef = NULL;
+    }
+
+    return ret;
+}
+
 static void
 storagePoolUpdateState(virStoragePoolObjPtr pool)
 {
@@ -182,6 +208,10 @@ storageDriverAutostartPool(virConnectPtr conn,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Failed to autostart storage pool '%s': %s"),
                        pool->def->name, virGetLastErrorMessage());
+
+        /* Don't check the return value, it should never be 'true' here
+         * since this function requires a non-transient pool */
+        storagePoolSetInactive(pool);
         goto cleanup;
     }
 
@@ -739,8 +769,8 @@ storagePoolCreateXML(virConnectPtr conn,
             unlink(stateFile);
         if (backend->stopPool)
             backend->stopPool(conn, pool);
-        virStoragePoolObjRemove(&driver->pools, pool);
-        pool = NULL;
+        if (storagePoolSetInactive(pool))
+            pool = NULL;
         goto cleanup;
     }
 
@@ -956,6 +986,10 @@ storagePoolCreate(virStoragePoolPtr obj,
             unlink(stateFile);
         if (backend->stopPool)
             backend->stopPool(obj->conn, pool);
+
+        /* Don't check the return value, it should never be 'true' here
+         * since this function requires a non-transient pool */
+        storagePoolSetInactive(pool);
         goto cleanup;
     }
 
@@ -1070,16 +1104,8 @@ storagePoolDestroy(virStoragePoolPtr obj)
                                             VIR_STORAGE_POOL_EVENT_STOPPED,
                                             0);
 
-    pool->active = false;
-
-    if (pool->configFile == NULL) {
-        virStoragePoolObjRemove(&driver->pools, pool);
+    if (storagePoolSetInactive(pool))
         pool = NULL;
-    } else if (pool->newDef) {
-        virStoragePoolDefFree(pool->def);
-        pool->def = pool->newDef;
-        pool->newDef = NULL;
-    }
 
     ret = 0;
 
@@ -1199,12 +1225,8 @@ storagePoolRefresh(virStoragePoolPtr obj,
                                                 pool->def->uuid,
                                                 VIR_STORAGE_POOL_EVENT_STOPPED,
                                                 0);
-        pool->active = false;
-
-        if (pool->configFile == NULL) {
-            virStoragePoolObjRemove(&driver->pools, pool);
+        if (storagePoolSetInactive(pool))
             pool = NULL;
-        }
         goto cleanup;
     }
 
-- 
2.7.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]