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") \