[libvirt] [PATCH 2/2] libxl: allow vendor/product addressing for USB hostdevs

Cédric Bosdonnat cbosdonnat at suse.com
Fri Aug 5 07:10:50 UTC 2016


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;
+    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;
 
-    return 0;
+    ret = 0;
+
+ cleanup:
+    virUSBDeviceFree(usb);
+
+    return ret;
 }
 
 static int
-- 
2.6.6




More information about the libvir-list mailing list