On Tue, Nov 15, 2016 at 19:40:58 +0100, Marc Hartmayer wrote: > This patch detects a misconfiguration between the disk bus type and disk > address type for controller based disk buses (SATA, SCSI, FDC and > IDE). The addresses of these bus types are all managed in common code so > it's possible to decide in common code whether the disk address and bus > type are compatible or not. > > Signed-off-by: Marc Hartmayer <[email protected]> > Reviewed-by: Bjoern Walk <[email protected]> > --- > src/conf/domain_conf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 6e008e2..0cdcc9f 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -4664,6 +4664,38 @@ virDomainDefPostParse(virDomainDefPtr def, > } > > > +/** > + * virDomainDiskAddressDiskBusCompatibility: > + * @bus: disk bus type > + * @addressType: disk address type > + * > + * Check if the specified disk address type @addressType is compatible > + * with the specified disk bus type @bus. This function checks > + * compatibility with the bus types SATA, SCSI, FDC, and IDE only, > + * because only these are handled in common code. > + * > + * Returns true if compatible or can't be decided in common code, > + * false if known to be not compatible. > + */ > +static bool > +virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus, > + virDomainDeviceAddressType > addressType) > +{ > + if (addressType == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) > + return true; > + > + switch (bus) { > + case VIR_DOMAIN_DISK_BUS_SATA: > + case VIR_DOMAIN_DISK_BUS_SCSI: > + case VIR_DOMAIN_DISK_BUS_FDC: > + case VIR_DOMAIN_DISK_BUS_IDE: > + return addressType == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; > + default:
We tend to use a full enumeration of the types rather than the default
case along with a typecast of the switched variable to the correct type
so that the compiler checks if a new enum value is added.
> + return true;
> + }
> +}
> +
> +
> static int
> virDomainDiskDefValidate(const virDomainDiskDef *disk)
> {
> @@ -4681,6 +4713,20 @@ virDomainDiskDefValidate(const virDomainDiskDef *disk)
> }
> }
>
> + /* Reject disks with a bus type that is not compatible with the
> + * given address type. The function considers only buses that are
> + * handled in common code. For other bus types it's not possible
> + * to decide compatibility in common code.
> + */
This comment is kind of redundant with the comment of the function.
> + if (!virDomainDiskAddressDiskBusCompatibility(disk->bus,
> disk->info.type)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Invalid address type '%s' for the disk '%s' with
> the bus type '%s'"),
> + virDomainDeviceAddressTypeToString(disk->info.type),
> + disk->dst,
> + virDomainDiskBusTypeToString(disk->bus));
> + return -1;
> + }
> +
> return 0;
> }
Peter
signature.asc
Description: PGP signature
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
