[PATCH 1/7] storage: rework qemu-img command line generation

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

 



Split out option string generation to make adding new options easier
and simplify the code.
---
 src/storage/storage_backend.c | 111 ++++++++++++++++++++++--------------------
 1 file changed, 59 insertions(+), 52 deletions(-)

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index e5c9209..0abc3f3 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -651,6 +651,32 @@ cleanup:
     return ret;
 }
 
+static int
+virStorageBackendCreateQemuImgOpts(char **opts,
+                                   const char *backingType,
+                                   bool encryption,
+                                   bool preallocate)
+{
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    if (backingType)
+        virBufferAsprintf(&buf, "backing_fmt=%s,", backingType);
+    if (encryption)
+        virBufferAddLit(&buf, "encryption=on,");
+    if (preallocate)
+        virBufferAddLit(&buf, "preallocation=metadata,");
+
+    virBufferTrim(&buf, ",", -1);
+
+    if (virBufferError(&buf)) {
+        virBufferFreeAndReset(&buf);
+        virReportOOMError();
+        return -1;
+    }
+
+    *opts = virBufferContentAndReset(&buf);
+    return 0;
+}
+
 virCommandPtr
 virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
                                   virStoragePoolObjPtr pool,
@@ -668,6 +694,9 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
     const char *backingType = NULL;
     const char *inputPath = NULL;
     const char *inputType = NULL;
+    char *opts = NULL;
+    bool convert = false;
+    bool backing = false;
 
     virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, NULL);
 
@@ -795,65 +824,43 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
 
     cmd = virCommandNew(create_tool);
 
-    if (inputvol) {
-        virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL);
+    convert = !!inputvol;
+    backing = !inputvol && vol->backingStore.path;
 
-        if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS &&
-            (do_encryption || preallocate)) {
-            virCommandAddArg(cmd, "-o");
-            virCommandAddArgFormat(cmd, "%s%s%s", do_encryption ? "encryption=on" : "",
-                                   (do_encryption && preallocate) ? "," : "",
-                                   preallocate ? "preallocation=metadata" : "");
-        } else if (do_encryption) {
-            virCommandAddArg(cmd, "-e");
-        }
-        virCommandAddArgList(cmd, inputPath, vol->target.path, NULL);
-    } else if (vol->backingStore.path) {
-        virCommandAddArgList(cmd, "create", "-f", type,
-                             "-b", vol->backingStore.path, NULL);
-
-        switch (imgformat) {
-        case QEMU_IMG_BACKING_FORMAT_FLAG:
-            virCommandAddArgList(cmd, "-F", backingType, NULL);
-            if (do_encryption)
-                virCommandAddArg(cmd, "-e");
-            virCommandAddArg(cmd, vol->target.path);
-            virCommandAddArgFormat(cmd, "%lluK", size_arg);
-            break;
-
-        case QEMU_IMG_BACKING_FORMAT_OPTIONS:
-            virCommandAddArg(cmd, "-o");
-            virCommandAddArgFormat(cmd, "backing_fmt=%s%s", backingType,
-                                   do_encryption ? ",encryption=on" : "");
-            virCommandAddArg(cmd, vol->target.path);
-            virCommandAddArgFormat(cmd, "%lluK", size_arg);
-            break;
+    if (convert)
+        virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type, NULL);
+    else
+        virCommandAddArgList(cmd, "create", "-f", type, NULL);
 
-        default:
-            VIR_DEBUG("Unable to set backing store format for %s with %s",
-                      vol->target.path, create_tool);
+    if (backing)
+        virCommandAddArgList(cmd, "-b", vol->backingStore.path, NULL);
 
-            if (do_encryption)
-                virCommandAddArg(cmd, "-e");
-            virCommandAddArg(cmd, vol->target.path);
-            virCommandAddArgFormat(cmd, "%lluK", size_arg);
-        }
+    if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS) {
+        if (virStorageBackendCreateQemuImgOpts(&opts,
+                                               backing ? backingType : NULL,
+                                               do_encryption, preallocate))
+            return NULL;
+        if (opts)
+            virCommandAddArgList(cmd, "-o", opts, NULL);
+        VIR_FREE(opts);
     } else {
-        virCommandAddArgList(cmd, "create", "-f", type, NULL);
-
-        if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS &&
-            (do_encryption || preallocate)) {
-            virCommandAddArg(cmd, "-o");
-            virCommandAddArgFormat(cmd, "%s%s%s", do_encryption ? "encryption=on" : "",
-                                   (do_encryption && preallocate) ? "," : "",
-                                   preallocate ? "preallocation=metadata" : "");
-        } else if (do_encryption) {
-            virCommandAddArg(cmd, "-e");
+        if (backing) {
+            if (imgformat == QEMU_IMG_BACKING_FORMAT_FLAG)
+                virCommandAddArgList(cmd, "-F", backingType, NULL);
+            else
+                VIR_DEBUG("Unable to set backing store format for %s with %s",
+                          vol->target.path, create_tool);
         }
-        virCommandAddArg(cmd, vol->target.path);
-        virCommandAddArgFormat(cmd, "%lluK", size_arg);
+        if (do_encryption)
+            virCommandAddArg(cmd, "-e");
     }
 
+    if (convert)
+        virCommandAddArg(cmd, inputPath);
+    virCommandAddArg(cmd, vol->target.path);
+    if (!convert)
+        virCommandAddArgFormat(cmd, "%lluK", size_arg);
+
     return cmd;
 }
 
-- 
1.8.1.5

--
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]