commit ea3bc548aca7b4c448b48863120ad35a7337c127
Author: Michal Privoznik <mprivozn@redhat.com>
Date:   Mon Mar 26 16:44:19 2012 +0200

    qemu: Build activeUsbHostdevs list on process reconnect
    
    If the daemon is restarted it will lose list of active
    USB devices assigned to active domains. Therefore we need
    to rebuild this list on qemuProcessReconnect().

Index: libvirt-0.9.8/src/qemu/qemu_hostdev.c
===================================================================
--- libvirt-0.9.8.orig/src/qemu/qemu_hostdev.c	2013-06-17 16:15:49.422406641 +0200
+++ libvirt-0.9.8/src/qemu/qemu_hostdev.c	2013-06-17 16:27:12.226406834 +0200
@@ -306,6 +306,46 @@
     return ret;
 }
 
+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
 qemuPrepareHostPCIDevices(struct qemud_driver *driver,
                           virDomainDefPtr def)
Index: libvirt-0.9.8/src/qemu/qemu_hostdev.h
===================================================================
--- libvirt-0.9.8.orig/src/qemu/qemu_hostdev.h	2013-06-17 16:14:58.000000000 +0200
+++ libvirt-0.9.8/src/qemu/qemu_hostdev.h	2013-06-17 16:27:12.226406834 +0200
@@ -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,
                                  virDomainHostdevDefPtr *hostdevs,
Index: libvirt-0.9.8/src/qemu/qemu_process.c
===================================================================
--- libvirt-0.9.8.orig/src/qemu/qemu_process.c	2013-06-17 16:14:58.000000000 +0200
+++ libvirt-0.9.8/src/qemu/qemu_process.c	2013-06-17 16:27:12.226406834 +0200
@@ -2731,6 +2731,9 @@
         goto error;
     }
 
+    if (qemuUpdateActiveUsbHostdevs(driver, obj->def) < 0)
+        goto error;
+
     if (qemuProcessUpdateState(driver, obj) < 0)
         goto error;
 
