diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index a8890ebfa7..8594fb2766 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 173e4f43cd..371630ab36 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 9eed160559..481b4f3db0 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;