[libvirt] [PATCH 3/3] qemu: Build activeUsbHostdevs list on process reconnect

Michal Privoznik mprivozn at redhat.com
Mon Mar 26 15:40:01 UTC 2012


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




More information about the libvir-list mailing list