[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