From: Peter Krempa <[email protected]>

Preserve the error on cleanup path as cleanup of the 'libivrt_iohelper'
process may overwrite it with an unactionable error, such as when
attempting to restore a save image while the VM is already running:

  $ virsh list
   Id   Name       State
  --------------------------
   9    cd         running

  $ virsh restore /tmp/cd.save
  error: Failed to restore domain from /tmp/cd.save
  error: internal error: Child process (LIBVIRT_LOG_OUTPUTS=1:stderr 
/home/pipo/build/libvirt/gcc/src/libvirt_iohelper /tmp/cd.save 0) unexpected 
fatal signal 13

After this patch the original error is reported:

  $ virsh restore /tmp/cd.save
  error: Failed to restore domain from /tmp/cd.save
  error: Requested operation is not valid: domain 'cd' is already active

Signed-off-by: Peter Krempa <[email protected]>
---
 src/qemu/qemu_driver.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 61d95bfbbf..25ba6695bb 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5985,6 +5985,7 @@ qemuDomainRestoreInternal(virQEMUDriver *driver,
     bool sparse = false;
     bool bypass_cache = (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0;
     g_autoptr(qemuMigrationParams) restoreParams = NULL;
+    virErrorPtr save_err = NULL;

     virCheckFlags(QEMU_DOMAIN_RESTORE_FLAGS, -1);

@@ -6109,6 +6110,7 @@ qemuDomainRestoreInternal(virQEMUDriver *driver,
         qemuProcessEndJob(vmNew);

  cleanup:
+    virErrorPreserveLast(&save_err);
     VIR_FORCE_CLOSE(fd);
     if (virFileWrapperFdClose(wrapperFd) < 0)
         ret = -1;
@@ -6117,6 +6119,7 @@ qemuDomainRestoreInternal(virQEMUDriver *driver,
     if (vmNew && ret < 0)
         qemuDomainRemoveInactive(vmNew, 0, false);
     virDomainObjEndAPI(&vmNew);
+    virErrorRestore(&save_err);
     return ret;
 }

-- 
2.55.0

Reply via email to