[libvirt] [PATCH V4 1/6] libxlDomainAttachNetDevice: release actual deivce and remove hostdev when fail

Jim Fehlig jfehlig at suse.com
Fri Mar 25 22:38:10 UTC 2016


On 03/21/2016 02:11 AM, Chunyan Liu wrote:
> When AttachNetDevice failed, should call networkReleaseActualDevice
> to release actual device, and if actual device is hostdev, should
> remove the hostdev from vm->def->hostdevs.
>
> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
>  src/libxl/libxl_driver.c | 18 +++++++++++-------
>  1 file changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 87ec5a5..05ebe29 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -3122,16 +3122,18 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
>      int ret = -1;
>      char mac[VIR_MAC_STRING_BUFLEN];
>  
> +    libxl_device_nic_init(&nic);
> +
>      /* preallocate new slot for device */
>      if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets + 1) < 0)
> -        goto out;
> +        goto cleanup;
>  
>      /* If appropriate, grab a physical device from the configured
>       * network's pool of devices, or resolve bridge device name
>       * to the one defined in the network definition.
>       */
>      if (networkAllocateActualDevice(vm->def, net) < 0)
> -        goto out;
> +        goto cleanup;
>  
>      actualType = virDomainNetGetActualType(net);
>  
> @@ -3139,7 +3141,7 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
>          virReportError(VIR_ERR_INVALID_ARG,
>                         _("network device with mac %s already exists"),
>                         virMacAddrFormat(&net->mac, mac));
> -        return -1;
> +        goto cleanup;
>      }
>  
>      if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
> @@ -3150,10 +3152,9 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
>           */
>          ret = libxlDomainAttachHostDevice(driver, vm,
>                                            virDomainNetGetActualHostdev(net));
> -        goto out;
> +        goto cleanup;
>      }
>  
> -    libxl_device_nic_init(&nic);
>      if (libxlMakeNic(vm->def, net, &nic) < 0)
>          goto cleanup;
>  
> @@ -3167,9 +3168,12 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
>  
>   cleanup:
>      libxl_device_nic_dispose(&nic);
> - out:
> -    if (!ret)
> +    if (!ret) {
>          vm->def->nets[vm->def->nnets++] = net;
> +    } else {
> +        virDomainNetRemoveHostdev(vm->def, net);
> +        networkReleaseActualDevice(vm->def, net);
> +    }

Nice cleanup. But I think it can go a bit further by assigning the new net to
nets right after a successful libxl_device_nic_add(), and only handle failure
cleanup here. I've squashed in the change below.

Regards,
Jim

diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 05ebe29..f6417ea 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -3164,13 +3164,12 @@ libxlDomainAttachNetDevice(libxlDriverPrivatePtr driver,
         goto cleanup;
     }
 
+    vm->def->nets[vm->def->nnets++] = net;
     ret = 0;
 
  cleanup:
     libxl_device_nic_dispose(&nic);
-    if (!ret) {
-        vm->def->nets[vm->def->nnets++] = net;
-    } else {
+    if (ret) {
         virDomainNetRemoveHostdev(vm->def, net);
         networkReleaseActualDevice(vm->def, net);
     }




More information about the libvir-list mailing list