On 21.02.2014 00:02, Jim Fehlig wrote: > The libxl driver was ignoring the <on_*> domain event configuration, > causing e.g. a domain to be rebooted even when on_reboot is set to > destroy. > > This patch honors the <on_*> configuration in the shutdown event > handler. > > Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> > --- > src/libxl/libxl_driver.c | 83 +++++++++++++++++++++++++++++++++--------------- > 1 file changed, 57 insertions(+), 26 deletions(-) > > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index c7c7b4f..721577d 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -372,38 +372,69 @@ libxlDomainShutdownThread(void *opaque) > > virObjectLock(vm); > > - switch (xl_reason) { > - case LIBXL_SHUTDOWN_REASON_POWEROFF: > - case LIBXL_SHUTDOWN_REASON_CRASH: > - if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) { > - dom_event = virDomainEventLifecycleNewFromObj(vm, > + if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) { > + dom_event = virDomainEventLifecycleNewFromObj(vm, > + VIR_DOMAIN_EVENT_STOPPED, > + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > + switch (vm->def->onPoweroff) { > + case VIR_DOMAIN_LIFECYCLE_DESTROY: > + reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; > + goto destroy; > + case VIR_DOMAIN_LIFECYCLE_RESTART: > + case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: > + goto restart; > + case VIR_DOMAIN_LIFECYCLE_PRESERVE: > + goto cleanup; > + } > + } else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) { > + dom_event = virDomainEventLifecycleNewFromObj(vm, > VIR_DOMAIN_EVENT_STOPPED, > VIR_DOMAIN_EVENT_STOPPED_CRASHED); > - reason = VIR_DOMAIN_SHUTOFF_CRASHED; > - } else { > - dom_event = virDomainEventLifecycleNewFromObj(vm, > + switch (vm->def->onCrash) { > + case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY: > + reason = VIR_DOMAIN_SHUTOFF_CRASHED; > + goto destroy; > + case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART: > + case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME: > + goto restart; > + case VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE: > + goto cleanup; > + } > + } else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) { > + dom_event = virDomainEventLifecycleNewFromObj(vm, > VIR_DOMAIN_EVENT_STOPPED, > VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > - reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; > - } > - libxl_domain_destroy(ctx, vm->def->id, NULL); > - if (libxlVmCleanupJob(driver, vm, reason)) { > - if (!vm->persistent) { > - virDomainObjListRemove(driver->domains, vm); > - vm = NULL; > - } > - } > - break; > - case LIBXL_SHUTDOWN_REASON_REBOOT: > - libxl_domain_destroy(ctx, vm->def->id, NULL); > - libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); > - libxlVmStart(driver, vm, 0, -1); > - break; > - default: > - VIR_INFO("Unhandled shutdown_reason %d", xl_reason); > - break; > + switch (vm->def->onReboot) { > + case VIR_DOMAIN_LIFECYCLE_DESTROY: > + reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; > + goto destroy; > + case VIR_DOMAIN_LIFECYCLE_RESTART: > + case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: > + goto restart; > + case VIR_DOMAIN_LIFECYCLE_PRESERVE: > + goto cleanup; > + } > + } else { > + VIR_INFO("Unhandled shutdown_reason %d", xl_reason); > + goto cleanup; > } > > +destroy: > + libxl_domain_destroy(ctx, vm->def->id, NULL); > + if (libxlVmCleanupJob(driver, vm, reason)) { Funny, my gcc-4.8.2 warns me about @reason may be used uninitialized here. > + if (!vm->persistent) { > + virDomainObjListRemove(driver->domains, vm); > + vm = NULL; > + } > + } > + goto cleanup; > + > +restart: > + libxl_domain_destroy(ctx, vm->def->id, NULL); > + libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); Right. You've already notice that needs to be libxlVmCleanupJob(). > + libxlVmStart(driver, vm, 0, -1); > + > +cleanup: > if (vm) > virObjectUnlock(vm); > if (dom_event) > ACK with this squashed in: diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 721577d..0b9bf7d 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -368,7 +368,7 @@ libxlDomainShutdownThread(void *opaque) libxl_ctx *ctx = priv->ctx; virObjectEventPtr dom_event = NULL; libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason; - virDomainShutoffReason reason; + virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; virObjectLock(vm); @@ -376,7 +376,7 @@ libxlDomainShutdownThread(void *opaque) dom_event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); - switch (vm->def->onPoweroff) { + switch ((enum virDomainLifecycleAction) vm->def->onPoweroff) { case VIR_DOMAIN_LIFECYCLE_DESTROY: reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; goto destroy; @@ -384,13 +384,14 @@ libxlDomainShutdownThread(void *opaque) case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: goto restart; case VIR_DOMAIN_LIFECYCLE_PRESERVE: + case VIR_DOMAIN_LIFECYCLE_LAST: goto cleanup; } } else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) { dom_event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_CRASHED); - switch (vm->def->onCrash) { + switch ((enum virDomainLifecycleCrashAction) vm->def->onCrash) { case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY: reason = VIR_DOMAIN_SHUTOFF_CRASHED; goto destroy; @@ -398,13 +399,16 @@ libxlDomainShutdownThread(void *opaque) case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME: goto restart; case VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE: + case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY: + case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART: + case VIR_DOMAIN_LIFECYCLE_CRASH_LAST: goto cleanup; } } else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) { dom_event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); - switch (vm->def->onReboot) { + switch ((enum virDomainLifecycleAction) vm->def->onReboot) { case VIR_DOMAIN_LIFECYCLE_DESTROY: reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; goto destroy; @@ -412,6 +416,7 @@ libxlDomainShutdownThread(void *opaque) case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: goto restart; case VIR_DOMAIN_LIFECYCLE_PRESERVE: + case VIR_DOMAIN_LIFECYCLE_LAST: goto cleanup; } } else { @@ -431,7 +436,7 @@ destroy: restart: libxl_domain_destroy(ctx, vm->def->id, NULL); - libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); + libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); libxlVmStart(driver, vm, 0, -1); cleanup: Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list