提交 bd83b2a3 编写于 作者: J Jiri Denemark

qemu: Preserve fakeReboot flag in domain status

Thus, when libvirtd is restarted, it will know if a domain is supposed
to be killed or reset when it shuts down.
上级 cc0e4e8d
......@@ -302,6 +302,9 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
virBufferAddLit(buf, "/>\n");
}
if (priv->fakeReboot)
virBufferAsprintf(buf, " <fakereboot/>\n");
return 0;
}
......@@ -445,6 +448,8 @@ static int qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
}
}
priv->fakeReboot = virXPathBoolean("boolean(./fakereboot)", ctxt) == 1;
return 0;
error:
......@@ -1566,3 +1571,19 @@ qemuDomainRemoveInactive(struct qemud_driver *driver,
}
virDomainRemoveInactive(&driver->domains, vm);
}
void
qemuDomainSetFakeReboot(struct qemud_driver *driver,
virDomainObjPtr vm,
bool value)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
if (priv->fakeReboot == value)
return;
priv->fakeReboot = value;
if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
VIR_WARN("Failed to save status on vm %s", vm->def->name);
}
......@@ -273,4 +273,8 @@ int qemuDomainSnapshotDiscardAllMetadata(struct qemud_driver *driver,
void qemuDomainRemoveInactive(struct qemud_driver *driver,
virDomainObjPtr vm);
void qemuDomainSetFakeReboot(struct qemud_driver *driver,
virDomainObjPtr vm,
bool value);
#endif /* __QEMU_DOMAIN_H__ */
......@@ -1512,13 +1512,13 @@ static int qemuDomainShutdown(virDomainPtr dom) {
goto endjob;
}
qemuDomainSetFakeReboot(driver, vm, false);
priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemPowerdown(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
priv->fakeReboot = false;
endjob:
if (qemuDomainObjEndJob(driver, vm) == 0)
vm = NULL;
......@@ -1575,7 +1575,8 @@ static int qemuDomainReboot(virDomainPtr dom, unsigned int flags) {
ret = qemuMonitorSystemPowerdown(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
priv->fakeReboot = true;
if (ret == 0)
qemuDomainSetFakeReboot(driver, vm, true);
endjob:
if (qemuDomainObjEndJob(driver, vm) == 0)
......@@ -1616,7 +1617,6 @@ qemuDomainDestroyFlags(virDomainPtr dom,
virDomainObjPtr vm;
int ret = -1;
virDomainEventPtr event = NULL;
qemuDomainObjPrivatePtr priv;
virCheckFlags(0, -1);
......@@ -1630,8 +1630,7 @@ qemuDomainDestroyFlags(virDomainPtr dom,
goto cleanup;
}
priv = vm->privateData;
priv->fakeReboot = false;
qemuDomainSetFakeReboot(driver, vm, false);
/* Although qemuProcessStop does this already, there may
* be an outstanding job active. We want to make sure we
......
......@@ -442,7 +442,7 @@ qemuProcessShutdownOrReboot(virDomainObjPtr vm)
priv->gotShutdown = true;
if (priv->fakeReboot) {
priv->fakeReboot = false;
qemuDomainSetFakeReboot(qemu_driver, vm, false);
virDomainObjRef(vm);
virThread th;
if (virThreadCreate(&th,
......@@ -2846,7 +2846,7 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup;
vm->def->id = driver->nextvmid++;
priv->fakeReboot = false;
qemuDomainSetFakeReboot(driver, vm, false);
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_UNKNOWN);
/* Run an early hook to set-up missing devices */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册