|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/2] libxl: Introduce functions to add and remove USB devices to an HVM guest
>>> + if (!libxl_usb_path) {
>>> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths");
>>> + rc = ERROR_FAIL;
>>> + goto out;
>>> + }
>>> +
>>> noperm[0].id = 0;
>>> noperm[0].perms = XS_PERM_NONE;
>>>
>>> @@ -475,6 +482,9 @@ retry_transaction:
>>> xs_rm(ctx->xsh, t, libxl_path);
>>> libxl__xs_mkdir(gc, t, libxl_path, noperm, ARRAY_SIZE(noperm));
>>>
>>> + xs_rm(ctx->xsh, t, libxl_usb_path);
>> You are missing the error check, there's also a helper for xs_rm,
>> libxl__xs_rm_checked.
>
> I'm just following suit with what all the other xs_rm's do here. I
> think it's actually expected that there will *not* be such a path, but
> that it's just cleaning up to be sure.
libxl__xs_rm_checked will not return an error if xs_rm errno is ENOENT,
it will only return an error if something really bad happened.
>>> +
>>> +out:
>>> + return rc;
>>> +}
>>> +
>>> +int libxl_device_usb_add(libxl_ctx *ctx, uint32_t domid,
>>> + libxl_device_usb *usbdev,
>>> + const libxl_asyncop_how *ao_how)
>>> +{
>>> + AO_CREATE(ctx, domid, ao_how);
>>> + int rc;
>>> + rc = libxl__device_usb_add(gc, domid, usbdev);
>>> + libxl__ao_complete(egc, ao, rc);
>>> + return AO_INPROGRESS;
>>> +}
>>> +
>>> +/*
>>> + * USB remove
>>> + */
>>> +static int do_usb_remove(libxl__gc *gc, uint32_t domid,
>>> + libxl__device_usb *usbdev)
>>> +{
>>> + int rc;
>>> +
>>> + switch (usbdev->protocol) {
>>> + case LIBXL_USB_PROTOCOL_DEVICEMODEL:
>>> + switch (libxl__device_model_version_running(gc, domid)) {
>>> + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
>>> + LOG(ERROR, "usb-remove not yet implemented for
>>> qemu-traditional");
>>> + return ERROR_INVAL;
>>> + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
>>> + if ( (rc = libxl__qmp_usb_remove(gc, domid, usbdev)) < 0 )
>> Spaces
>
> How important are the spaces? Most of the time I think it makes it
> easier to read, in this case particularly so.
It's in libxl CODING_STYLE, since you are already caching the return
value, why don't you split the line:
rc = libxl__qmp_usb_remove(gc, domid, usbdev);
if (rc < 0)
...
This makes it even easier to read IMHO.
>>> +out:
>>> + return rc;
>>> +}
>>> +
>>> +int libxl_device_usb_remove(libxl_ctx *ctx, uint32_t domid,
>>> + libxl_device_usb *usbdev,
>>> + const libxl_asyncop_how *ao_how)
>>> +{
>>> + AO_CREATE(ctx, domid, ao_how);
>>> + int rc;
>>> + rc = libxl__device_usb_remove(gc, domid, usbdev);
>>> + libxl__ao_complete(egc, ao, rc);
>>> + return AO_INPROGRESS;
>>> +}
>>> +
>>> +
>>> +libxl_device_usb *libxl_device_usb_list(libxl_ctx *ctx,
>>> + uint32_t domid, int *num)
>>> +{
>>> + GC_INIT(ctx);
>>> + libxl__device_usb *devint;
>>> + libxl_device_usb *devext = NULL;
>>> + int n = 0, i, rc;
>>> +
>>> + rc = get_assigned_devices(gc, domid, &devint, &n);
>>> + if ( rc ) {
>>> + LOG(ERROR, "Could not get assigned devices");
>>> + goto out;
>>> + }
>>> +
>>> + if(n == 0)
>>> + goto out;
>>> +
>>> + devext = calloc(n, sizeof(libxl_device_usb));
>> libxl__calloc, also you seem to leak this allocation, which will be
>> solved by the use of libxl__calloc.
>
> This isn't a leak -- this is giving the list to an external caller, who
> is responsible to free the list. This follows suit with other
> libxl_device_.*_list() functions, which must free() the return value
> themselves. (See e.g., libxl_device_pci_list(),
> libxl_device_pci_assignable_list(), libxl_device_nic_list(), &c.)
OK, then you can use libxl__calloc with NOGC.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |