[libvirt] [PATCH v4 03/14] conf: Introduce virDomainHostdevDefPostParse

Laine Stump laine at laine.org
Fri Mar 24 03:17:00 UTC 2017


On 03/22/2017 11:27 AM, Erik Skultety wrote:
> Just to make the code a bit cleaner, move hostdev specific post parse
> code to its own function just in case it grows in the future.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  src/conf/domain_conf.c | 75 +++++++++++++++++++++++++++++++-------------------
>  1 file changed, 47 insertions(+), 28 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 568bf6722e..a5ab42297d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -4219,6 +4219,50 @@ virDomainHostdevAssignAddress(virDomainXMLOptionPtr xmlopt,
>  
>  
>  static int
> +virDomainHostdevDefPostParse(virDomainHostdevDefPtr dev,
> +                             const virDomainDef *def,
> +                             virDomainXMLOptionPtr xmlopt)
> +{
> +    if (dev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
> +        return 0;
> +
> +    switch (dev->source.subsys.type) {

I had to actually go look at the definition of virHostdevIsSCSIDevice()
to see that the above lines do exactly duplicate the original
functionality. And I like it the way you've done it (putting in a
switch() on the type rather than hiding the check in a utility function)
better - it will make more sense when it's expanded.


ACK.

> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
> +        if (dev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
> +            virDomainHostdevAssignAddress(xmlopt, def, dev) < 0) {
> +            virReportError(VIR_ERR_XML_ERROR, "%s",
> +                           _("Cannot assign SCSI host device address"));
> +            return -1;
> +        } else {
> +            /* Ensure provided address doesn't conflict with existing
> +             * scsi disk drive address
> +             */
> +            virDomainDeviceDriveAddressPtr addr = &dev->info->addr.drive;
> +            if (virDomainDriveAddressIsUsedByDisk(def,
> +                                                  VIR_DOMAIN_DISK_BUS_SCSI,
> +                                                  addr)) {
> +                virReportError(VIR_ERR_XML_ERROR,
> +                               _("SCSI host address controller='%u' "
> +                                 "bus='%u' target='%u' unit='%u' in "
> +                                 "use by a SCSI disk"),
> +                               addr->controller, addr->bus,
> +                               addr->target, addr->unit);
> +                return -1;
> +            }
> +        }
> +        break;
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
> +        break;
> +    }
> +
> +    return 0;
> +}
> +
> +
> +static int
>  virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
>                                      const virDomainDef *def,
>                                      virCapsPtr caps ATTRIBUTE_UNUSED,
> @@ -4299,34 +4343,9 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
>          video->vram = VIR_ROUND_UP_POWER_OF_TWO(video->vram);
>      }
>  
> -    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
> -        virDomainHostdevDefPtr hdev = dev->data.hostdev;
> -
> -        if (virHostdevIsSCSIDevice(hdev)) {
> -            if (hdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
> -                virDomainHostdevAssignAddress(xmlopt, def, hdev) < 0) {
> -                virReportError(VIR_ERR_XML_ERROR, "%s",
> -                               _("Cannot assign SCSI host device address"));
> -                return -1;
> -            } else {
> -                /* Ensure provided address doesn't conflict with existing
> -                 * scsi disk drive address
> -                 */
> -                virDomainDeviceDriveAddressPtr addr = &hdev->info->addr.drive;
> -                if (virDomainDriveAddressIsUsedByDisk(def,
> -                                                      VIR_DOMAIN_DISK_BUS_SCSI,
> -                                                      addr)) {
> -                    virReportError(VIR_ERR_XML_ERROR,
> -                                   _("SCSI host address controller='%u' "
> -                                     "bus='%u' target='%u' unit='%u' in "
> -                                     "use by a SCSI disk"),
> -                                   addr->controller, addr->bus,
> -                                   addr->target, addr->unit);
> -                    return -1;
> -                }
> -            }
> -        }
> -    }
> +    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
> +        virDomainHostdevDefPostParse(dev->data.hostdev, def, xmlopt) < 0)
> +        return -1;
>  
>      if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER) {
>          virDomainControllerDefPtr cdev = dev->data.controller;
> 




More information about the libvir-list mailing list