Make virBhyveProcessStopImpl() not override an error. It is called
from various cleanup routines and should preserve the original error.

Update virBhyveProcessStart() to preserve the original error
around the STOPPED and RELEASE hooks.

Additionally, relax error handling for devicemap removal in
virBhyveProcessStartImpl(), since it is not critical enough to raise
an error.

Signed-off-by: Roman Bogorodskiy <[email protected]>
Reviewed-by: Michal Privoznik <[email protected]>
---
Changes since v1:

 - Instead of trying to preserve errors in virBhyveProcessStartImpl(),
   update virBhyveProcessStopImpl() not to override errors.

 src/bhyve/bhyve_process.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
index 65cf61c578..a255b799b2 100644
--- a/src/bhyve/bhyve_process.c
+++ b/src/bhyve/bhyve_process.c
@@ -433,8 +433,8 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver,
     if (devicemap != NULL) {
         rc = unlink(devmap_file);
         if (rc < 0 && errno != ENOENT)
-            virReportSystemError(errno, _("cannot unlink file '%1$s'"),
-                                 devmap_file);
+            VIR_WARN("cannot unlink file '%s': %s",
+                     devmap_file, g_strerror(errno));
     }
 
     if (ret < 0)
@@ -593,6 +593,8 @@ virBhyveProcessStart(bhyveConn *driver,
                      virDomainRunningReason reason,
                      unsigned int flags)
 {
+    virErrorPtr save_err = NULL;
+
     if (virDomainObjSetDefTransient(driver->xmlopt, vm, NULL) < 0)
         return -1;
 
@@ -612,9 +614,11 @@ virBhyveProcessStart(bhyveConn *driver,
     return virBhyveProcessStartImpl(driver, vm, reason);
 
  cleanup:
+    virErrorPreserveLast(&save_err);
     bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_STOPPED);
     bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_RELEASE);
     virDomainObjRemoveTransientDef(vm);
+    virErrorRestore(&save_err);
 
     return -1;
 }
@@ -660,6 +664,9 @@ virBhyveProcessStopImpl(struct _bhyveConn *driver,
     g_autoptr(virCommand) cmd = NULL;
     bhyveDomainObjPrivate *priv = vm->privateData;
     bool vm_started = false;
+    virErrorPtr save_err = NULL;
+
+    virErrorPreserveLast(&save_err);
 
     if (vm->pid != 0)
         vm_started = true;
@@ -667,14 +674,15 @@ virBhyveProcessStopImpl(struct _bhyveConn *driver,
     if (!forceCleanup) {
         if (!virDomainObjIsActive(vm)) {
             VIR_DEBUG("VM '%s' not active", vm->def->name);
-            return 0;
+            goto cleanup;
         }
 
         if (!vm_started) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Invalid PID %1$d for VM"),
                            (int)vm->pid);
-            return -1;
+            ret = -1;
+            goto cleanup;
         }
     }
 
@@ -735,6 +743,8 @@ virBhyveProcessStopImpl(struct _bhyveConn *driver,
     if (restoreDef)
         virDomainObjRemoveTransientDef(vm);
 
+ cleanup:
+    virErrorRestore(&save_err);
     return ret;
 }
 
-- 
2.55.0

Reply via email to