]> xenbits.xensource.com Git - libvirt.git/commitdiff
Don't overwrite error message during VM cleanup
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 1 Nov 2011 16:27:41 +0000 (16:27 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 1 Nov 2011 18:40:37 +0000 (18:40 +0000)
If an LXC VM fails to start, quite a few cleanup paths will
result in the original error message being overwritten. Some
other cleanup paths also forgot to actually terminate the VM.

* src/lxc/lxc_driver.c: Ensure VM is terminated on startup
  failure and preserve original error

src/lxc/lxc_driver.c

index 06bfa850b222ff48cde7344e7f033ad8b05e7579..3af7a300850ae3641a77282729a7b39703a07f1a 100644 (file)
@@ -1638,6 +1638,7 @@ static int lxcVmStart(virConnectPtr conn,
     char *timestamp;
     virCommandPtr cmd = NULL;
     lxcDomainObjPrivatePtr priv = vm->privateData;
+    virErrorPtr err = NULL;
 
     if (!lxc_driver->cgroup) {
         lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1769,8 +1770,7 @@ static int lxcVmStart(virConnectPtr conn,
                      _("guest failed to start: %s"), out);
         }
 
-        lxcVmTerminate(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
-        goto cleanup;
+        goto error;
     }
 
     if ((priv->monitorWatch = virEventAddHandle(
@@ -1778,31 +1778,32 @@ static int lxcVmStart(virConnectPtr conn,
              VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP,
              lxcMonitorEvent,
              vm, NULL)) < 0) {
-        lxcVmTerminate(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
-        goto cleanup;
+        goto error;
     }
 
     if (autoDestroy &&
         lxcProcessAutoDestroyAdd(driver, vm, conn) < 0)
-        goto cleanup;
+        goto error;
 
     /*
      * Again, need to save the live configuration, because the function
      * requires vm->def->id != -1 to save tty info surely.
      */
     if (virDomainSaveConfig(driver->stateDir, vm->def) < 0)
-        goto cleanup;
+        goto error;
 
     if (virDomainObjSetDefTransient(driver->caps, vm, false) < 0)
-        goto cleanup;
+        goto error;
 
     /* Write domain status to disk. */
     if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
-        goto cleanup;
+        goto error;
 
     rc = 0;
 
 cleanup:
+    if (rc != 0 && !err)
+        err = virSaveLastError();
     virCommandFree(cmd);
     if (VIR_CLOSE(logfd) < 0) {
         virReportSystemError(errno, "%s", _("could not close logfile"));
@@ -1821,7 +1822,18 @@ cleanup:
     VIR_FORCE_CLOSE(handshakefds[0]);
     VIR_FORCE_CLOSE(handshakefds[1]);
     VIR_FREE(logfile);
+
+    if (err) {
+        virSetError(err);
+        virResetError(err);
+    }
+
     return rc;
+
+error:
+    err = virSaveLastError();
+    lxcVmTerminate(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
+    goto cleanup;
 }
 
 /**