[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]