Currently, the bhyve driver reboot implementation does not take into account domain's on_reboot action. Update it so it shuts a domain down on reboot when it is configured this way. Additionally, introduce the bhyveDomainShutdownSignal() helper which shares a common shutdown and reboot implementation using a signal. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_driver.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 1f904d8958..0761e2682e 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1072,12 +1072,25 @@ bhyveDomainDestroy(virDomainPtr dom) return bhyveDomainDestroyFlags(dom, 0); } +static int +bhyveDomainShutdownSignal(virDomainObj *vm, + bool isReboot) +{ + bhyveDomainObjPrivate *priv; + + if (isReboot) { + priv = vm->privateData; + bhyveMonitorSetReboot(priv->mon); + } + + return virBhyveProcessShutdown(vm); +} + static int bhyveDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { virDomainObj *vm; int ret = -1; - bhyveDomainObjPrivate *priv; bool isReboot = false; virCheckFlags(0, -1); @@ -1097,11 +1110,7 @@ bhyveDomainShutdownFlags(virDomainPtr dom, unsigned int flags) if (virDomainObjCheckActive(vm) < 0) goto cleanup; - if (isReboot) { - priv = vm->privateData; - bhyveMonitorSetReboot(priv->mon); - } - ret = virBhyveProcessShutdown(vm); + ret = bhyveDomainShutdownSignal(vm, isReboot); cleanup: virDomainObjEndAPI(&vm); @@ -1119,7 +1128,7 @@ bhyveDomainReboot(virDomainPtr dom, unsigned int flags) { virConnectPtr conn = dom->conn; virDomainObj *vm; - bhyveDomainObjPrivate *priv; + bool isReboot = true; int ret = -1; virCheckFlags(VIR_DOMAIN_REBOOT_ACPI_POWER_BTN, -1); @@ -1127,16 +1136,19 @@ bhyveDomainReboot(virDomainPtr dom, unsigned int flags) if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; + if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY || + vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE) { + isReboot = false; + VIR_INFO("Domain on_reboot setting overridden, shutting down"); + } + if (virDomainRebootEnsureACL(conn, vm->def, flags) < 0) goto cleanup; if (virDomainObjCheckActive(vm) < 0) goto cleanup; - priv = vm->privateData; - bhyveMonitorSetReboot(priv->mon); - - ret = virBhyveProcessShutdown(vm); + ret = bhyveDomainShutdownSignal(vm, isReboot); cleanup: virDomainObjEndAPI(&vm); -- 2.52.0