[libvirt] [PATCH 5/6] vz: check supported controllers

Maxim Nestratov mnestratov at virtuozzo.com
Wed Mar 16 08:04:00 UTC 2016


15.03.2016 10:47, Mikhail Feoktistov пишет:
> Virtuozzo6 supports only SCSI(BUSLOGIC) IDE and SATA controllers.
> Virtuozzo7 supports only SCSI(VIRTIO_SCSI) and IDE.
> In this patch we add list of supported controllers and scsi models to vzCapabilities structure.
> In openConnection() callback we get virtuozzo version and select proper capabilities values.
> In XMLPostParse phase we check controller type and SCSI model.
> ---
>   src/vz/vz_driver.c |  3 +++
>   src/vz/vz_utils.c  | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>   src/vz/vz_utils.h  |  5 +++++
>   3 files changed, 56 insertions(+)
>
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index 4f52bc7..74e1f5d 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -180,6 +180,9 @@ vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED,
>       if (vzCheckUnsupportedDisks(def, opaque) < 0)
>           return -1;
>   
> +    if (vzCheckUnsupportedControllers(def, opaque) < 0)
> +        return -1;
> +
>       return 0;
>   }
>   
> diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
> index bf62538..58014ec 100644
> --- a/src/vz/vz_utils.c
> +++ b/src/vz/vz_utils.c
> @@ -45,6 +45,15 @@ static virDomainDiskBus vz7DiskBuses[] = {VIR_DOMAIN_DISK_BUS_IDE,
>                                             VIR_DOMAIN_DISK_BUS_SCSI,
>                                             VIR_DOMAIN_DISK_BUS_LAST};
>   
> +static virDomainControllerType vz6ControllerTypes[] = {VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
> +                                                       VIR_DOMAIN_CONTROLLER_TYPE_IDE,
> +                                                       VIR_DOMAIN_CONTROLLER_TYPE_SATA,
> +                                                       VIR_DOMAIN_CONTROLLER_TYPE_LAST};
> +
> +static virDomainControllerType vz7ControllerTypes[] = {VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
> +                                                       VIR_DOMAIN_CONTROLLER_TYPE_IDE,
> +                                                       VIR_DOMAIN_CONTROLLER_TYPE_LAST};
> +
>   /**
>    * vzDomObjFromDomain:
>    * @domain: Domain pointer that has to be looked up
> @@ -196,10 +205,14 @@ vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps)
>           vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
>           vzCaps->vmDiskFormat = VIR_STORAGE_FILE_PLOOP;
>           vzCaps->diskBuses = vz6DiskBuses;
> +        vzCaps->controllerTypes = vz6ControllerTypes;
> +        vzCaps->scsiControllerModel = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC;
>       } else {
>           vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
>           vzCaps->vmDiskFormat = VIR_STORAGE_FILE_QCOW2;
>           vzCaps->diskBuses = vz7DiskBuses;
> +        vzCaps->controllerTypes = vz7ControllerTypes;
> +        vzCaps->scsiControllerModel = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI;
>       }
>   }
>   
> @@ -301,3 +314,38 @@ int vzCheckUnsupportedDisks(virDomainDefPtr def,
>       }
>       return 0;
>   }
> +
> +int vzCheckUnsupportedControllers(virDomainDefPtr def,
> +                                 vzCapabilitiesPtr vzCaps)

int
vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps)

declaration would comply with both line lenght and other function 
declaration style

> +{
> +    size_t i, j;
> +    virDomainControllerDefPtr controller;
> +
> +    for (i = 0; i < def->ncontrollers; i++) {
> +        controller = def->controllers[i];
> +
> +        for (j = 0; vzCaps->controllerTypes[j] != VIR_DOMAIN_CONTROLLER_TYPE_LAST; j++) {
> +            if (controller->type == vzCaps->controllerTypes[j])
> +                break;
> +        }
> +
> +        if (vzCaps->controllerTypes[j] == VIR_DOMAIN_CONTROLLER_TYPE_LAST) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("Unsupported controller type %s"),
> +                           virDomainControllerTypeToString(controller->type));
> +            return -1;
> +        }
> +
> +        if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI &&
> +            controller->model != -1 &&
> +            controller->model != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO &&
> +            controller->model != vzCaps->scsiControllerModel) {
> +
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("Unsupported SCSI controller model %s"),
> +                               virDomainControllerModelSCSITypeToString(controller->model));
> +                return -1;
> +        }
> +    }
> +    return 0;
> +}
> diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
> index 851322f..88e74fc 100644
> --- a/src/vz/vz_utils.h
> +++ b/src/vz/vz_utils.h
> @@ -54,6 +54,8 @@ struct _vzCapabilities {
>       virStorageFileFormat vmDiskFormat;
>       virStorageFileFormat ctDiskFormat;
>       virDomainDiskBus *diskBuses;
> +    virDomainControllerType *controllerTypes;
> +    virDomainControllerModelSCSI scsiControllerModel;
>   };
>   typedef struct _vzCapabilities vzCapabilities;
>   typedef struct _vzCapabilities *vzCapabilitiesPtr;
> @@ -113,6 +115,9 @@ vzInitVersion(vzConnPtr privconn);
>   int
>   vzCheckUnsupportedDisks(virDomainDefPtr def,
>                           vzCapabilitiesPtr vzCaps);
> +int
> +vzCheckUnsupportedControllers(virDomainDefPtr def,
> +                              vzCapabilitiesPtr vzCaps);
>   
>   # define PARALLELS_BLOCK_STATS_FOREACH(OP)                              \
>       OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")        \




More information about the libvir-list mailing list