[libvirt] [PATCH 1/2] conf: Detect misconfiguration between disk bus and disk address

Peter Krempa pkrempa at redhat.com
Wed Nov 16 08:09:42 UTC 2016


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 <mhartmay at linux.vnet.ibm.com>
> Reviewed-by: Bjoern Walk <bwalk at linux.vnet.ibm.com>
> ---
>  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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20161116/5040af5e/attachment-0001.sig>


More information about the libvir-list mailing list