diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index a8890ebfa7cd7b54c0f7f4d018d97ab94e223e2a..8594fb276638c707c0d6eafe97f1a1f146913aa4 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -157,6 +157,46 @@ int qemuUpdateActivePciHostdevs(struct qemud_driver *driver, return 0; } +int +qemuUpdateActiveUsbHostdevs(struct qemud_driver *driver, + virDomainDefPtr def) +{ + virDomainHostdevDefPtr hostdev = NULL; + int i; + + if (!def->nhostdevs) + return 0; + + for (i = 0; i < def->nhostdevs; i++) { + usbDevice *usb = NULL; + hostdev = def->hostdevs[i]; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + continue; + if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) + continue; + + usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device); + if (!usb) { + VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", + hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + def->name); + continue; + } + + usbDeviceSetUsedBy(usb, def->name); + + if (usbDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { + usbFreeDevice(usb); + return -1; + } + } + + return 0; +} + static int qemuDomainHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, char **sysfs_path) { diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 173e4f43cd7de8a763b318960dd2d07ac8565258..371630ab365d1f841c1c06e03f1d1260dc94d81b 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -29,6 +29,8 @@ int qemuUpdateActivePciHostdevs(struct qemud_driver *driver, virDomainDefPtr def); +int qemuUpdateActiveUsbHostdevs(struct qemud_driver *driver, + virDomainDefPtr def); int qemuPrepareHostdevPCIDevices(struct qemud_driver *driver, const char *name, const unsigned char *uuid, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9eed160559fc68ec481a92963f8e14ae4016da46..481b4f3db07755e48d12a2fce80a66eeec79da3e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3057,6 +3057,9 @@ qemuProcessReconnect(void *opaque) goto error; } + if (qemuUpdateActiveUsbHostdevs(driver, obj->def) < 0) + goto error; + if (qemuProcessUpdateState(driver, obj) < 0) goto error;