virDomainDeviceInfo: Convert 'type' field to proper enum type

Convert the field, adjust the XML parsers to use virXMLPropEnum()
and fill in missing cases to switch() statements.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2023-09-13 18:10:54 +02:00
parent cc4bb25852
commit 2dd6369477
7 changed files with 36 additions and 21 deletions

View File

@ -98,7 +98,7 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a,
if (a->type != b->type) if (a->type != b->type)
return false; return false;
switch ((virDomainDeviceAddressType) a->type) { switch (a->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
/* address types below don't have any specific data */ /* address types below don't have any specific data */
@ -427,6 +427,16 @@ virDomainDeviceAddressIsValid(virDomainDeviceInfo *info,
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
return true; return true;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
break;
} }
return false; return false;

View File

@ -32,7 +32,7 @@
#include "virenum.h" #include "virenum.h"
typedef enum { typedef enum {
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE = 0,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL,
@ -116,7 +116,7 @@ struct _virDomainDeviceDimmAddress {
typedef struct _virDomainDeviceInfo virDomainDeviceInfo; typedef struct _virDomainDeviceInfo virDomainDeviceInfo;
struct _virDomainDeviceInfo { struct _virDomainDeviceInfo {
char *alias; char *alias;
int type; /* virDomainDeviceAddressType */ virDomainDeviceAddressType type;
union { union {
virPCIDeviceAddress pci; virPCIDeviceAddress pci;
virDomainDeviceDriveAddress drive; virDomainDeviceDriveAddress drive;

View File

@ -5366,7 +5366,7 @@ virDomainDeviceInfoFormat(virBuffer *buf,
virBufferAsprintf(&attrBuf, " type='%s'", virBufferAsprintf(&attrBuf, " type='%s'",
virDomainDeviceAddressTypeToString(info->type)); virDomainDeviceAddressTypeToString(info->type));
switch ((virDomainDeviceAddressType) info->type) { switch (info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
if (!virPCIDeviceAddressIsEmpty(&info->addr.pci)) { if (!virPCIDeviceAddressIsEmpty(&info->addr.pci)) {
virBufferAsprintf(&attrBuf, " domain='0x%04x' bus='0x%02x' " virBufferAsprintf(&attrBuf, " domain='0x%04x' bus='0x%02x' "
@ -5539,21 +5539,14 @@ static int
virDomainDeviceAddressParseXML(xmlNodePtr address, virDomainDeviceAddressParseXML(xmlNodePtr address,
virDomainDeviceInfo *info) virDomainDeviceInfo *info)
{ {
g_autofree char *type = virXMLPropString(address, "type"); if (virXMLPropEnum(address, "type",
virDomainDeviceAddressTypeFromString,
if (!type) { VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO,
virReportError(VIR_ERR_INTERNAL_ERROR, &info->type) < 0) {
"%s", _("No type specified for device address"));
return -1; return -1;
} }
if ((info->type = virDomainDeviceAddressTypeFromString(type)) <= 0) { switch (info->type) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown address type '%1$s'"), type);
return -1;
}
switch ((virDomainDeviceAddressType) info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
if (virPCIDeviceAddressParseXML(address, &info->addr.pci) < 0) if (virPCIDeviceAddressParseXML(address, &info->addr.pci) < 0)
return -1; return -1;
@ -19625,7 +19618,7 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfo *src,
return false; return false;
} }
switch ((virDomainDeviceAddressType) src->type) { switch (src->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
if (src->addr.pci.domain != dst->addr.pci.domain || if (src->addr.pci.domain != dst->addr.pci.domain ||
src->addr.pci.bus != dst->addr.pci.bus || src->addr.pci.bus != dst->addr.pci.bus ||

View File

@ -2806,7 +2806,7 @@ virDomainDeviceInfoValidate(const virDomainDeviceDef *dev)
if (!(info = virDomainDeviceGetInfo(dev))) if (!(info = virDomainDeviceGetInfo(dev)))
return 0; return 0;
switch ((virDomainDeviceAddressType) info->type) { switch (info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:

View File

@ -541,7 +541,7 @@ qemuBuildDeviceAddressProps(virJSONValue *props,
const virDomainDef *domainDef, const virDomainDef *domainDef,
const virDomainDeviceInfo *info) const virDomainDeviceInfo *info)
{ {
switch ((virDomainDeviceAddressType) info->type) { switch (info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: {
g_autofree char *pciaddr = NULL; g_autofree char *pciaddr = NULL;
g_autofree char *bus = qemuBuildDeviceAddressPCIGetBus(domainDef, info); g_autofree char *bus = qemuBuildDeviceAddressPCIGetBus(domainDef, info);
@ -981,7 +981,7 @@ qemuBuildVirtioDevGetConfig(const virDomainDeviceDef *device,
virBufferAdd(&buf, baseName, -1); virBufferAdd(&buf, baseName, -1);
switch ((virDomainDeviceAddressType) info->type) { switch (info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
implName = "pci"; implName = "pci";
break; break;

View File

@ -954,6 +954,18 @@ qemuMonitorInitBalloonObjectPath(qemuMonitor *mon,
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
name = "virtio-balloon-ccw"; name = "virtio-balloon-ccw";
break; break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED:
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
default: default:
return; return;
} }

View File

@ -1479,7 +1479,7 @@ qemuValidateDomainDeviceDefAddress(const virDomainDeviceDef *dev,
const virDomainDef *def, const virDomainDef *def,
virQEMUCaps *qemuCaps) virQEMUCaps *qemuCaps)
{ {
switch ((virDomainDeviceAddressType) info->type) { switch (info->type) {
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
if (qemuValidateDomainDeviceDefZPCIAddress(info, qemuCaps) < 0) if (qemuValidateDomainDeviceDefZPCIAddress(info, qemuCaps) < 0)
return -1; return -1;