Blame SOURCES/libvirt-qemuDomainAttachNetDevice-Explicitly-list-allowed-types-for-hotplug.patch

c8c376
From da8bc106ac11a4b90f1559c3f34a1f0829a61506 Mon Sep 17 00:00:00 2001
c8c376
Message-Id: <da8bc106ac11a4b90f1559c3f34a1f0829a61506@dist-git>
c8c376
From: Michal Privoznik <mprivozn@redhat.com>
c8c376
Date: Tue, 8 Nov 2016 13:42:07 +0100
c8c376
Subject: [PATCH] qemuDomainAttachNetDevice: Explicitly list allowed types for
c8c376
 hotplug
c8c376
c8c376
RHEL-7.3: https://bugzilla.redhat.com/show_bug.cgi?id=1366108
c8c376
RHEL-7.3.z: https://bugzilla.redhat.com/show_bug.cgi?id=1392032
c8c376
c8c376
Instead of blindly claim support for hot-plugging of every
c8c376
interface type out there we should copy approach we have for
c8c376
device types: white listing supported types and explicitly error
c8c376
out on unsupported ones.
c8c376
For instance, trying to hotplug vhostuser interface results in
c8c376
nothing usable from guest currently. vhostuser typed interfaces
c8c376
require additional work on our side.
c8c376
c8c376
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
c8c376
(cherry picked from commit c266b6044003ac2f10f4cd15e58164d629508ccb)
c8c376
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
c8c376
---
c8c376
 src/qemu/qemu_hotplug.c | 33 +++++++++++++++++++++++++++------
c8c376
 1 file changed, 27 insertions(+), 6 deletions(-)
c8c376
c8c376
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
c8c376
index ca2d89702..011152762 100644
c8c376
--- a/src/qemu/qemu_hotplug.c
c8c376
+++ b/src/qemu/qemu_hotplug.c
c8c376
@@ -940,8 +940,9 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
c8c376
         return -1;
c8c376
     }
c8c376
 
c8c376
-    if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
c8c376
-        actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
c8c376
+    switch (actualType) {
c8c376
+    case VIR_DOMAIN_NET_TYPE_BRIDGE:
c8c376
+    case VIR_DOMAIN_NET_TYPE_NETWORK:
c8c376
         tapfdSize = vhostfdSize = net->driver.virtio.queues;
c8c376
         if (!tapfdSize)
c8c376
             tapfdSize = vhostfdSize = 1;
c8c376
@@ -958,7 +959,9 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
c8c376
         if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
c8c376
                                       vhostfd, &vhostfdSize) < 0)
c8c376
             goto cleanup;
c8c376
-    } else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
c8c376
+        break;
c8c376
+
c8c376
+    case VIR_DOMAIN_NET_TYPE_DIRECT:
c8c376
         tapfdSize = vhostfdSize = net->driver.virtio.queues;
c8c376
         if (!tapfdSize)
c8c376
             tapfdSize = vhostfdSize = 1;
c8c376
@@ -976,7 +979,9 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
c8c376
         if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
c8c376
                                       vhostfd, &vhostfdSize) < 0)
c8c376
             goto cleanup;
c8c376
-    } else if (actualType == VIR_DOMAIN_NET_TYPE_ETHERNET) {
c8c376
+        break;
c8c376
+
c8c376
+    case VIR_DOMAIN_NET_TYPE_ETHERNET:
c8c376
         tapfdSize = vhostfdSize = net->driver.virtio.queues;
c8c376
         if (!tapfdSize)
c8c376
             tapfdSize = vhostfdSize = 1;
c8c376
@@ -987,13 +992,15 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
c8c376
             goto cleanup;
c8c376
         memset(vhostfd, -1, sizeof(*vhostfd) * vhostfdSize);
c8c376
         if (qemuInterfaceEthernetConnect(vm->def, driver, net,
c8c376
-                                       tapfd, tapfdSize) < 0)
c8c376
+                                         tapfd, tapfdSize) < 0)
c8c376
             goto cleanup;
c8c376
         iface_connected = true;
c8c376
         if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
c8c376
                                       vhostfd, &vhostfdSize) < 0)
c8c376
             goto cleanup;
c8c376
-    } else if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
c8c376
+        break;
c8c376
+
c8c376
+    case VIR_DOMAIN_NET_TYPE_HOSTDEV:
c8c376
         /* This is really a "smart hostdev", so it should be attached
c8c376
          * as a hostdev (the hostdev code will reach over into the
c8c376
          * netdev-specific code as appropriate), then also added to
c8c376
@@ -1005,6 +1012,20 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
c8c376
         ret = qemuDomainAttachHostDevice(NULL, driver, vm,
c8c376
                                          virDomainNetGetActualHostdev(net));
c8c376
         goto cleanup;
c8c376
+        break;
c8c376
+
c8c376
+    case VIR_DOMAIN_NET_TYPE_USER:
c8c376
+    case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
c8c376
+    case VIR_DOMAIN_NET_TYPE_SERVER:
c8c376
+    case VIR_DOMAIN_NET_TYPE_CLIENT:
c8c376
+    case VIR_DOMAIN_NET_TYPE_MCAST:
c8c376
+    case VIR_DOMAIN_NET_TYPE_INTERNAL:
c8c376
+    case VIR_DOMAIN_NET_TYPE_UDP:
c8c376
+    case VIR_DOMAIN_NET_TYPE_LAST:
c8c376
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
c8c376
+                       _("hotplug of interface type of %s is not implemented yet"),
c8c376
+                       virDomainNetTypeToString(actualType));
c8c376
+        goto cleanup;
c8c376
     }
c8c376
 
c8c376
     /* Set device online immediately */
c8c376
-- 
c8c376
2.11.0
c8c376