mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-18 10:35:20 +00:00
qemu: update netdevs of the same mac addrs correctly
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@huawei.com> Signed-off-by: Zhang Bo <oscar.zhangbo@huawei.com>
This commit is contained in:
parent
785a8940ef
commit
798461a1a3
@ -2052,20 +2052,6 @@ int qemuDomainAttachHostDevice(virConnectPtr conn,
|
|||||||
return -1;
|
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
|
static int
|
||||||
qemuDomainChangeNetBridge(virDomainObjPtr vm,
|
qemuDomainChangeNetBridge(virDomainObjPtr vm,
|
||||||
virDomainNetDefPtr olddev,
|
virDomainNetDefPtr olddev,
|
||||||
@ -2195,7 +2181,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
|
|||||||
virDomainDeviceDefPtr dev)
|
virDomainDeviceDefPtr dev)
|
||||||
{
|
{
|
||||||
virDomainNetDefPtr newdev = dev->data.net;
|
virDomainNetDefPtr newdev = dev->data.net;
|
||||||
virDomainNetDefPtr *devslot = qemuDomainFindNet(vm, newdev);
|
virDomainNetDefPtr *devslot = NULL;
|
||||||
virDomainNetDefPtr olddev;
|
virDomainNetDefPtr olddev;
|
||||||
int oldType, newType;
|
int oldType, newType;
|
||||||
bool needReconnect = false;
|
bool needReconnect = false;
|
||||||
@ -2205,8 +2191,13 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
|
|||||||
bool needReplaceDevDef = false;
|
bool needReplaceDevDef = false;
|
||||||
bool needBandwidthSet = false;
|
bool needBandwidthSet = false;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
int changeidx = -1;
|
||||||
|
|
||||||
if (!devslot || !(olddev = *devslot)) {
|
if ((changeidx = virDomainNetFindIdx(vm->def, newdev)) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
devslot = &vm->def->nets[changeidx];
|
||||||
|
|
||||||
|
if (!(olddev = *devslot)) {
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
||||||
_("cannot find existing network device to modify"));
|
_("cannot find existing network device to modify"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user