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