[libvirt] [PATCH 2/6] qemu: Introduce qemuFindHostdevUSBDevice

Jiri Denemark jdenemar at redhat.com
Tue Oct 9 12:13:23 UTC 2012


The code which looks up a USB device specified by hostdev is duplicated
in two places. This patch creates a dedicated function that can be
called in both places.
---
 src/qemu/qemu_hostdev.c | 73 +++++++++++++++++++++++++++----------------------
 src/qemu/qemu_hostdev.h |  1 +
 src/qemu/qemu_hotplug.c | 33 +---------------------
 3 files changed, 42 insertions(+), 65 deletions(-)

diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
index 7375d26..017f0ec 100644
--- a/src/qemu/qemu_hostdev.c
+++ b/src/qemu/qemu_hostdev.c
@@ -641,6 +641,44 @@ error:
     return -1;
 }
 
+usbDevice *
+qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev)
+{
+    usbDevice *usb = NULL;
+    unsigned vendor = hostdev->source.subsys.u.usb.vendor;
+    unsigned product = hostdev->source.subsys.u.usb.product;
+    unsigned bus = hostdev->source.subsys.u.usb.bus;
+    unsigned device = hostdev->source.subsys.u.usb.device;
+
+    if (vendor && bus) {
+        usb = usbFindDevice(vendor, product, bus, device);
+
+    } else if (vendor && !bus) {
+        usbDeviceList *devs = usbFindDeviceByVendor(vendor, product);
+        if (!devs)
+            return NULL;
+
+        if (usbDeviceListCount(devs) > 1) {
+            virReportError(VIR_ERR_OPERATION_FAILED,
+                           _("multiple USB devices for %x:%x, "
+                             "use <address> to specify one"), vendor, product);
+            usbDeviceListFree(devs);
+            return NULL;
+        }
+        usb = usbDeviceListGet(devs, 0);
+        usbDeviceListSteal(devs, usb);
+        usbDeviceListFree(devs);
+
+        hostdev->source.subsys.u.usb.bus = usbDeviceGetBus(usb);
+        hostdev->source.subsys.u.usb.device = usbDeviceGetDevno(usb);
+
+    } else if (!vendor && bus) {
+        usb = usbFindDeviceByBus(bus, device);
+    }
+
+    return usb;
+}
+
 static int
 qemuPrepareHostUSBDevices(struct qemud_driver *driver,
                           virDomainDefPtr def)
@@ -663,45 +701,14 @@ qemuPrepareHostUSBDevices(struct qemud_driver *driver,
      */
     for (i = 0 ; i < nhostdevs ; i++) {
         virDomainHostdevDefPtr hostdev = hostdevs[i];
-        usbDevice *usb = NULL;
+        usbDevice *usb;
 
         if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
             continue;
         if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
             continue;
 
-        unsigned vendor = hostdev->source.subsys.u.usb.vendor;
-        unsigned product = hostdev->source.subsys.u.usb.product;
-        unsigned bus = hostdev->source.subsys.u.usb.bus;
-        unsigned device = hostdev->source.subsys.u.usb.device;
-
-        if (vendor && bus) {
-            usb = usbFindDevice(vendor, product, bus, device);
-
-        } else if (vendor && !bus) {
-            usbDeviceList *devs = usbFindDeviceByVendor(vendor, product);
-            if (!devs)
-                goto cleanup;
-
-            if (usbDeviceListCount(devs) > 1) {
-                virReportError(VIR_ERR_OPERATION_FAILED,
-                               _("multiple USB devices for %x:%x, "
-                                 "use <address> to specify one"), vendor, product);
-                usbDeviceListFree(devs);
-                goto cleanup;
-            }
-            usb = usbDeviceListGet(devs, 0);
-            usbDeviceListSteal(devs, usb);
-            usbDeviceListFree(devs);
-
-            hostdev->source.subsys.u.usb.bus = usbDeviceGetBus(usb);
-            hostdev->source.subsys.u.usb.device = usbDeviceGetDevno(usb);
-
-        } else if (!vendor && bus) {
-            usb = usbFindDeviceByBus(bus, device);
-        }
-
-        if (!usb)
+        if (!(usb = qemuFindHostdevUSBDevice(hostdev)))
             goto cleanup;
 
         if (usbDeviceListAdd(list, usb) < 0) {
diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h
index 14f1fca..204b2d4 100644
--- a/src/qemu/qemu_hostdev.h
+++ b/src/qemu/qemu_hostdev.h
@@ -36,6 +36,7 @@ int qemuPrepareHostdevPCIDevices(struct qemud_driver *driver,
                                  const unsigned char *uuid,
                                  virDomainHostdevDefPtr *hostdevs,
                                  int nhostdevs);
+usbDevice *qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev);
 int qemuPrepareHostdevUSBDevices(struct qemud_driver *driver,
                                  const char *name,
                                  usbDeviceList *list);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index a738b19..59de8e4 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1149,38 +1149,7 @@ int qemuDomainAttachHostDevice(struct qemud_driver *driver,
         goto cleanup;
 
     if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
-        unsigned vendor = hostdev->source.subsys.u.usb.vendor;
-        unsigned product = hostdev->source.subsys.u.usb.product;
-        unsigned bus = hostdev->source.subsys.u.usb.bus;
-        unsigned device = hostdev->source.subsys.u.usb.device;
-
-        if (vendor && bus) {
-            usb = usbFindDevice(vendor, product, bus, device);
-
-        } else if (vendor && !bus) {
-            usbDeviceList *devs = usbFindDeviceByVendor(vendor, product);
-            if (!devs)
-                goto cleanup;
-
-            if (usbDeviceListCount(devs) > 1) {
-                virReportError(VIR_ERR_OPERATION_FAILED,
-                               _("multiple USB devices for %x:%x, "
-                                 "use <address> to specify one"), vendor, product);
-                usbDeviceListFree(devs);
-                goto cleanup;
-            }
-            usb = usbDeviceListGet(devs, 0);
-            usbDeviceListSteal(devs, usb);
-            usbDeviceListFree(devs);
-
-            hostdev->source.subsys.u.usb.bus = usbDeviceGetBus(usb);
-            hostdev->source.subsys.u.usb.device = usbDeviceGetDevno(usb);
-
-        } else if (!vendor && bus) {
-            usb = usbFindDeviceByBus(bus, device);
-        }
-
-        if (!usb)
+        if (!(usb = qemuFindHostdevUSBDevice(hostdev)))
             goto cleanup;
 
         if (usbDeviceListAdd(list, usb) < 0) {
-- 
1.7.12




More information about the libvir-list mailing list