File libvirt-qemu-Separate-net-device-removal-into-a-standalone-function.patch of Package libvirt

From e4a3c8385138956a3099134832dae5f1e0d7a00b Mon Sep 17 00:00:00 2001
Message-Id: <e4a3c8385138956a3099134832dae5f1e0d7a00b@dist-git>
From: Jiri Denemark <jdenemar@redhat.com>
Date: Wed, 10 Jul 2013 00:37:12 +0200
Subject: [PATCH] qemu: Separate net device removal into a standalone function

https://bugzilla.redhat.com/show_bug.cgi?id=807023

(cherry picked from commit ac68a785ccccd35f0edb75b9118c653c4c4cbeb0)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>

Conflicts:
	src/qemu/qemu_hotplug.c - virQEMUDriverConfigPtr was not
	    separated from struct qemud_driver; network hooks
---
 src/qemu/qemu_hotplug.c | 97 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 60 insertions(+), 37 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index aaec88e..49a9a6f 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1984,6 +1984,60 @@ qemuDomainRemoveControllerDevice(struct qemud_driver *driver ATTRIBUTE_UNUSED,
 }
 
 
+static void
+qemuDomainRemoveNetDevice(struct qemud_driver *driver,
+                          virDomainObjPtr vm,
+                          virDomainNetDefPtr net)
+{
+    virNetDevVPortProfilePtr vport;
+    size_t i;
+
+    VIR_DEBUG("Removing network interface %s from domain %p %s",
+              net->info.alias, vm, vm->def->name);
+
+    virDomainAuditNet(vm, net, NULL, "detach", true);
+
+    for (i = 0; i < vm->def->nnets; i++) {
+        if (vm->def->nets[i] == net) {
+            virDomainNetRemove(vm->def, i);
+            break;
+        }
+    }
+
+    qemuDomainReleaseDeviceAddress(vm, &net->info, NULL);
+    virDomainConfNWFilterTeardown(net);
+
+    if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT) {
+        ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
+                         net->ifname, &net->mac,
+                         virDomainNetGetActualDirectDev(net),
+                         virDomainNetGetActualDirectMode(net),
+                         virDomainNetGetActualVirtPortProfile(net),
+                         driver->stateDir));
+        VIR_FREE(net->ifname);
+    }
+
+    if (driver->macFilter && (net->ifname != NULL)) {
+        if ((errno = networkDisallowMacOnPort(driver,
+                                              net->ifname,
+                                              &net->mac))) {
+            virReportSystemError(errno,
+             _("failed to remove ebtables rule on '%s'"),
+                                 net->ifname);
+        }
+    }
+
+    vport = virDomainNetGetActualVirtPortProfile(net);
+    if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
+        ignore_value(virNetDevOpenvswitchRemovePort(
+                        virDomainNetGetActualBridgeName(net),
+                        net->ifname));
+
+    networkReleaseActualDevice(vm->def, net);
+    virDomainNetDefFree(net);
+}
+
+
 int qemuDomainDetachPciDiskDevice(struct qemud_driver *driver,
                                   virDomainObjPtr vm,
                                   virDomainDiskDefPtr detach)
@@ -2433,7 +2487,6 @@ qemuDomainDetachNetDevice(struct qemud_driver *driver,
     int vlan;
     char *hostnet_name = NULL;
     char mac[VIR_MAC_STRING_BUFLEN];
-    virNetDevVPortProfilePtr vport = NULL;
 
     detachidx = virDomainNetFindIdx(vm->def, dev->data.net);
     if (detachidx == -2) {
@@ -2454,6 +2507,11 @@ qemuDomainDetachNetDevice(struct qemud_driver *driver,
         ret = qemuDomainDetachThisHostDevice(driver, vm,
                                              virDomainNetGetActualHostdev(detach),
                                              -1);
+        if (!ret) {
+            networkReleaseActualDevice(vm->def, detach);
+            virDomainNetRemove(vm->def, detachidx);
+            virDomainNetDefFree(detach);
+        }
         goto cleanup;
     }
 
@@ -2514,44 +2572,9 @@ qemuDomainDetachNetDevice(struct qemud_driver *driver,
     }
     qemuDomainObjExitMonitorWithDriver(driver, vm);
 
-    virDomainAuditNet(vm, detach, NULL, "detach", true);
-
-    qemuDomainReleaseDeviceAddress(vm, &detach->info, NULL);
-
-    virDomainConfNWFilterTeardown(detach);
-
-    if (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_DIRECT) {
-        ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
-                         detach->ifname, &detach->mac,
-                         virDomainNetGetActualDirectDev(detach),
-                         virDomainNetGetActualDirectMode(detach),
-                         virDomainNetGetActualVirtPortProfile(detach),
-                         driver->stateDir));
-        VIR_FREE(detach->ifname);
-    }
-
-    if ((driver->macFilter) && (detach->ifname != NULL)) {
-        if ((errno = networkDisallowMacOnPort(driver,
-                                              detach->ifname,
-                                              &detach->mac))) {
-            virReportSystemError(errno,
-             _("failed to remove ebtables rule on '%s'"),
-                                 detach->ifname);
-        }
-    }
-
-    vport = virDomainNetGetActualVirtPortProfile(detach);
-    if (vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH)
-        ignore_value(virNetDevOpenvswitchRemovePort(
-                        virDomainNetGetActualBridgeName(detach),
-                        detach->ifname));
+    qemuDomainRemoveNetDevice(driver, vm, detach);
     ret = 0;
 cleanup:
-    if (!ret) {
-        networkReleaseActualDevice(vm->def, detach);
-        virDomainNetRemove(vm->def, detachidx);
-        virDomainNetDefFree(detach);
-    }
     VIR_FREE(hostnet_name);
     return ret;
 }
-- 
2.0.0

openSUSE Build Service is sponsored by