const virDomainDef *def,
qemuDomainObjPrivatePtr priv)
{
- bool allowReboot = true;
virQEMUCapsPtr qemuCaps = priv->qemuCaps;
/* Only add -no-reboot option if each event destroys domain */
- if (def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
- def->onPoweroff == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
- (def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
- def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY)) {
- allowReboot = false;
+ if (priv->allowReboot == VIR_TRISTATE_BOOL_NO)
virCommandAddArg(cmd, "-no-reboot");
- }
/* If JSON monitor is enabled, we can receive an event
* when QEMU stops. If we use no-shutdown, then we can
* watch for this event and do a soft/warm reboot.
*/
- if (priv->monJSON && allowReboot &&
+ if (priv->monJSON && priv->allowReboot == VIR_TRISTATE_BOOL_YES &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_SHUTDOWN)) {
virCommandAddArg(cmd, "-no-shutdown");
}
priv->namespaces = NULL;
priv->reconnectBlockjobs = VIR_TRISTATE_BOOL_ABSENT;
+ priv->allowReboot = VIR_TRISTATE_BOOL_ABSENT;
}
}
+static void
+qemuDomainObjPrivateXMLFormatAllowReboot(virBufferPtr buf,
+ virTristateBool allowReboot)
+{
+ virBufferAsprintf(buf, "<allowReboot value='%s'/>\n",
+ virTristateBoolTypeToString(allowReboot));
+
+}
+
+
static int
qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
virDomainObjPtr vm)
if (priv->chardevStdioLogd)
virBufferAddLit(buf, "<chardevStdioLogd/>\n");
+ qemuDomainObjPrivateXMLFormatAllowReboot(buf, priv->allowReboot);
+
if (qemuDomainObjPrivateXMLFormatBlockjobs(buf, vm) < 0)
return -1;
}
+static int
+qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
+ virTristateBool *allowReboot)
+{
+ int ret = -1;
+ int val;
+ char *valStr;
+
+ if ((valStr = virXPathString("string(./allowReboot/@value)", ctxt))) {
+ if ((val = virTristateBoolTypeFromString(valStr)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("invalid allowReboot value '%s'"), valStr);
+ goto cleanup;
+ }
+ *allowReboot = val;
+ }
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(valStr);
+ return ret;
+}
+
+
static int
qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
virDomainObjPtr vm,
priv->chardevStdioLogd = virXPathBoolean("boolean(./chardevStdioLogd)",
ctxt) == 1;
+ qemuDomainObjPrivateXMLParseAllowReboot(ctxt, &priv->allowReboot);
+
if (qemuDomainObjPrivateXMLParseBlockjobs(priv, ctxt) < 0)
goto error;
char *lockState;
bool fakeReboot;
+ virTristateBool allowReboot;
int jobs_queued;
}
+static void
+qemuProcessPrepareAllowReboot(virDomainObjPtr vm)
+{
+ virDomainDefPtr def = vm->def;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ if (priv->allowReboot != VIR_TRISTATE_BOOL_ABSENT)
+ return;
+
+ if (def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
+ def->onPoweroff == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
+ (def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
+ def->onCrash == VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY)) {
+ priv->allowReboot = VIR_TRISTATE_BOOL_NO;
+ } else {
+ priv->allowReboot = VIR_TRISTATE_BOOL_YES;
+ }
+}
+
+
/**
* qemuProcessPrepareDomain:
* @conn: connection object (for looking up storage volumes)
priv->chardevStdioLogd = true;
}
+ qemuProcessPrepareAllowReboot(vm);
+
/*
* Normally PCI addresses are assigned in the virDomainCreate
* or virDomainDefine methods. We might still need to assign
priv->gotShutdown = false;
+ /* Attaching to running QEMU so we need to detect whether it was started
+ * with -no-reboot. */
+ qemuProcessPrepareAllowReboot(vm);
+
/*
* Normally PCI addresses are assigned in the virDomainCreate
* or virDomainDefine methods. We might still need to assign
if (qemuDomainMasterKeyReadFile(priv) < 0)
goto error;
+ /* If we are connecting to a guest started by old libvirt there is no
+ * allowReboot in status XML and we need to initialize it. */
+ qemuProcessPrepareAllowReboot(obj);
+
VIR_DEBUG("Reconnect monitor to %p '%s'", obj, obj->def->name);
/* XXX check PID liveliness & EXE path */
"</devices>\n"
"<numad nodeset='0-2' cpuset='1,3'/>\n"
"<libDir path='/tmp'/>\n"
-"<channelTargetDir path='/tmp/channel'/>\n";
+"<channelTargetDir path='/tmp/channel'/>\n"
+"<allowReboot value='yes'/>\n";
static const char testStatusXMLSuffix[] =
"</domstatus>\n";