[libvirt] [PATCH 1/2] storage: Introduce virStorageBackendRefreshVolTargetUpdate

John Ferlan jferlan at redhat.com
Thu Aug 24 22:28:28 UTC 2017


Create a separate function to handle the volume target update
via probe processing.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/storage/storage_util.c | 82 ++++++++++++++++++++++++++++++----------------
 src/storage/storage_util.h |  3 ++
 2 files changed, 57 insertions(+), 28 deletions(-)

diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
index e1fe162..b0a698a 100644
--- a/src/storage/storage_util.c
+++ b/src/storage/storage_util.c
@@ -3517,6 +3517,58 @@ storageBackendProbeTarget(virStorageSourcePtr target,
 
 
 /**
+ * virStorageBackendRefreshVolTargetUpdate:
+ * @vol: Volume def that needs updating
+ *
+ * Attempt to probe the volume in order to get more details.
+ *
+ * Returns 0 on success, -2 to ignore failure, -1 on failure
+ */
+int
+virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol)
+{
+    int err;
+
+    /* Real value is filled in during probe */
+    vol->target.format = VIR_STORAGE_FILE_RAW;
+
+    if ((err = storageBackendProbeTarget(&vol->target,
+                                         &vol->target.encryption)) < 0) {
+        if (err == -2) {
+            return -2;
+        } else if (err == -3) {
+            /* The backing file is currently unavailable, its format is not
+             * explicitly specified, the probe to auto detect the format
+             * failed: continue with faked RAW format, since AUTO will
+             * break virStorageVolTargetDefFormat() generating the line
+             * <format type='...'/>. */
+        } else {
+            return -1;
+        }
+    }
+
+    /* directory based volume */
+    if (vol->target.format == VIR_STORAGE_FILE_DIR)
+        vol->type = VIR_STORAGE_VOL_DIR;
+
+    if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
+        vol->type = VIR_STORAGE_VOL_PLOOP;
+
+    if (vol->target.backingStore) {
+        ignore_value(storageBackendUpdateVolTargetInfo(VIR_STORAGE_VOL_FILE,
+                                                       vol->target.backingStore,
+                                                       false,
+                                                       VIR_STORAGE_VOL_OPEN_DEFAULT, 0));
+        /* If this failed, the backing file is currently unavailable,
+         * the capacity, allocation, owner, group and mode are unknown.
+         * An error message was raised, but we just continue. */
+    }
+
+    return 0;
+}
+
+
+/**
  * Iterate over the pool's directory and enumerate all disk images
  * within it. This is non-recursive.
  */
@@ -3552,7 +3604,6 @@ virStorageBackendRefreshLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
             goto cleanup;
 
         vol->type = VIR_STORAGE_VOL_FILE;
-        vol->target.format = VIR_STORAGE_FILE_RAW; /* Real value is filled in during probe */
         if (virAsprintf(&vol->target.path, "%s/%s",
                         pool->def->target.path,
                         vol->name) < 0)
@@ -3561,40 +3612,15 @@ virStorageBackendRefreshLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
         if (VIR_STRDUP(vol->key, vol->target.path) < 0)
             goto cleanup;
 
-        if ((err = storageBackendProbeTarget(&vol->target,
-                                             &vol->target.encryption)) < 0) {
+        if ((err = virStorageBackendRefreshVolTargetUpdate(vol)) < 0) {
             if (err == -2) {
                 /* Silently ignore non-regular files,
                  * eg 'lost+found', dangling symbolic link */
                 virStorageVolDefFree(vol);
                 vol = NULL;
                 continue;
-            } else if (err == -3) {
-                /* The backing file is currently unavailable, its format is not
-                 * explicitly specified, the probe to auto detect the format
-                 * failed: continue with faked RAW format, since AUTO will
-                 * break virStorageVolTargetDefFormat() generating the line
-                 * <format type='...'/>. */
-            } else {
-                goto cleanup;
             }
-        }
-
-        /* directory based volume */
-        if (vol->target.format == VIR_STORAGE_FILE_DIR)
-            vol->type = VIR_STORAGE_VOL_DIR;
-
-        if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
-            vol->type = VIR_STORAGE_VOL_PLOOP;
-
-        if (vol->target.backingStore) {
-            ignore_value(storageBackendUpdateVolTargetInfo(VIR_STORAGE_VOL_FILE,
-                                                           vol->target.backingStore,
-                                                           false,
-                                                           VIR_STORAGE_VOL_OPEN_DEFAULT, 0));
-            /* If this failed, the backing file is currently unavailable,
-             * the capacity, allocation, owner, group and mode are unknown.
-             * An error message was raised, but we just continue. */
+            goto cleanup;
         }
 
         if (VIR_APPEND_ELEMENT(pool->volumes.objs, pool->volumes.count, vol) < 0)
diff --git a/src/storage/storage_util.h b/src/storage/storage_util.h
index 6f2a1b1..00793ff 100644
--- a/src/storage/storage_util.h
+++ b/src/storage/storage_util.h
@@ -90,6 +90,9 @@ int virStorageBackendDeleteLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  unsigned int flags);
 
+int
+virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol);
+
 int virStorageBackendRefreshLocal(virConnectPtr conn,
                                   virStoragePoolObjPtr pool);
 
-- 
2.9.5




More information about the libvir-list mailing list