]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: don't kill qemu process on restart if networkNotify fails
authorLaine Stump <laine@laine.org>
Tue, 25 Apr 2017 16:20:30 +0000 (12:20 -0400)
committerCole Robinson <crobinso@redhat.com>
Wed, 10 May 2017 22:02:39 +0000 (18:02 -0400)
Nothing that could happen during networkNotifyActualDevice() could
justify unceremoniously killing the qemu process, but that's what we
were doing.

In particular, new code added in commit 85bcc022 (first appearred in
libvirt-3.2.0) attempts to reattach tap devices to their assigned
bridge devices when libvirtd restarts (to make it easier to recover
from a restart of a libvirt network). But if the network has been
stopped and *not* restarted, the bridge device won't exist and
networkNotifyActualDevice() will fail.

This patch changes networkNotifyActualDevice() and
qemuProcessNotifyNets() to return void, so that qemuProcessReconnect()
will soldier on regardless of what happens (any errors will still be
logged though).

Partially resolves: https://bugzilla.redhat.com/1442700

(cherry picked from commit cb182eb11d3a99adb06e188989899dcd488c43fc)

src/network/bridge_driver.c
src/network/bridge_driver.h
src/qemu/qemu_process.c

index ef982363b408dac35bb724b25fb32cd2cf9444bb..cb91a2c90285b1a2254ebaa9a956342afb00924b 100644 (file)
@@ -4656,9 +4656,9 @@ networkAllocateActualDevice(virDomainDefPtr dom,
  * order, or re-attach the interface's tap device to the network's
  * bridge.
  *
- * Returns 0 on success, -1 on failure.
+ * No return value (but does log any failures)
  */
-int
+void
 networkNotifyActualDevice(virDomainDefPtr dom,
                           virDomainNetDefPtr iface)
 {
@@ -4668,11 +4668,10 @@ networkNotifyActualDevice(virDomainDefPtr dom,
     virNetworkDefPtr netdef;
     virNetworkForwardIfDefPtr dev = NULL;
     size_t i;
-    int ret = -1;
     char *master = NULL;
 
     if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK)
-        return 0;
+        return;
 
     network = virNetworkObjFindByName(driver->networks, iface->data.network.name);
     if (!network) {
@@ -4848,11 +4847,10 @@ networkNotifyActualDevice(virDomainDefPtr dom,
     }
     networkLogAllocation(netdef, actualType, dev, iface, true);
 
-    ret = 0;
  cleanup:
     virNetworkObjEndAPI(&network);
     VIR_FREE(master);
-    return ret;
+    return;
 
  error:
     goto cleanup;
index c696f0301ff758c7475f254765a641ff9af3edfc..aaedd67a19ab8e9432fed65e21252bb0e94daf69 100644 (file)
@@ -37,8 +37,8 @@ int networkRegister(void);
 int networkAllocateActualDevice(virDomainDefPtr dom,
                                 virDomainNetDefPtr iface)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int networkNotifyActualDevice(virDomainDefPtr dom,
-                              virDomainNetDefPtr iface)
+void networkNotifyActualDevice(virDomainDefPtr dom,
+                               virDomainNetDefPtr iface)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 int networkReleaseActualDevice(virDomainDefPtr dom,
                                virDomainNetDefPtr iface)
@@ -72,11 +72,10 @@ int networkBandwidthUpdate(virDomainNetDefPtr iface,
 #  define networkDnsmasqConfContents(network, pidfile, configstr, \
                     dctx, caps) 0
 
-static inline int
+static inline void
 networkNotifyActualDevice(virDomainDefPtr dom ATTRIBUTE_UNUSED,
                           virDomainNetDefPtr iface ATTRIBUTE_UNUSED)
 {
-    return 0;
 }
 
 static inline int
index 961afd70a9ad0b11a8f9924085962565926dcad1..26a668d27e3e0bd27219f3676b65c764ca9b1bac 100644 (file)
@@ -2825,7 +2825,7 @@ int qemuProcessStopCPUs(virQEMUDriverPtr driver,
 
 
 
-static int
+static void
 qemuProcessNotifyNets(virDomainDefPtr def)
 {
     size_t i;
@@ -2840,10 +2840,8 @@ qemuProcessNotifyNets(virDomainDefPtr def)
         if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_DIRECT)
            ignore_value(virNetDevMacVLanReserveName(net->ifname, false));
 
-        if (networkNotifyActualDevice(def, net) < 0)
-            return -1;
+        networkNotifyActualDevice(def, net);
     }
-    return 0;
 }
 
 static int
@@ -3478,8 +3476,7 @@ qemuProcessReconnect(void *opaque)
     if (qemuSecurityReserveLabel(driver->securityManager, obj->def, obj->pid) < 0)
         goto error;
 
-    if (qemuProcessNotifyNets(obj->def) < 0)
-        goto error;
+    qemuProcessNotifyNets(obj->def);
 
     if (qemuProcessFiltersInstantiate(obj->def))
         goto error;