]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Run lzop with '--ignore-warn'
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 19 Feb 2013 17:07:58 +0000 (18:07 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 20 Feb 2013 17:10:01 +0000 (18:10 +0100)
Currently, if lzop decompression binary produces a warning, it
doesn't exit with zero status but 2 instead. Terrifying, but
true. However, warnings may be ignored using '--ignore-warn'
command line argument.  Moreover, in which case, the exit status
will be zero.

src/qemu/qemu_driver.c

index 7eb5f5dd8f6b6481a9c87ecca5a1cccf4d3cb2d7..be01ec6509e4ef9fd42f1dd25ebec410cc40d2a8 100644 (file)
@@ -2507,6 +2507,33 @@ qemuCompressProgramName(int compress)
             qemuSaveCompressionTypeToString(compress));
 }
 
+static virCommandPtr
+qemuCompressGetCommand(virQEMUSaveFormat compression)
+{
+    virCommandPtr ret = NULL;
+    const char *prog = qemuSaveCompressionTypeToString(compression);
+
+    if (!prog) {
+        virReportError(VIR_ERR_OPERATION_FAILED,
+                       _("Invalid compressed save format %d"),
+                       compression);
+        return NULL;
+    }
+
+    ret = virCommandNew(prog);
+    virCommandAddArg(ret, "-dc");
+
+    switch (compression) {
+    case QEMU_SAVE_FORMAT_LZOP:
+        virCommandAddArg(ret, "--ignore-warn");
+        break;
+    default:
+        break;
+    }
+
+    return ret;
+}
+
 /* Internal function to properly create or open existing files, with
  * ownership affected by qemu driver setup.  */
 static int
@@ -4775,32 +4802,22 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
     if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
         goto cleanup;
 
-    if (header->version == 2) {
-        const char *prog = qemuSaveCompressionTypeToString(header->compressed);
-        if (prog == NULL) {
-            virReportError(VIR_ERR_OPERATION_FAILED,
-                           _("Invalid compressed save format %d"),
-                           header->compressed);
+    if ((header->version == 2) &&
+        (header->compressed != QEMU_SAVE_FORMAT_RAW)) {
+        if (!(cmd = qemuCompressGetCommand(header->compressed)))
             goto cleanup;
-        }
 
-        if (header->compressed != QEMU_SAVE_FORMAT_RAW) {
-            cmd = virCommandNewArgList(prog, "-dc", NULL);
-            intermediatefd = *fd;
-            *fd = -1;
+        intermediatefd = *fd;
+        *fd = -1;
 
-            virCommandSetInputFD(cmd, intermediatefd);
-            virCommandSetOutputFD(cmd, fd);
-            virCommandSetErrorBuffer(cmd, &errbuf);
-            virCommandDoAsyncIO(cmd);
+        virCommandSetInputFD(cmd, intermediatefd);
+        virCommandSetOutputFD(cmd, fd);
+        virCommandSetErrorBuffer(cmd, &errbuf);
+        virCommandDoAsyncIO(cmd);
 
-            if (virCommandRunAsync(cmd, NULL) < 0) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("Failed to start decompression binary %s"),
-                               prog);
-                *fd = intermediatefd;
-                goto cleanup;
-            }
+        if (virCommandRunAsync(cmd, NULL) < 0) {
+            *fd = intermediatefd;
+            goto cleanup;
         }
     }