
On 08/05/2016 01:10 AM, Cédric Bosdonnat wrote:
libxl only has API to address the host USB devices by bus/device. Find the bus/device if the user only provided the vendor/product of the USB device. --- src/libxl/libxl_conf.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 5202ca1..4b758f1 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1559,23 +1559,32 @@ int libxlMakeUSB(virDomainHostdevDefPtr hostdev, libxl_device_usbdev *usbdev) { virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb; + virUSBDevicePtr usb;
Needs initialized to NULL. I encountered a libvirtd segfault without it.
+ int ret = -1;
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - return -1; + goto cleanup; if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) - return -1; + goto cleanup;
- if (usbsrc->bus <= 0 || usbsrc->device <= 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("libxenlight supports only USB device " - "specified by busnum:devnum")); - return -1; + if ((usbsrc->bus <= 0 || usbsrc->device <= 0) && + (virHostdevFindUSBDevice(hostdev, true, &usb) < 0)) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("failed to find USB device busnum:devnum " + "for %x:%x"), + usbsrc->vendor, usbsrc->product); + goto cleanup; }
usbdev->u.hostdev.hostbus = usbsrc->bus; usbdev->u.hostdev.hostaddr = usbsrc->device;
I had to read virHostdevFindUSBDevice to understand how this would work :-). If the device is found by vendor/product, virHostdevFindUSBDevice sets hostdev->source.subsys.u.usb->{bus,device}. I don't think we should rely on that internal behavior and instead set hostbus and hostaddr from usb->{bus,dev}. Regards, Jim
- return 0; + ret = 0; + + cleanup: + virUSBDeviceFree(usb); + + return ret; }
static int