]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Introduce virStorageBackendRefreshVolTargetUpdate
authorJohn Ferlan <jferlan@redhat.com>
Thu, 24 Aug 2017 21:56:47 +0000 (17:56 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 30 Aug 2017 19:32:13 +0000 (15:32 -0400)
Create a separate function to handle the volume target update
via probe processing.

src/storage/storage_util.c
src/storage/storage_util.h

index e1fe162ed935b357ef20b8902a49d51cae79e0f9..b0a698a7c4edd818d9bf72d0e5eaadefcfcf4fa6 100644 (file)
@@ -3516,6 +3516,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)
index 6f2a1b189e1d1c87baa980c38696e3e76e6b8f8a..00793ff3a4ba159d9ef356c6e26fc0623aa7b963 100644 (file)
@@ -90,6 +90,9 @@ int virStorageBackendDeleteLocal(virConnectPtr conn,
                                  virStoragePoolObjPtr pool,
                                  unsigned int flags);
 
+int
+virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol);
+
 int virStorageBackendRefreshLocal(virConnectPtr conn,
                                   virStoragePoolObjPtr pool);