[libvirt] [PATCH 3/3] storage: driver: Remove unavailable transient pools after restart

Peter Krempa pkrempa at redhat.com
Thu Mar 30 12:03:47 UTC 2017


If a transient storage pool is deemed inactive after libvirtd restart it
would not be deleted from the list. Reuse virStoragePoolUpdateInactive
along with a refactor necessary to properly update the state.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1242801
---
 src/storage/storage_driver.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 618b640a2..fea769887 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -105,31 +105,28 @@ virStoragePoolUpdateInactive(virStoragePoolObjPtr *poolptr)
 static void
 storagePoolUpdateState(virStoragePoolObjPtr pool)
 {
-    bool active;
+    bool active = false;
     virStorageBackendPtr backend;
-    int ret = -1;
     char *stateFile;

     if (!(stateFile = virFileBuildPath(driver->stateDir,
                                        pool->def->name, ".xml")))
-        goto error;
+        goto cleanup;

     if ((backend = virStorageBackendForType(pool->def->type)) == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Missing backend %d"), pool->def->type);
-        goto error;
+        goto cleanup;
     }

     /* Backends which do not support 'checkPool' are considered
-     * inactive by default.
-     */
-    active = false;
+     * inactive by default. */
     if (backend->checkPool &&
         backend->checkPool(pool, &active) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Failed to initialize storage pool '%s': %s"),
                        pool->def->name, virGetLastErrorMessage());
-        goto error;
+        active = false;
     }

     /* We can pass NULL as connection, most backends do not use
@@ -144,17 +141,18 @@ storagePoolUpdateState(virStoragePoolObjPtr pool)
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Failed to restart storage pool '%s': %s"),
                            pool->def->name, virGetLastErrorMessage());
-            goto error;
+            active = false;
         }
     }

     pool->active = active;
-    ret = 0;
- error:
-    if (ret < 0) {
-        if (stateFile)
-            unlink(stateFile);
-    }
+
+    if (!pool->active)
+        virStoragePoolUpdateInactive(&pool);
+
+ cleanup:
+    if (!active && stateFile)
+        ignore_value(unlink(stateFile));
     VIR_FREE(stateFile);

     return;
-- 
2.12.1




More information about the libvir-list mailing list