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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list