If the daemon is restarted it will loose list of active USB devices assigned to active domains. Therefore we need to rebuild this list on qemuProcessReconnect(). --- src/qemu/qemu_hostdev.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hostdev.h | 2 ++ src/qemu/qemu_process.c | 3 +++ 3 files changed, 45 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 6ce2421..b45acec 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 173e4f4..371630a 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 0e768fe..ae1be0f 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; -- 1.7.8.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list