continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
continue;
+ if (hostdev->missing)
+ continue;
if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device)) == NULL)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
- if (!dev->source.subsys.u.usb.bus &&
+ if (!dev->missing &&
+ !dev->source.subsys.u.usb.bus &&
!dev->source.subsys.u.usb.device) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("USB host device is missing bus/device information"));
return NULL;
}
- virBufferAsprintf(&buf, "usb-host,hostbus=%d,hostaddr=%d,id=%s",
- dev->source.subsys.u.usb.bus,
- dev->source.subsys.u.usb.device,
- dev->info->alias);
+ virBufferAddLit(&buf, "usb-host");
+ if (!dev->missing) {
+ virBufferAsprintf(&buf, ",hostbus=%d,hostaddr=%d",
+ dev->source.subsys.u.usb.bus,
+ dev->source.subsys.u.usb.device);
+ }
+ virBufferAsprintf(&buf, ",id=%s", dev->info->alias);
if (qemuBuildDeviceAddressStr(&buf, dev->info, caps) < 0)
goto error;
{
char *ret = NULL;
+ if (dev->missing) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("This QEMU doesn't not support missing USB devices"));
+ return NULL;
+ }
+
if (!dev->source.subsys.u.usb.bus &&
!dev->source.subsys.u.usb.device) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
static int
qemuPrepareHostUSBDevices(struct qemud_driver *driver,
- virDomainDefPtr def)
+ virDomainDefPtr def,
+ bool coldBoot)
{
int i, ret = -1;
usbDeviceList *list;
*/
for (i = 0 ; i < nhostdevs ; i++) {
virDomainHostdevDefPtr hostdev = hostdevs[i];
+ bool required = true;
usbDevice *usb;
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
continue;
- if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0)
+ if (hostdev->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_OPTIONAL ||
+ (hostdev->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_REQUISITE &&
+ !coldBoot))
+ required = false;
+
+ if (qemuFindHostdevUSBDevice(hostdev, required, &usb) < 0)
goto cleanup;
- if (usbDeviceListAdd(list, usb) < 0) {
+ if (usb && usbDeviceListAdd(list, usb) < 0) {
usbFreeDevice(usb);
goto cleanup;
}
}
int qemuPrepareHostDevices(struct qemud_driver *driver,
- virDomainDefPtr def)
+ virDomainDefPtr def,
+ bool coldBoot)
{
if (!def->nhostdevs)
return 0;
if (qemuPrepareHostPCIDevices(driver, def) < 0)
return -1;
- if (qemuPrepareHostUSBDevices(driver, def) < 0)
+ if (qemuPrepareHostUSBDevices(driver, def, coldBoot) < 0)
return -1;
return 0;
continue;
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
continue;
+ if (hostdev->missing)
+ continue;
usb = usbGetDevice(hostdev->source.subsys.u.usb.bus,
hostdev->source.subsys.u.usb.device);
const char *name,
usbDeviceList *list);
int qemuPrepareHostDevices(struct qemud_driver *driver,
- virDomainDefPtr def);
+ virDomainDefPtr def,
+ bool coldBoot);
void qemuReattachPciDevice(pciDevice *dev, struct qemud_driver *driver);
void qemuDomainReAttachHostdevDevices(struct qemud_driver *driver,
const char *name,
/* Must be run before security labelling */
VIR_DEBUG("Preparing host devices");
- if (qemuPrepareHostDevices(driver, vm->def) < 0)
+ if (qemuPrepareHostDevices(driver, vm->def, !migrateFrom) < 0)
goto cleanup;
VIR_DEBUG("Preparing chr devices");