Thus, when libvirtd is restarted, it will know if a domain is supposed
to be killed or reset when it shuts down.
---
src/qemu/qemu_domain.c | 21 +++++++++++++++++++++
src/qemu/qemu_domain.h | 4 ++++
src/qemu/qemu_driver.c | 11 +++++------
src/qemu/qemu_process.c | 4 ++--
4 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 4023648..320a35c 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -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);
+}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 00cfa3a..3b09419 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -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__ */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0d0bea2..8cbb850 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -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
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 106a47c..4c6b4a4 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -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 */
--
1.7.6.1