]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Transition domain to PAUSED after 'stop' command
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 19 Sep 2012 09:23:11 +0000 (11:23 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 20 Sep 2012 08:15:27 +0000 (10:15 +0200)
Currently, we mark domain PAUSED (but not emit an event)
just before we issue 'stop' on monitor; This command can
take ages to finish, esp. when domain's doing a lot of
IO - users can enforce qemu to open files with O_DIRECT
which doesn't return from write() until data reaches the
block device. Having said that, we report PAUSED even if
domain is not paused yet.

src/qemu/qemu_process.c

index c28f5a564da770d1f0404f04e0270615b32bca1c..b6eb342c707e612a02ec9afe971fd51261b93e96 100644 (file)
@@ -2708,13 +2708,9 @@ int qemuProcessStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm,
                         enum qemuDomainAsyncJob asyncJob)
 {
     int ret;
-    int oldState;
-    int oldReason;
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
     VIR_FREE(priv->lockState);
-    oldState = virDomainObjGetState(vm, &oldReason);
-    virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason);
 
     ret = qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob);
     if (ret == 0) {
@@ -2723,11 +2719,10 @@ int qemuProcessStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm,
     }
 
     if (ret == 0) {
+        virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason);
         if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
             VIR_WARN("Unable to release lease on %s", vm->def->name);
         VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
-    } else {
-        virDomainObjSetState(vm, oldState, oldReason);
     }
 
     return ret;