From b8e25c35d7f80a2fadc0e51e95318e39db3d1687 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 25 Feb 2013 18:52:12 +0100 Subject: [PATCH] qemu: Don't fail to shutdown domains with unresponsive agent Currently, qemuDomainShutdownFlags() chooses the agent method of shutdown whenever the agent is configured. However, this assumption is not enough as the guest agent may be unresponsive at the moment. So unless guest agent method has been explicitly requested, we should fall back to the ACPI method. --- src/qemu/qemu_driver.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 825babd4a6..d40b5d5467 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1702,40 +1702,40 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { virDomainObjPtr vm; int ret = -1; qemuDomainObjPrivatePtr priv; - bool useAgent = false; + bool useAgent = false, agentRequested, acpiRequested; virCheckFlags(VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN | VIR_DOMAIN_SHUTDOWN_GUEST_AGENT, -1); - /* At most one of these two flags should be set. */ - if ((flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) && - (flags & VIR_DOMAIN_SHUTDOWN_GUEST_AGENT)) { - virReportInvalidArg(flags, "%s", - _("flags for acpi power button and guest agent are mutually exclusive")); - return -1; - } - if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; priv = vm->privateData; + agentRequested = flags & VIR_DOMAIN_SHUTDOWN_GUEST_AGENT; + acpiRequested = flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN; - if ((flags & VIR_DOMAIN_SHUTDOWN_GUEST_AGENT) || - (!(flags & VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN) && - priv->agent)) + /* Prefer agent unless we were requested to not to. */ + if (agentRequested || (!flags && priv->agent)) useAgent = true; - if (useAgent) { - if (priv->agentError) { + if (priv->agentError) { + if (agentRequested && !acpiRequested) { virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s", _("QEMU guest agent is not " "available due to an error")); goto cleanup; + } else { + useAgent = false; } - if (!priv->agent) { + } + + if (!priv->agent) { + if (agentRequested && !acpiRequested) { virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", _("QEMU guest agent is not configured")); goto cleanup; + } else { + useAgent = false; } } @@ -1752,7 +1752,13 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { qemuDomainObjEnterAgent(vm); ret = qemuAgentShutdown(priv->agent, QEMU_AGENT_SHUTDOWN_POWERDOWN); qemuDomainObjExitAgent(vm); - } else { + } + + /* If we are not enforced to use just an agent, try ACPI + * shutdown as well in case agent did not succeed. + */ + if (!useAgent || + (ret < 0 && (acpiRequested || !flags))) { qemuDomainSetFakeReboot(driver, vm, false); qemuDomainObjEnterMonitor(driver, vm); -- 2.47.2