[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH V4 6/6] libxlDomainStart: correct cleanup after failure



Functions like libxlNetworkPrepareDevices, libxlBuildDomainConfig,
virHostdevPrepareDomainDevices will allocate and reserve some
resources. In libxlDomainStart, after calling these functions,
in case of failure, we need to call libxlDomainCleanup to check
and release resoureces.
Besides, since libxlDomainCleanup will call virDomainLockProcessPause,
so we move virDomainLockProcessStart/Resume to earlier stage.

Signed-off-by: Chunyan Liu <cyliu suse com>
---
 src/libxl/libxl_domain.c | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index d11bf3a..6855ce4 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -1083,20 +1083,13 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
                                     vm, true) < 0)
         goto cleanup;
 
-    if (libxlNetworkPrepareDevices(vm->def) < 0)
-        goto cleanup;
-
-    if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def,
-                               cfg->ctx, &d_config) < 0)
-        goto cleanup;
-
-    if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0)
-        goto cleanup;
-
-    if (virHostdevPrepareDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
-                                       vm->def, VIR_HOSTDEV_SP_PCI) < 0)
-        goto cleanup;
-
+    /* libxlNetworkPrepareDevices, libxlBuildDomainConfig,
+     * virHostdevPrepareDomainDevices will allocate and reserve
+     * some resources. In case of failure, need to release
+     * resoureces. This can be done by calling libxlDomainCleanup.
+     * Since libxlDomainCleanup will call virDomainLockProcessPause,
+     * so we move virDomainLockProcessStart/Resume to here.
+     */
     if (virDomainLockProcessStart(driver->lockManager,
                                   "xen:///system",
                                   vm,
@@ -1111,6 +1104,20 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
         goto cleanup;
     VIR_FREE(priv->lockState);
 
+    if (libxlNetworkPrepareDevices(vm->def) < 0)
+        goto release_dom;
+
+    if (libxlBuildDomainConfig(driver->reservedGraphicsPorts, vm->def,
+                               cfg->ctx, &d_config) < 0)
+        goto release_dom;
+
+    if (cfg->autoballoon && libxlDomainFreeMem(cfg->ctx, &d_config) < 0)
+        goto release_dom;
+
+    if (virHostdevPrepareDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
+                                       vm->def, VIR_HOSTDEV_SP_PCI) < 0)
+        goto release_dom;
+
     /* Unlock virDomainObj while creating the domain */
     virObjectUnlock(vm);
 
@@ -1194,16 +1201,12 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
 
  cleanup_dom:
     ret = -1;
-    if (priv->deathW) {
-        libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
-        priv->deathW = NULL;
-    }
     libxlDomainDestroyInternal(driver, vm);
     vm->def->id = -1;
     virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);
 
  release_dom:
-    virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState);
+    libxlDomainCleanup(driver, vm);
 
  cleanup:
     libxl_domain_config_dispose(&d_config);
-- 
2.1.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]