
On Wed, Sep 28, 2011 at 12:13:35PM +0200, Jiri Denemark wrote:
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 */
ACK, that sounds right, and look so too :-) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/