[PATCH] qemu: update netdevs of the same mac addrs correctly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If a guest has multiple network devices with the same MAC address,
when we online update the second device, libvirtd always updates
the first one.

commit def31e4c forgot to fix the online updating scenario. We need to
use virDomainNetFindIdx() to find the correct network device.

Signed-off-by: Zhou Yimin <zhouyimin@xxxxxxxxxx>
Signed-off-by: Zhang Bo <oscar.zhangbo@xxxxxxxxxx>
---
 src/qemu/qemu_hotplug.c | 23 +++++++----------------
 1 file changed, 7 insertions(+), 16 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 94ebe35..d455bd6 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2052,20 +2052,6 @@ int qemuDomainAttachHostDevice(virConnectPtr conn,
     return -1;
 }
 
-static virDomainNetDefPtr *qemuDomainFindNet(virDomainObjPtr vm,
-                                             virDomainNetDefPtr dev)
-{
-    size_t i;
-
-    for (i = 0; i < vm->def->nnets; i++) {
-        if (virMacAddrCmp(&vm->def->nets[i]->mac, &dev->mac) == 0)
-            return &vm->def->nets[i];
-    }
-
-    return NULL;
-}
-
-
 static int
 qemuDomainChangeNetBridge(virDomainObjPtr vm,
                           virDomainNetDefPtr olddev,
@@ -2195,7 +2181,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
                     virDomainDeviceDefPtr dev)
 {
     virDomainNetDefPtr newdev = dev->data.net;
-    virDomainNetDefPtr *devslot = qemuDomainFindNet(vm, newdev);
+    virDomainNetDefPtr *devslot = NULL;
     virDomainNetDefPtr olddev;
     int oldType, newType;
     bool needReconnect = false;
@@ -2205,8 +2191,13 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
     bool needReplaceDevDef = false;
     bool needBandwidthSet = false;
     int ret = -1;
+    int changeidx = -1;
+
+    if ((changeidx = virDomainNetFindIdx(vm->def, newdev)) < 0)
+        goto cleanup;
+    devslot = &vm->def->nets[changeidx];
 
-    if (!devslot || !(olddev = *devslot)) {
+    if (!(olddev = *devslot)) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                        _("cannot find existing network device to modify"));
         goto cleanup;
-- 
1.7.12.4


-- 
Oscar    
oscar.zhangbo@xxxxxxxxxx  

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]