[libvirt] [PATCH] bhyve: don't leak tap devices on failures

Roman Bogorodskiy bogorodskiy at gmail.com
Sun Mar 30 12:53:07 UTC 2014


On failures, virBhyveProcessStart() does not cleanup network
interfaces that could be created by virBhyveProcessBuildBhyveCmd(),
which results in a leaked tap device.

To fix that, extract network cleanup code to bhyveNetCleanup()
and use it in cleanup stage of virBhyveProcessStart().
---
 src/bhyve/bhyve_process.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
index b37855e..a557bc5 100644
--- a/src/bhyve/bhyve_process.c
+++ b/src/bhyve/bhyve_process.c
@@ -63,6 +63,24 @@ bhyveProcessAutoDestroy(virDomainObjPtr vm,
     return vm;
 }
 
+static void
+bhyveNetCleanup(virDomainObjPtr vm)
+{
+    size_t i;
+
+    for (i = 0; i < vm->def->nnets; i++) {
+        virDomainNetDefPtr net = vm->def->nets[i];
+        int actualType = virDomainNetGetActualType(net);
+
+        if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
+            ignore_value(virNetDevBridgeRemovePort(
+                            virDomainNetGetActualBridgeName(net),
+                            net->ifname));
+            ignore_value(virNetDevTapDelete(net->ifname));
+        }
+    }
+}
+
 int
 virBhyveProcessStart(virConnectPtr conn,
                      bhyveConnPtr driver,
@@ -167,6 +185,8 @@ virBhyveProcessStart(virConnectPtr conn,
             ignore_value(virCommandRun(destroy_cmd, NULL));
             virCommandFree(destroy_cmd);
         }
+
+        bhyveNetCleanup(vm);
     }
 
     virCommandFree(load_cmd);
@@ -181,7 +201,6 @@ virBhyveProcessStop(bhyveConnPtr driver,
                     virDomainObjPtr vm,
                     virDomainShutoffReason reason ATTRIBUTE_UNUSED)
 {
-    size_t i;
     int ret = -1;
     virCommandPtr cmd = NULL;
 
@@ -203,17 +222,8 @@ virBhyveProcessStop(bhyveConnPtr driver,
                  vm->def->name,
                  (int)vm->pid);
 
-    for (i = 0; i < vm->def->nnets; i++) {
-        virDomainNetDefPtr net = vm->def->nets[i];
-        int actualType = virDomainNetGetActualType(net);
-
-        if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
-            ignore_value(virNetDevBridgeRemovePort(
-                            virDomainNetGetActualBridgeName(net),
-                            net->ifname));
-            ignore_value(virNetDevTapDelete(net->ifname));
-        }
-    }
+    /* Cleanup network interfaces */
+    bhyveNetCleanup(vm);
 
     /* No matter if shutdown was successful or not, we
      * need to unload the VM */
-- 
1.8.4.2




More information about the libvir-list mailing list