]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Fix possible race when pausing guest
authorPeter Krempa <pkrempa@redhat.com>
Thu, 1 Nov 2012 14:45:47 +0000 (15:45 +0100)
committerCole Robinson <crobinso@redhat.com>
Sun, 9 Dec 2012 21:22:48 +0000 (16:22 -0500)
When pausing the guest while migration is running (to speed up
convergence) the virDomainSuspend API checks if the migration job is
active before entering the job. This could cause a possible race if the
virDomainSuspend is called while the job is active but ends before the
Suspend API enters the job (this would require that the migration is
aborted). This would cause a incorrect event to be emitted.
(cherry picked from commit d0fc6dc8315b3172501e6fe09c8aed12598de47e)

src/qemu/qemu_driver.c

index 90ee99f4b14542e2b631d208d072374c953a31fb..100f06ccb78fbe1ff4740437b96a040e38ceb935 100644 (file)
@@ -1570,14 +1570,6 @@ static int qemudDomainSuspend(virDomainPtr dom) {
 
     priv = vm->privateData;
 
-    if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
-        reason = VIR_DOMAIN_PAUSED_MIGRATION;
-        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
-    } else {
-        reason = VIR_DOMAIN_PAUSED_USER;
-        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
-    }
-
     if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0)
         goto cleanup;
 
@@ -1587,6 +1579,14 @@ static int qemudDomainSuspend(virDomainPtr dom) {
         goto endjob;
     }
 
+    if (priv->job.asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT) {
+        reason = VIR_DOMAIN_PAUSED_MIGRATION;
+        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED;
+    } else {
+        reason = VIR_DOMAIN_PAUSED_USER;
+        eventDetail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
+    }
+
     state = virDomainObjGetState(vm, NULL);
     if (state == VIR_DOMAIN_PMSUSPENDED) {
         virReportError(VIR_ERR_OPERATION_INVALID,