From e4a0e900d3a8915e7b03ebcc33b3ba830311d972 Mon Sep 17 00:00:00 2001 From: Jim Fehlig Date: Wed, 12 Feb 2014 16:06:41 -0700 Subject: [PATCH] libxl: use job functions when cleaning up a domain When explicitly destroying a domain (libxlDomainDestroyFlags), or handling an out-of-band domain shutdown event, cleanup the domain in the context of a job. Introduce libxlVmCleanupJob to wrap libxlVmCleanup in a job block. --- src/libxl/libxl_driver.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 36fc9f58b7..0c2c1d7ac9 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -316,6 +316,26 @@ libxlVmCleanup(libxlDriverPrivatePtr driver, virObjectUnref(cfg); } +/* + * Cleanup function for domain that has reached shutoff state. + * Executed in the context of a job. + * + * virDomainObjPtr should be locked on invocation + * Returns true if references remain on virDomainObjPtr, false otherwise. + */ +static bool +libxlVmCleanupJob(libxlDriverPrivatePtr driver, + virDomainObjPtr vm, + virDomainShutoffReason reason) +{ + if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_DESTROY) < 0) + return true; + + libxlVmCleanup(driver, vm, reason); + + return libxlDomainObjEndJob(driver, vm); +} + /* * Handle previously registered event notification from libxenlight. * @@ -364,10 +384,11 @@ libxlDomainShutdownThread(void *opaque) reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN; } libxl_domain_destroy(ctx, vm->def->id, NULL); - libxlVmCleanup(driver, vm, reason); - if (!vm->persistent) { - virDomainObjListRemove(driver->domains, vm); - vm = NULL; + if (libxlVmCleanupJob(driver, vm, reason)) { + if (!vm->persistent) { + virDomainObjListRemove(driver->domains, vm); + vm = NULL; + } } break; case LIBXL_SHUTDOWN_REASON_REBOOT: @@ -1561,10 +1582,11 @@ libxlDomainDestroyFlags(virDomainPtr dom, goto cleanup; } - libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED); - if (!vm->persistent) { - virDomainObjListRemove(driver->domains, vm); - vm = NULL; + if (libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED)) { + if (!vm->persistent) { + virDomainObjListRemove(driver->domains, vm); + vm = NULL; + } } ret = 0;