[libvirt] [PATCH 3/6] vz: check supported disk format and bus
Maxim Nestratov
mnestratov at virtuozzo.com
Wed Mar 16 07:53:44 UTC 2016
15.03.2016 10:47, Mikhail Feoktistov пишет:
> In DomainPostParse phase we check disk format and bus.
> If disk format is not specified in XML (VIR_STORAGE_FILE_NONE) than we accept this disk.
> Otherwise we try to find disk format in vzCapabilities struct.
> Also we try to find disk bus in vzCapabilities->diskBuses.
> It contains buses that we support.
> ---
> src/vz/vz_driver.c | 6 +++++-
> src/vz/vz_sdk.c | 24 ++----------------------
> src/vz/vz_utils.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/vz/vz_utils.h | 3 +++
> 4 files changed, 62 insertions(+), 23 deletions(-)
>
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index 5d48d7e..4f52bc7 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -175,8 +175,11 @@ static int
> vzDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED,
> virCapsPtr caps ATTRIBUTE_UNUSED,
> unsigned int parseFlags ATTRIBUTE_UNUSED,
> - void *opaque ATTRIBUTE_UNUSED)
> + void *opaque)
> {
> + if (vzCheckUnsupportedDisks(def, opaque) < 0)
> + return -1;
> +
> return 0;
> }
>
> @@ -239,6 +242,7 @@ vzOpenDefault(virConnectPtr conn)
> if (!(privconn->caps = vzBuildCapabilities()))
> goto error;
>
> + vzDomainDefParserConfig.priv = &privconn->vzCaps;
> if (!(privconn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
> NULL, NULL)))
> goto error;
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index de73c31..2a6e908 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -3143,30 +3143,10 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
> pret = PrlVmDev_SetConnected(sdkdisk, 1);
> prlsdkCheckRetGoto(pret, cleanup);
>
> - if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
> - if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
> - virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_PLOOP) {
> -
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format of "
> - "disk %s, vz driver supports only "
> - "images in ploop format."), disk->src->path);
> - goto cleanup;
> - }
> -
> + if (disk->src->type == VIR_STORAGE_TYPE_FILE)
> emutype = PDT_USE_IMAGE_FILE;
> - } else {
> - if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
> - (virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_RAW &&
> - virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_NONE &&
> - virDomainDiskGetFormat(disk) != VIR_STORAGE_FILE_AUTO)) {
> -
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid format "
> - "of disk %s, it should be either not set, or set "
> - "to raw or auto."), disk->src->path);
> - goto cleanup;
> - }
> + else
> emutype = PDT_USE_REAL_DEVICE;
I know you keep the logic we currently have but this is not true because
"not file" doesn't mean "real device"
and else if (disk->src->type == VIR_STORAGE_TYPE_BLOCK) would make sence
here.
> - }
>
> pret = PrlVmDev_SetEmulatedType(sdkdisk, emutype);
> prlsdkCheckRetGoto(pret, cleanup);
> diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
> index d8a95ac..bf62538 100644
> --- a/src/vz/vz_utils.c
> +++ b/src/vz/vz_utils.c
> @@ -249,3 +249,55 @@ vzInitVersion(vzConnPtr privconn)
> VIR_FREE(output);
> return ret;
> }
> +
> +int vzCheckUnsupportedDisks(virDomainDefPtr def,
> + vzCapabilitiesPtr vzCaps)
> +{
> + size_t i, j;
> + virDomainDiskDefPtr disk;
> + virStorageFileFormat diskFormat;
> + bool supported;
> +
> + for (i = 0; i < def->ndisks; i++) {
> + disk = def->disks[i];
> + diskFormat = virDomainDiskGetFormat(disk);
> + // disk format
unnecessary commentary
> + supported = true;
> + if (disk->src->type == VIR_STORAGE_TYPE_FILE) {
> + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
> + diskFormat != VIR_STORAGE_FILE_NONE) {
> +
> + if (IS_CT(def))
> + supported = vzCaps->ctDiskFormat == diskFormat;
> + else
> + supported = vzCaps->vmDiskFormat == diskFormat;
> + }
> + } else {
again, else if (disk->src->type == VIR_STORAGE_TYPE_BLOCK) would make
sence here
> + if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> + supported = diskFormat == VIR_STORAGE_FILE_RAW ||
> + diskFormat == VIR_STORAGE_FILE_NONE ||
> + diskFormat == VIR_STORAGE_FILE_AUTO;
> + }
> + }
else block with supported = false is required because there are
VIR_STORAGE_TYPE_NETWORK
VIR_STORAGE_TYPE_DIR and VIR_STORAGE_TYPE_VOLUME
> +
> + if (!supported) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Unsupported format of disk %s"),
swearing about unsupported format isn't completely correct here if we do
proposed above correction
> + disk->src->path);
> + return -1;
> + }
> + //disk bus
> + for (j = 0; vzCaps->diskBuses[j] != VIR_DOMAIN_DISK_BUS_LAST; j++) {
> + if (disk->bus == vzCaps->diskBuses[j])
> + break;
> + }
> +
> + if (vzCaps->diskBuses[j] == VIR_DOMAIN_DISK_BUS_LAST) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Unsupported disk bus type %s"),
> + virDomainDiskBusTypeToString(disk->bus));
> + return -1;
> + }
> + }
> + return 0;
> +}
> diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
> index e0b0105..851322f 100644
> --- a/src/vz/vz_utils.h
> +++ b/src/vz/vz_utils.h
> @@ -110,6 +110,9 @@ vzNewDomain(vzConnPtr privconn,
> const unsigned char *uuid);
> int
> vzInitVersion(vzConnPtr privconn);
> +int
> +vzCheckUnsupportedDisks(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