[PATCH 1/6] storage: Break out storageDriverAutostartPool

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

 



For autostarting a single pool. Lets us exit the function early
which simplifies the control flow, and it matches the pattern
of storagePoolUpdateAllState
---
 src/storage/storage_driver.c | 84 +++++++++++++++++++++++---------------------
 1 file changed, 43 insertions(+), 41 deletions(-)

diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index e2d729f..3bdc13f 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -149,6 +149,48 @@ storagePoolUpdateAllState(void)
 }
 
 static void
+storageDriverAutostartPool(virConnectPtr conn,
+                           virStoragePoolObjPtr pool)
+{
+    virStorageBackendPtr backend;
+    char *stateFile = NULL;
+
+    if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
+        goto cleanup;
+
+    if (virStoragePoolObjIsActive(pool) || !pool->autostart)
+        goto cleanup;
+
+    if (backend->startPool &&
+        backend->startPool(conn, pool) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to autostart storage pool '%s': %s"),
+                       pool->def->name, virGetLastErrorMessage());
+        goto cleanup;
+    }
+
+    virStoragePoolObjClearVols(pool);
+    stateFile = virFileBuildPath(driver->stateDir,
+                                 pool->def->name, ".xml");
+    if (!stateFile ||
+        virStoragePoolSaveState(stateFile, pool->def) < 0 ||
+        backend->refreshPool(conn, pool) < 0) {
+        if (stateFile)
+            unlink(stateFile);
+        if (backend->stopPool)
+            backend->stopPool(conn, pool);
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Failed to autostart storage pool '%s': %s"),
+                       pool->def->name, virGetLastErrorMessage());
+        goto cleanup;
+    }
+
+    pool->active = true;
+ cleanup:
+    VIR_FREE(stateFile);
+}
+
+static void
 storageDriverAutostart(void)
 {
     size_t i;
@@ -163,49 +205,9 @@ storageDriverAutostart(void)
 
     for (i = 0; i < driver->pools.count; i++) {
         virStoragePoolObjPtr pool = driver->pools.objs[i];
-        virStorageBackendPtr backend;
-        bool started = false;
 
         virStoragePoolObjLock(pool);
-        if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
-            virStoragePoolObjUnlock(pool);
-            continue;
-        }
-
-        if (pool->autostart &&
-            !virStoragePoolObjIsActive(pool)) {
-            if (backend->startPool &&
-                backend->startPool(conn, pool) < 0) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("Failed to autostart storage pool '%s': %s"),
-                               pool->def->name, virGetLastErrorMessage());
-                virStoragePoolObjUnlock(pool);
-                continue;
-            }
-            started = true;
-        }
-
-        if (started) {
-            char *stateFile;
-
-            virStoragePoolObjClearVols(pool);
-            stateFile = virFileBuildPath(driver->stateDir,
-                                         pool->def->name, ".xml");
-            if (!stateFile ||
-                virStoragePoolSaveState(stateFile, pool->def) < 0 ||
-                backend->refreshPool(conn, pool) < 0) {
-                if (stateFile)
-                    unlink(stateFile);
-                if (backend->stopPool)
-                    backend->stopPool(conn, pool);
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("Failed to autostart storage pool '%s': %s"),
-                               pool->def->name, virGetLastErrorMessage());
-            } else {
-                pool->active = true;
-            }
-            VIR_FREE(stateFile);
-        }
+        storageDriverAutostartPool(conn, pool);
         virStoragePoolObjUnlock(pool);
     }
 
-- 
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]