[libvirt] [PATCHv1 12/13] Rework qemu-img command generation for inactive external snapshots

Ján Tomko jtomko at redhat.com
Fri Apr 10 12:59:04 UTC 2015


Reuse the code from storage backend.

This also fixes the backing_fmd typo by removing it.
---
 src/qemu/qemu_driver.c        | 46 ++++++++++---------------------------------
 src/storage/storage_backend.c |  2 +-
 2 files changed, 11 insertions(+), 37 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4f14546..3ea42f2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13468,7 +13468,6 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver,
     size_t i;
     virDomainSnapshotDiskDefPtr snapdisk;
     virDomainDiskDefPtr defdisk;
-    virCommandPtr cmd = NULL;
     const char *qemuImgPath;
     virBitmapPtr created = NULL;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
@@ -13489,48 +13488,25 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver,
         if (snapdisk->snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
             continue;
 
-        if (!snapdisk->src->format)
-            snapdisk->src->format = VIR_STORAGE_FILE_QCOW2;
-
-        /* creates cmd line args: qemu-img create -f qcow2 -o */
-        if (!(cmd = virCommandNewArgList(qemuImgPath,
-                                         "create",
-                                         "-f",
-                                         virStorageFileFormatTypeToString(snapdisk->src->format),
-                                         "-o",
-                                         NULL)))
+        if (defdisk->src->format == VIR_STORAGE_FILE_NONE &&
+            !cfg->allowDiskFormatProbing) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown image format of '%s' and "
+                             "format probing is disabled"),
+                           defdisk->src->path);
             goto cleanup;
-
-        if (defdisk->src->format > 0) {
-            /* adds cmd line arg: backing_file=/path/to/backing/file,backing_fmd=format */
-            virCommandAddArgFormat(cmd, "backing_file=%s,backing_fmt=%s",
-                                   defdisk->src->path,
-                                   virStorageFileFormatTypeToString(defdisk->src->format));
-        } else {
-            if (!cfg->allowDiskFormatProbing) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown image format of '%s' and "
-                                 "format probing is disabled"),
-                               defdisk->src->path);
-                goto cleanup;
-            }
-
-            /* adds cmd line arg: backing_file=/path/to/backing/file */
-            virCommandAddArgFormat(cmd, "backing_file=%s", defdisk->src->path);
         }
 
-        /* adds cmd line args: /path/to/target/file */
-        virCommandAddArg(cmd, snapdisk->src->path);
+        if (!snapdisk->src->format)
+            snapdisk->src->format = VIR_STORAGE_FILE_QCOW2;
 
         /* If the target does not exist, we're going to create it possibly */
         if (!virFileExists(snapdisk->src->path))
             ignore_value(virBitmapSetBit(created, i));
 
-        if (virCommandRun(cmd, NULL) < 0)
+        if (virStorageFileCreateWithFormat(snapdisk->src, snapdisk->src->path,
+                                           defdisk->src, qemuImgPath) < 0)
             goto cleanup;
-
-        virCommandFree(cmd);
-        cmd = NULL;
     }
 
     /* update disk definitions */
@@ -13554,8 +13530,6 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver,
     ret = 0;
 
  cleanup:
-    virCommandFree(cmd);
-
     /* unlink images if creation has failed */
     if (ret < 0 && created) {
         ssize_t bit = -1;
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 9ffbc6e..ec8b7b5 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -819,7 +819,7 @@ virStorageBackendCreateQemuImgOpts(char **opts,
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-    if (info.backingPath)
+    if (info.backingPath && info.backingFormat)
         virBufferAsprintf(&buf, "backing_fmt=%s,",
                           virStorageFileFormatTypeToString(info.backingFormat));
     if (info.encryption)
-- 
2.0.5




More information about the libvir-list mailing list