[libvirt] [PATCH 4/5] conf: add global check for duplicate drive addresses

Michal Privoznik mprivozn at redhat.com
Fri Dec 2 16:28:58 UTC 2016


On 30.11.2016 12:47, Marc Hartmayer wrote:
> Add a global check for duplicate drive addresses. This will fix the
> problem of duplicate disk and hostdev drive addresses.
> 
> Example for duplicate drive addresses:
> <disk>
>   ...
>   <target name='sda'/>
> </disk>
> <disk>
>   ...
>   <target name='sdb'/>
>   <address type='drive' controller=0 bus=0 target=0 unit=0/>
> </disk>
> 
> Another example:
> <hostdev mode='subsystem' type='scsi' managed='no'>
>   <source>
>   ...
>   </source>
>   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> </hostdev>
> <hostdev mode='subsystem' type='scsi' managed='no'>
>   <source>
>   ...
>   </source>
>   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> </hostdev>
> 
> Unfortunately the fixes (1b08cc170a84077afd4d15f4639a9a2cf398e9a2,
> 8d46386bfe01b84982e25e915ad9cfbae5cf4cb1) weren't enough to catch these
> cases and it isn't possible to add additional checks in
> virDomainDeviceDefPostParseInternal() for SCSI hostdevs or
> virDomainDiskDefAssignAddress() for SCSI/IDE/FDC/SATA disks without
> adding another parse flag (virDomainDefParseFlags) to disable this
> validation while updating or detaching a disk or hostdev.
> 
> Signed-off-by: Marc Hartmayer <mhartmay at linux.vnet.ibm.com>
> Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> ---
>  src/conf/domain_conf.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 104 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index cd30728..cb47980 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -4841,6 +4841,107 @@ virDomainDefCheckDuplicateDiskInfo(const virDomainDef *def)
>      return 0;
>  }
>  
> +/**
> + * virDomainDefCheckDuplicateDriveAddresses:
> + * @def: domain definition to check against
> + *
> + * This function checks @def for duplicate drive addresses. Drive
> + * addresses are only in use for disks and hostdevs at the moment.
> + *
> + * Returns 0 in case of there are no duplicate drive addresses, -1
> + * otherwise.
> + */
> +static int
> +virDomainDefCheckDuplicateDriveAddresses(const virDomainDef *def)
> +{
> +    size_t i;
> +    size_t j;
> +
> +    for (i = 0; i < def->ndisks; i++) {
> +        virDomainDiskDefPtr disk_i = def->disks[i];
> +        virDomainDeviceInfoPtr disk_info_i = &disk_i->info;
> +        if (disk_info_i->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE)
> +            continue;

We like to have an empty line between variable declarations and the
actual code. Just like you did at the beginning of this function. But
that's something I can fix before pushing.

> +
> +        for (j = i + 1; j < def->ndisks; j++) {
> +            virDomainDiskDefPtr disk_j = def->disks[j];
> +            virDomainDeviceInfoPtr disk_info_j = &disk_j->info;
> +            if (disk_i->bus != disk_j->bus)
> +                continue;
> +
> +            if (disk_info_j->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE)
> +                continue;
> +
> +            if (virDomainDeviceInfoAddressIsEqual(disk_info_i, disk_info_j)) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("Found duplicate drive address for disk with "
> +                                 "target name '%s' controller='%u' bus='%u' "
> +                                 "target='%u' unit='%u'"),
> +                               disk_i->dst,
> +                               disk_info_i->addr.drive.controller,
> +                               disk_info_i->addr.drive.bus,
> +                               disk_info_i->addr.drive.target,
> +                               disk_info_i->addr.drive.unit);
> +                return -1;
> +            }
> +        }
> +
> +        /* Note: There is no need to check for conflicts with SCSI
> +         * hostdevs above, because conflicts with hostdevs are checked
> +         * in the next loop.
> +         */
> +    }

Michal




More information about the libvir-list mailing list