[libvirt] [PATCH v2 2/3] qemu_driver: simplify compress prog check by macros

Chen Hanxiao chen_han_xiao at 126.com
Mon Sep 19 11:06:47 UTC 2016


From: Chen Hanxiao <chenhanxiao at gmail.com>

We use almost the same codes in checking compress progame
for saveImageFormat and snapshotImageFormat.

This patch introduce VIR_QEMU_COMPRESS_CHECK to simplify that checking.

Signed-off-by: Chen Hanxiao <chenhanxiao at gmail.com>
---
 src/qemu/qemu_driver.c | 122 +++++++++++++++++++++++++++----------------------
 1 file changed, 67 insertions(+), 55 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index f54aa98..8653bc0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3265,6 +3265,64 @@ qemuCompressProgramAvailable(virQEMUSaveFormat compress, char **compressed_path)
     return true;
 }
 
+typedef enum {
+    QEMU_COMPRESS_PROG_IMG = 0,
+    QEMU_COMPRESS_PROG_SNAP = 1,
+
+    QEMU_COMPRESS_PROG_LAST
+}virQEMUCompressType;
+
+# define VIR_QEMU_COMPRESS_CHECK(val, type)                                             \
+    do {                                                                                \
+        if (cfg->val) {                                                                 \
+            compressed = qemuSaveCompressionTypeFromString(cfg->val);                   \
+            if (compressed < 0) {                                                       \
+                virReportError(VIR_ERR_OPERATION_FAILED,                                \
+                               _("Invalid %s image format specified "                   \
+                                 "in configuration file"), type);                       \
+                goto cleanup;                                                           \
+            }                                                                           \
+            if (!qemuCompressProgramAvailable(compressed, compressed_path)) {           \
+                virReportError(VIR_ERR_OPERATION_FAILED,                                \
+                               _("Compression program for image format "                \
+                                 "in configuration file isn't available"));             \
+                goto cleanup;                                                           \
+            }                                                                           \
+        }                                                                               \
+    } while (0);
+
+/* Get the path of compress programe if available,
+ * or NULL if no compressed programe specified.
+ * Return 0 on success, -1 on failure.
+ * You must free the result */
+static int
+qemuCompressProgramPath(virQEMUDriverPtr driver, char **compressed_path,
+                        virQEMUCompressType type)
+{
+    virQEMUDriverConfigPtr cfg = NULL;
+    int compressed = QEMU_SAVE_FORMAT_RAW;
+    *compressed_path = NULL;
+    int ret = -1;
+
+    cfg = virQEMUDriverGetConfig(driver);
+    switch (type) {
+    case QEMU_COMPRESS_PROG_IMG:
+        VIR_QEMU_COMPRESS_CHECK(saveImageFormat, "save");
+        break;
+    case QEMU_COMPRESS_PROG_SNAP:
+        VIR_QEMU_COMPRESS_CHECK(snapshotImageFormat, "snapshot");
+        break;
+    default:
+        break;
+    }
+
+    ret = 0;
+
+ cleanup:
+    virObjectUnref(cfg);
+    return ret;
+}
+
 static int
 qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml,
                     unsigned int flags)
@@ -3274,28 +3332,14 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml,
     char *compressed_path = NULL;
     int ret = -1;
     virDomainObjPtr vm = NULL;
-    virQEMUDriverConfigPtr cfg = NULL;
 
     virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE |
                   VIR_DOMAIN_SAVE_RUNNING |
                   VIR_DOMAIN_SAVE_PAUSED, -1);
 
-    cfg = virQEMUDriverGetConfig(driver);
-    if (cfg->saveImageFormat) {
-        compressed = qemuSaveCompressionTypeFromString(cfg->saveImageFormat);
-        if (compressed < 0) {
-            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("Invalid save image format specified "
-                             "in configuration file"));
-            goto cleanup;
-        }
-        if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
-            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("Compression program for image format "
-                             "in configuration file isn't available"));
-            goto cleanup;
-        }
-    }
+    if (qemuCompressProgramPath(driver, &compressed_path,
+                                QEMU_COMPRESS_PROG_IMG) < 0)
+        goto cleanup;
 
     if (!(vm = qemuDomObjFromDomain(dom)))
         goto cleanup;
@@ -3314,7 +3358,6 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml,
 
  cleanup:
     virDomainObjEndAPI(&vm);
-    virObjectUnref(cfg);
     VIR_FREE(compressed_path);
     return ret;
 }
@@ -3344,7 +3387,6 @@ static int
 qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
 {
     virQEMUDriverPtr driver = dom->conn->privateData;
-    virQEMUDriverConfigPtr cfg = NULL;
     int compressed = QEMU_SAVE_FORMAT_RAW;
     char *compressed_path = NULL;
     virDomainObjPtr vm;
@@ -3372,22 +3414,9 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
         goto cleanup;
     }
 
-    cfg = virQEMUDriverGetConfig(driver);
-    if (cfg->saveImageFormat) {
-        compressed = qemuSaveCompressionTypeFromString(cfg->saveImageFormat);
-        if (compressed < 0) {
-            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("Invalid save image format specified "
-                             "in configuration file"));
-            goto cleanup;
-        }
-        if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
-            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                           _("Compression program for image format "
-                             "in configuration file isn't available"));
-            goto cleanup;
-        }
-    }
+    if (qemuCompressProgramPath(driver, &compressed_path,
+                                QEMU_COMPRESS_PROG_IMG) < 0)
+        goto cleanup;
 
     if (!(name = qemuDomainManagedSavePath(driver, vm)))
         goto cleanup;
@@ -3403,7 +3432,6 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
     virDomainObjEndAPI(&vm);
     VIR_FREE(name);
     VIR_FREE(compressed_path);
-    virObjectUnref(cfg);
 
     return ret;
 }
@@ -14313,7 +14341,6 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
     bool transaction = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION);
     int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
     bool pmsuspended = false;
-    virQEMUDriverConfigPtr cfg = NULL;
     int compressed = QEMU_SAVE_FORMAT_RAW;
     char *compressed_path = NULL;
 
@@ -14375,23 +14402,9 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
                                           JOB_MASK(QEMU_JOB_SUSPEND) |
                                           JOB_MASK(QEMU_JOB_MIGRATION_OP)));
 
-        cfg = virQEMUDriverGetConfig(driver);
-        if (cfg->snapshotImageFormat) {
-            compressed = qemuSaveCompressionTypeFromString(cfg->snapshotImageFormat);
-            if (compressed < 0) {
-                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                               _("Invalid snapshot image format specified "
-                                 "in configuration file"));
-                goto cleanup;
-            }
-
-            if (!qemuCompressProgramAvailable(compressed, &compressed_path)) {
-                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                               _("Compression program for image format "
-                                 "in configuration file isn't available"));
-                goto cleanup;
-            }
-        }
+        if (qemuCompressProgramPath(driver, &compressed_path,
+                                    QEMU_COMPRESS_PROG_SNAP) < 0)
+            goto cleanup;
 
         if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)))
             goto cleanup;
@@ -14469,7 +14482,6 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
 
     VIR_FREE(xml);
     VIR_FREE(compressed_path);
-    virObjectUnref(cfg);
     if (memory_unlink && ret < 0)
         unlink(snap->def->file);
 
-- 
1.8.3.1





More information about the libvir-list mailing list