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().
(cherry picked from commit ea3bc548ac)
This commit is contained in:
Michal Privoznik 2012-03-26 16:44:19 +02:00 committed by Daniel P. Berrange
parent 8fca254f5d
commit 8a98a23900
3 changed files with 45 additions and 0 deletions

View File

@ -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)
{

View File

@ -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,

View File

@ -3057,6 +3057,9 @@ qemuProcessReconnect(void *opaque)
goto error;
}
if (qemuUpdateActiveUsbHostdevs(driver, obj->def) < 0)
goto error;
if (qemuProcessUpdateState(driver, obj) < 0)
goto error;