diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6255d89310..a25daae866 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2224,6 +2224,9 @@ qemuDomainDestroyFlags(virDomainPtr dom, virObjectEventPtr event = NULL; qemuDomainObjPrivatePtr priv; unsigned int stopFlags = 0; + int state; + int reason; + bool starting; virCheckFlags(VIR_DOMAIN_DESTROY_GRACEFUL, -1); @@ -2235,13 +2238,29 @@ qemuDomainDestroyFlags(virDomainPtr dom, if (virDomainDestroyFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + goto cleanup; + } + + state = virDomainObjGetState(vm, &reason); + starting = (state == VIR_DOMAIN_PAUSED && + reason == VIR_DOMAIN_PAUSED_STARTING_UP && + !priv->beingDestroyed); + if (qemuProcessBeginStopJob(driver, vm, QEMU_JOB_DESTROY, !(flags & VIR_DOMAIN_DESTROY_GRACEFUL)) < 0) goto cleanup; if (!virDomainObjIsActive(vm)) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); + if (starting) { + VIR_DEBUG("Domain %s is not running anymore", vm->def->name); + ret = 0; + } else { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + } goto endjob; }