]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Refuse to abort migration in post-copy mode
authorJiri Denemark <jdenemar@redhat.com>
Thu, 14 Jan 2016 23:10:37 +0000 (00:10 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 21 Mar 2016 14:15:46 +0000 (15:15 +0100)
In post-copy mode none of the hosts has a complete guest state and
rolling back migration is impossible. Thus aborting it would be
equivalent to destroying the domain.

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

index 052673102f0d44e1c28e59d5d9003b6482b42818..b405027398ab43ee4ab732323531c5d145bb68bf 100644 (file)
@@ -13087,6 +13087,7 @@ static int qemuDomainAbortJob(virDomainPtr dom)
     virDomainObjPtr vm;
     int ret = -1;
     qemuDomainObjPrivatePtr priv;
+    int reason;
 
     if (!(vm = qemuDomObjFromDomain(dom)))
         goto cleanup;
@@ -13109,13 +13110,24 @@ static int qemuDomainAbortJob(virDomainPtr dom)
         virReportError(VIR_ERR_OPERATION_INVALID,
                        "%s", _("no job is active on the domain"));
         goto endjob;
-    } else if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_IN) {
+    }
+
+    if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_IN) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                        _("cannot abort incoming migration;"
                          " use virDomainDestroy instead"));
         goto endjob;
     }
 
+    if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT &&
+        (priv->job.current->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY ||
+         (virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED &&
+          reason == VIR_DOMAIN_PAUSED_POSTCOPY))) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot abort migration in post-copy mode"));
+        goto endjob;
+    }
+
     VIR_DEBUG("Cancelling job at client request");
     qemuDomainObjAbortAsyncJob(vm);
     qemuDomainObjEnterMonitor(driver, vm);