]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: migration: Check domain live state after exitting the monitor
authorPeter Krempa <pkrempa@redhat.com>
Tue, 12 Aug 2014 13:21:56 +0000 (15:21 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 12 Aug 2014 15:32:28 +0000 (17:32 +0200)
In qemuMigrationToFile we enter the monitor multiple times and don't
check if the VM is still alive after returning form the monitor. Add the
checks to skip pieces of code in case the VM crashes while saving it's
state.

src/qemu/qemu_migration.c

index 767d8406356d60fb1be385c12aface4a5b130733..50a1eabc70608c4afa26d02d20b66530e2595b39 100644 (file)
@@ -4731,6 +4731,13 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
         qemuDomainObjExitMonitor(driver, vm);
     }
 
+    if (!virDomainObjIsActive(vm)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("guest unexpectedly quit"));
+        /* nothing to tear down */
+        return -1;
+    }
+
     if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) &&
         (!compressor || pipe(pipeFD) == 0)) {
         /* All right! We can use fd migration, which means that qemu
@@ -4818,6 +4825,12 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
     }
     qemuDomainObjExitMonitor(driver, vm);
 
+    if (!virDomainObjIsActive(vm)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("guest unexpectedly quit"));
+        goto cleanup;
+    }
+
     if (rc < 0)
         goto cleanup;
 
@@ -4827,7 +4840,8 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
         if (rc == -2) {
             orig_err = virSaveLastError();
             virCommandAbort(cmd);
-            if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
+            if (virDomainObjIsActive(vm) &&
+                qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
                 qemuMonitorMigrateCancel(priv->mon);
                 qemuDomainObjExitMonitor(driver, vm);
             }
@@ -4845,7 +4859,8 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
         orig_err = virSaveLastError();
 
     /* Restore max migration bandwidth */
-    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
+    if (virDomainObjIsActive(vm) &&
+        qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
         qemuMonitorSetMigrationSpeed(priv->mon, saveMigBandwidth);
         priv->migMaxBandwidth = saveMigBandwidth;
         qemuDomainObjExitMonitor(driver, vm);