[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