[libvirt] [PATCH] qemu: update netdevs of the same mac addrs correctly
John Ferlan
jferlan at redhat.com
Fri Jun 12 19:02:28 UTC 2015
On 06/08/2015 04:25 AM, zhang bo wrote:
> 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 at huawei.com>
> Signed-off-by: Zhang Bo <oscar.zhangbo at huawei.com>
> ---
> src/qemu/qemu_hotplug.c | 23 +++++++----------------
> 1 file changed, 7 insertions(+), 16 deletions(-)
>
ACK and pushed.
John
> 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;
>
More information about the libvir-list
mailing list