Blame SOURCES/libvirt-qemu-don-t-kill-qemu-process-on-restart-if-networkNotify-fails.patch

3e5111
From 01c309a7d81daa85e7212e37c8b4b9dd2c08f898 Mon Sep 17 00:00:00 2001
3e5111
Message-Id: <01c309a7d81daa85e7212e37c8b4b9dd2c08f898@dist-git>
3e5111
From: Laine Stump <laine@laine.org>
3e5111
Date: Tue, 2 May 2017 12:31:51 -0400
3e5111
Subject: [PATCH] qemu: don't kill qemu process on restart if networkNotify
3e5111
 fails
3e5111
3e5111
Nothing that could happen during networkNotifyActualDevice() could
3e5111
justify unceremoniously killing the qemu process, but that's what we
3e5111
were doing.
3e5111
3e5111
In particular, new code added in commit 85bcc022 (first appearred in
3e5111
libvirt-3.2.0) attempts to reattach tap devices to their assigned
3e5111
bridge devices when libvirtd restarts (to make it easier to recover
3e5111
from a restart of a libvirt network). But if the network has been
3e5111
stopped and *not* restarted, the bridge device won't exist and
3e5111
networkNotifyActualDevice() will fail.
3e5111
3e5111
This patch changes networkNotifyActualDevice() and
3e5111
qemuProcessNotifyNets() to return void, so that qemuProcessReconnect()
3e5111
will soldier on regardless of what happens (any errors will still be
3e5111
logged though).
3e5111
3e5111
Partially resolves: https://bugzilla.redhat.com/1442700
3e5111
3e5111
(cherry picked from commit cb182eb11d3a99adb06e188989899dcd488c43fc)
3e5111
3e5111
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
3e5111
---
3e5111
 src/network/bridge_driver.c | 10 ++++------
3e5111
 src/network/bridge_driver.h |  7 +++----
3e5111
 src/qemu/qemu_process.c     |  9 +++------
3e5111
 3 files changed, 10 insertions(+), 16 deletions(-)
3e5111
3e5111
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
3e5111
index ef982363b..cb91a2c90 100644
3e5111
--- a/src/network/bridge_driver.c
3e5111
+++ b/src/network/bridge_driver.c
3e5111
@@ -4656,9 +4656,9 @@ networkAllocateActualDevice(virDomainDefPtr dom,
3e5111
  * order, or re-attach the interface's tap device to the network's
3e5111
  * bridge.
3e5111
  *
3e5111
- * Returns 0 on success, -1 on failure.
3e5111
+ * No return value (but does log any failures)
3e5111
  */
3e5111
-int
3e5111
+void
3e5111
 networkNotifyActualDevice(virDomainDefPtr dom,
3e5111
                           virDomainNetDefPtr iface)
3e5111
 {
3e5111
@@ -4668,11 +4668,10 @@ networkNotifyActualDevice(virDomainDefPtr dom,
3e5111
     virNetworkDefPtr netdef;
3e5111
     virNetworkForwardIfDefPtr dev = NULL;
3e5111
     size_t i;
3e5111
-    int ret = -1;
3e5111
     char *master = NULL;
3e5111
 
3e5111
     if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK)
3e5111
-        return 0;
3e5111
+        return;
3e5111
 
3e5111
     network = virNetworkObjFindByName(driver->networks, iface->data.network.name);
3e5111
     if (!network) {
3e5111
@@ -4848,11 +4847,10 @@ networkNotifyActualDevice(virDomainDefPtr dom,
3e5111
     }
3e5111
     networkLogAllocation(netdef, actualType, dev, iface, true);
3e5111
 
3e5111
-    ret = 0;
3e5111
  cleanup:
3e5111
     virNetworkObjEndAPI(&network);
3e5111
     VIR_FREE(master);
3e5111
-    return ret;
3e5111
+    return;
3e5111
 
3e5111
  error:
3e5111
     goto cleanup;
3e5111
diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h
3e5111
index c696f0301..aaedd67a1 100644
3e5111
--- a/src/network/bridge_driver.h
3e5111
+++ b/src/network/bridge_driver.h
3e5111
@@ -37,8 +37,8 @@ int networkRegister(void);
3e5111
 int networkAllocateActualDevice(virDomainDefPtr dom,
3e5111
                                 virDomainNetDefPtr iface)
3e5111
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
3e5111
-int networkNotifyActualDevice(virDomainDefPtr dom,
3e5111
-                              virDomainNetDefPtr iface)
3e5111
+void networkNotifyActualDevice(virDomainDefPtr dom,
3e5111
+                               virDomainNetDefPtr iface)
3e5111
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
3e5111
 int networkReleaseActualDevice(virDomainDefPtr dom,
3e5111
                                virDomainNetDefPtr iface)
3e5111
@@ -72,11 +72,10 @@ int networkBandwidthUpdate(virDomainNetDefPtr iface,
3e5111
 #  define networkDnsmasqConfContents(network, pidfile, configstr, \
3e5111
                     dctx, caps) 0
3e5111
 
3e5111
-static inline int
3e5111
+static inline void
3e5111
 networkNotifyActualDevice(virDomainDefPtr dom ATTRIBUTE_UNUSED,
3e5111
                           virDomainNetDefPtr iface ATTRIBUTE_UNUSED)
3e5111
 {
3e5111
-    return 0;
3e5111
 }
3e5111
 
3e5111
 static inline int
3e5111
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
3e5111
index a33ec87e6..df5ba575a 100644
3e5111
--- a/src/qemu/qemu_process.c
3e5111
+++ b/src/qemu/qemu_process.c
3e5111
@@ -2825,7 +2825,7 @@ int qemuProcessStopCPUs(virQEMUDriverPtr driver,
3e5111
 
3e5111
 
3e5111
 
3e5111
-static int
3e5111
+static void
3e5111
 qemuProcessNotifyNets(virDomainDefPtr def)
3e5111
 {
3e5111
     size_t i;
3e5111
@@ -2840,10 +2840,8 @@ qemuProcessNotifyNets(virDomainDefPtr def)
3e5111
         if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT)
3e5111
            ignore_value(virNetDevMacVLanReserveName(net->ifname, false));
3e5111
 
3e5111
-        if (networkNotifyActualDevice(def, net) < 0)
3e5111
-            return -1;
3e5111
+        networkNotifyActualDevice(def, net);
3e5111
     }
3e5111
-    return 0;
3e5111
 }
3e5111
 
3e5111
 static int
3e5111
@@ -3480,8 +3478,7 @@ qemuProcessReconnect(void *opaque)
3e5111
     if (qemuSecurityReserveLabel(driver->securityManager, obj->def, obj->pid) < 0)
3e5111
         goto error;
3e5111
 
3e5111
-    if (qemuProcessNotifyNets(obj->def) < 0)
3e5111
-        goto error;
3e5111
+    qemuProcessNotifyNets(obj->def);
3e5111
 
3e5111
     if (qemuProcessFiltersInstantiate(obj->def))
3e5111
         goto error;
3e5111
-- 
3e5111
2.12.2
3e5111