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().
This commit is contained in:
Michal Privoznik 2012-03-26 16:44:19 +02:00
parent e2f5dd6134
commit ea3bc548ac
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;