Re: [libvirt] [PATCH 3/6] vz: check supported disk format and bus
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_UNSUPPORTE
[libvirt] [PATCH 3/6] vz: check supported disk format and bus
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; -} 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 +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 { +if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) { +supported = diskFormat == VIR_STORAGE_FILE_RAW || +diskFormat == VIR_STORAGE_FILE_NONE || +diskFormat == VIR_STORAGE_FILE_AUTO; +} +} + +if (!supported) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported format of disk %s"), + 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"), +