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