as an image filename. This is preparational commit to read snapshot
information from XML. This is the only global parameter which will be
kept in BDRVParallelsState, the rest should be layered down into
snapshots information structure.

Signed-off-by: Denis V. Lunev <d...@openvz.org>
CC: Jeff Cody <jc...@redhat.com>
CC: Kevin Wolf <kw...@redhat.com>
CC: Stefan Hajnoczi <stefa...@redhat.com>
---
 block/parallels.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 718274b..0c0e669 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -107,6 +107,7 @@ static int parallels_open_image(BlockDriverState *bs, Error 
**errp)
     int i;
     struct parallels_header ph;
     int ret;
+    int64_t total_sectors;
 
     bs->read_only = 1; // no write support yet
 
@@ -115,20 +116,35 @@ static int parallels_open_image(BlockDriverState *bs, 
Error **errp)
         goto fail;
     }
 
-    bs->total_sectors = le64_to_cpu(ph.nb_sectors);
+    total_sectors = le64_to_cpu(ph.nb_sectors);
 
     if (le32_to_cpu(ph.version) != HEADER_VERSION) {
         goto fail_format;
     }
     if (!memcmp(ph.magic, HEADER_MAGIC, 16)) {
         s->off_multiplier = 1;
-        bs->total_sectors = 0xffffffff & bs->total_sectors;
+        total_sectors = 0xffffffff & total_sectors;
     } else if (!memcmp(ph.magic, HEADER_MAGIC2, 16)) {
         s->off_multiplier = le32_to_cpu(ph.tracks);
     } else {
         goto fail_format;
     }
 
+    if (total_sectors == 0) {
+        error_setg(errp, "Invalid image: zero total sectors");
+        ret = -EINVAL;
+        goto fail;
+    }
+    if (bs->total_sectors == 0) {
+        /* no descriptor file, standalone image opened */
+        bs->total_sectors = total_sectors;
+    }
+    if (bs->total_sectors != total_sectors) {
+        error_setg(errp, "Invalid image: wrong total sectors");
+        ret = -EINVAL;
+        goto fail;
+    }
+
     s->tracks = le32_to_cpu(ph.tracks);
     if (s->tracks == 0) {
         error_setg(errp, "Invalid image: Zero sectors per track");
@@ -234,7 +250,7 @@ static int parallels_open_xml(BlockDriverState *bs, int 
flags, Error **errp)
     int size, ret;
     xmlDoc *doc = NULL;
     xmlNode *root, *image;
-    char *xml = NULL;
+    char *xml = NULL, *endptr;
     const char *data;
     char image_path[PATH_MAX];
     Error *local_err = NULL;
@@ -271,7 +287,6 @@ static int parallels_open_xml(BlockDriverState *bs, int 
flags, Error **errp)
 
     data = xml_get_text(root, "Disk_Parameters", "Padding", NULL);
     if (data != NULL) {
-        char *endptr;
         unsigned long pad;
 
         pad = strtoul(data, &endptr, 0);
@@ -281,6 +296,16 @@ static int parallels_open_xml(BlockDriverState *bs, int 
flags, Error **errp)
         s->padding = (uint32_t)pad;
     }
 
+    data = xml_get_text(root, "Disk_Parameters", "Disk_size", NULL);
+    if (data == NULL) {
+        goto fail;
+    } else {
+        bs->total_sectors = strtoull(data, &endptr, 0);
+        if (endptr != NULL && *endptr != '\0') {
+            goto fail;
+        }
+    }
+
     image = xml_seek(root, "StorageData", "Storage", "Image", NULL);
     data = ""; /* make gcc happy */
     for (size = 0; image != NULL; image = image->next) {
-- 
1.9.1


Reply via email to