]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: use job functions when cleaning up a domain
authorJim Fehlig <jfehlig@suse.com>
Wed, 12 Feb 2014 23:06:41 +0000 (16:06 -0700)
committerJim Fehlig <jfehlig@suse.com>
Wed, 19 Feb 2014 18:10:00 +0000 (11:10 -0700)
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

index 36fc9f58b7f4830a93c12d8768bcc4b969974408..0c2c1d7ac923cbf2c2bbdf2ccdb503d431dcdfd2 100644 (file)
@@ -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;