diff --git a/src/libvirt.c b/src/libvirt.c index e0ac391dac..b034ed6fe1 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -2329,6 +2329,8 @@ virDomainRef(virDomainPtr domain) * hypervisor level will stay allocated. Use virDomainResume() to reactivate * the domain. * This function may require privileged access. + * Moreover, suspend may not be supported if domain is in some + * special state like VIR_DOMAIN_PMSUSPENDED. * * Returns 0 in case of success and -1 in case of failure. */ @@ -2375,6 +2377,8 @@ error: * Resume a suspended domain, the process is restarted from the state where * it was frozen by calling virDomainSuspend(). * This function may require privileged access + * Moreover, resume may not be supported if domain is in some + * special state like VIR_DOMAIN_PMSUSPENDED. * * Returns 0 in case of success and -1 in case of failure. */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3948beff48..205154e23e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1572,6 +1572,7 @@ static int qemudDomainSuspend(virDomainPtr dom) { qemuDomainObjPrivatePtr priv; virDomainPausedReason reason; int eventDetail; + int state; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1607,7 +1608,13 @@ static int qemudDomainSuspend(virDomainPtr dom) { "%s", _("domain is not running")); goto endjob; } - if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PAUSED) { + + state = virDomainObjGetState(vm, NULL); + if (state == VIR_DOMAIN_PMSUSPENDED) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is pmsuspended")); + goto endjob; + } else if (state != VIR_DOMAIN_PAUSED) { if (qemuProcessStopCPUs(driver, vm, reason, QEMU_ASYNC_JOB_NONE) < 0) { goto endjob; } @@ -1639,6 +1646,7 @@ static int qemudDomainResume(virDomainPtr dom) { virDomainObjPtr vm; int ret = -1; virDomainEventPtr event = NULL; + int state; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1659,7 +1667,13 @@ static int qemudDomainResume(virDomainPtr dom) { "%s", _("domain is not running")); goto endjob; } - if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) { + + state = virDomainObjGetState(vm, NULL); + if (state == VIR_DOMAIN_PMSUSPENDED) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is pmsuspended")); + goto endjob; + } else if (state == VIR_DOMAIN_PAUSED) { if (qemuProcessStartCPUs(driver, vm, dom->conn, VIR_DOMAIN_RUNNING_UNPAUSED, QEMU_ASYNC_JOB_NONE) < 0) {