switch (hostdev->mode) {
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
- switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
address = virPCIDeviceAddressAsString(&pcisrc->addr);
break;
}
break;
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
- switch ((virDomainHostdevSubsysType) def->source.subsys.type) {
+ switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
virDomainHostdevSubsysSCSIClear(&def->source.subsys.u.scsi);
break;
static int
virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
xmlXPathContextPtr ctxt,
- const char *type,
+ virDomainHostdevSubsysType type,
virDomainHostdevDef *def,
unsigned int flags,
virDomainXMLOption *xmlopt)
* <hostdev>. (the functions we're going to call expect address
* type to already be known).
*/
- if (!type) {
- virReportError(VIR_ERR_XML_ERROR,
- "%s", _("missing source address type"));
- return -1;
- }
-
- if ((def->source.subsys.type = virDomainHostdevSubsysTypeFromString(type)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown host device source address type '%1$s'"),
- type);
- return -1;
- }
+ def->source.subsys.type = type;
if (!(sourcenode = virXPathNode("./source", ctxt))) {
virReportError(VIR_ERR_XML_ERROR, "%s",
return -1;
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("address type='%1$s' not supported in hostdev interfaces"),
}
} else if (actual->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
virDomainHostdevDef *hostdev = &actual->data.hostdev.def;
+ int type;
hostdev->parentnet = parent;
hostdev->info = &parent->info;
/* if not explicitly stated, source/vendor implies usb device */
if (!addrtype && virXPathNode("./source/vendor", ctxt))
addrtype = g_strdup("usb");
+
+ if ((type = virDomainHostdevSubsysTypeFromString(addrtype)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown host device source address type '%1$s'"),
+ addrtype);
+ goto error;
+ }
+
hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
- if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+ if (virDomainHostdevDefParseXMLSubsys(node, ctxt, type,
hostdev, flags, xmlopt) < 0) {
goto error;
}
case VIR_DOMAIN_NET_TYPE_HOSTDEV: {
g_autofree char *addrtype = virXPathString("string(./source/address/@type)", ctxt);
+ int type;
def->data.hostdev.def.parentnet = def;
def->data.hostdev.def.info = &def->info;
/* The helper function expects type to already be found and
* passed in as a string, since it is in a different place in
* NetDef vs HostdevDef. */
- if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+
+ if ((type = virDomainHostdevSubsysTypeFromString(addrtype)) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown host device source address type '%1$s'"),
+ addrtype);
+ return NULL;
+ }
+
+ if (virDomainHostdevDefParseXMLSubsys(node, ctxt, type,
&def->data.hostdev.def,
flags, xmlopt) < 0)
return NULL;
{
virDomainHostdevDef *def;
VIR_XPATH_NODE_AUTORESTORE(ctxt)
- g_autofree char *type = virXMLPropString(node, "type");
- unsigned int typeU;
+ unsigned int type;
ctxt->node = node;
switch (def->mode) {
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
/* parse managed/mode/type, and the <source> element */
+ if (virXMLPropEnum(node, "type",
+ virDomainHostdevSubsysTypeFromString,
+ VIR_XML_PROP_REQUIRED, &type) < 0)
+ goto error;
if (virDomainHostdevDefParseXMLSubsys(node, ctxt, type, def, flags, xmlopt) < 0)
goto error;
break;
/* parse managed/mode/type, and the <source> element */
if (virXMLPropEnum(node, "type",
virDomainHostdevCapsTypeFromString,
- VIR_XML_PROP_REQUIRED, &typeU) < 0)
+ VIR_XML_PROP_REQUIRED, &type) < 0)
goto error;
- if (virDomainHostdevDefParseXMLCaps(node, ctxt, typeU, def) < 0)
+ if (virDomainHostdevDefParseXMLCaps(node, ctxt, type, def) < 0)
goto error;
break;
default:
goto error;
}
if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
- switch ((virDomainHostdevSubsysType) def->source.subsys.type) {
+ switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
if (virXPathBoolean("boolean(./readonly)", ctxt))
def->readonly = true;
if (a->source.subsys.type != b->source.subsys.type)
return 0;
- switch ((virDomainHostdevSubsysType) a->source.subsys.type) {
+ switch (a->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
return virDomainHostdevMatchSubsysPCI(a, b);
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
bool includeTypeInAddr,
virDomainXMLOption *xmlopt)
{
- switch ((virDomainHostdevSubsysType) def->source.subsys.type) {
+ switch (def->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
virDomainHostdevDefFormatSubsysUSB(buf, def, flags, includeTypeInAddr);
return 0;
};
struct _virDomainHostdevSubsys {
- int type; /* enum virDomainHostdevSubsysType */
+ virDomainHostdevSubsysType type;
union {
virDomainHostdevSubsysUSB usb;
virDomainHostdevSubsysPCI pci;
virDomainHostdevDefValidate(const virDomainHostdevDef *hostdev)
{
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
- switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
if (hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
hostdev->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED &&
return -1;
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("hostdev subsys type '%1$s' not supported"),
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
return -1;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ break;
}
if (virDomainHostdevFind(vmdef, hostdev, &found) >= 0) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
return libxlDomainDetachHostUSBDevice(driver, vm, hostdev);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected hostdev type %1$d"), subsys->type);
def,
securityDriver);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported host device mode %1$s"),
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
return lxcDomainAttachDeviceHostdevSubsysUSBLive(driver, vm, dev);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported host device type %1$s"),
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
return lxcDomainDetachDeviceHostdevUSBLive(driver, vm, dev);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported host device type %1$s"),
switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unsupported hostdev type %1$s"),
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
continue;
- switch ((virDomainHostdevSubsysType) subsys->type) {
+ switch (subsys->type) {
/* USB */
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
if (!(devprops = qemuBuildUSBHostdevDevProps(def, hostdev, qemuCaps)))
switch (dev->mode) {
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
if (pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
if (!(tmpPath = virPCIDeviceAddressGetIOMMUGroupDev(&pcisrc->addr)))
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
return 0;
- switch ((virDomainHostdevSubsysType)hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
return qemuDomainPrepareHostdevSCSI(hostdev, priv);
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
return -1;
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("hotplug is not supported for hostdev subsys type '%1$s'"),
if (qemuDomainNamespaceTeardownHostdev(vm, hostdev) < 0)
VIR_WARN("Unable to remove host device from /dev");
- switch ((virDomainHostdevSubsysType)hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
qemuDomainRemovePCIHostDevice(driver, vm, hostdev);
/* QEMU might no longer need to lock as much memory, eg. we just
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected hostdev type %1$d"), subsys->type);
return false;
case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
- switch ((virDomainHostdevSubsysType)hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
/* USB devices can be "migrated" */
continue;
}
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
- switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
+ switch (hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
if (hostdev->source.subsys.u.usb.guestReset &&
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_USB_HOST_GUESTS_RESETS_ALL)) {
ptr->mgr = mgr;
ptr->def = def;
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
virUSBDevice *usb =
virUSBDeviceNew(usbsrc->bus, usbsrc->device, vroot);
if (cbdata.secdef && !cbdata.secdef->relabel)
return 0;
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
g_autoptr(virUSBDevice) usb = NULL;
scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
return 0;
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
g_autoptr(virUSBDevice) usb = NULL;
scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
return 0;
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
g_autoptr(virUSBDevice) usb = NULL;
scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI)
return 0;
- switch ((virDomainHostdevSubsysType)dev->source.subsys.type) {
+ switch (dev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: {
g_autoptr(virUSBDevice) usb = NULL;
break;
}
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
default:
rc = 0;
break;