]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Fix error reporting in qemuDomainSaveImageStartVM
authorJiri Denemark <jdenemar@redhat.com>
Tue, 18 Sep 2018 07:42:06 +0000 (09:42 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 19 Sep 2018 12:05:59 +0000 (14:05 +0200)
When restoring a domain from a compressed image, we launch an
intermediate process for decompressing the saved data. If QEMU fails to
load the data for some reason, we force close the stdin/stdout file
descriptors of the intermediate process and wait for it to die. However,
virCommandWait can report various errors which would overwrite the real
error from QEMU. Thus instead of getting something useful:

    internal error: process exited while connecting to monitor:
    2018-09-17T15:17:29.998910Z qemu-system-x86_64: can't apply global
    Skylake-Client-x86_64-cpu.osxsave=off: Property '.osxsave' not found

we could get an irrelevant error message:

    internal error: Child process (lzop -dc --ignore-warn) unexpected
    fatal signal 13

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_driver.c

index 809c13410cedb73057e8e7598524f14daaee507c..d3d25c4acf66c5a64f87cc721c6005d933034423 100644 (file)
@@ -6598,11 +6598,15 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
         restored = true;
 
     if (intermediatefd != -1) {
+        virErrorPtr orig_err = NULL;
+
         if (!restored) {
             /* if there was an error setting up qemu, the intermediate
              * process will wait forever to write to stdout, so we
-             * must manually kill it.
+             * must manually kill it and ignore any error related to
+             * the process
              */
+            orig_err = virSaveLastError();
             VIR_FORCE_CLOSE(intermediatefd);
             VIR_FORCE_CLOSE(*fd);
         }
@@ -6612,6 +6616,11 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
             restored = false;
         }
         VIR_DEBUG("Decompression binary stderr: %s", NULLSTR(errbuf));
+
+        if (orig_err) {
+            virSetError(orig_err);
+            virFreeError(orig_err);
+        }
     }
     VIR_FORCE_CLOSE(intermediatefd);