9ae3a8
From cbffbb8195ec5370cbb2baf53148806b5a1c3dc8 Mon Sep 17 00:00:00 2001
9ae3a8
From: Fam Zheng <famz@redhat.com>
9ae3a8
Date: Wed, 9 Oct 2013 09:50:22 +0200
9ae3a8
Subject: [PATCH 10/11] vmdk: fix cluster size check for flat extents
9ae3a8
9ae3a8
RH-Author: Fam Zheng <famz@redhat.com>
9ae3a8
Message-id: <1381312223-7074-3-git-send-email-famz@redhat.com>
9ae3a8
Patchwork-id: 54794
9ae3a8
O-Subject: [RHEL-7 qemu-kvm PATCH 2/3] vmdk: fix cluster size check for flat extents
9ae3a8
Bugzilla: 1017049
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
9ae3a8
We use the extent size as cluster size for flat extents (where no L1/L2
9ae3a8
table is allocated so it's safe) reuse sector calculating code with
9ae3a8
sparse extents.
9ae3a8
9ae3a8
Don't pass in the cluster size for adding flat extent, just set it to
9ae3a8
sectors later, then the cluster size checking will not fail.
9ae3a8
9ae3a8
The cluster_sectors is changed to int64_t to allow big flat extent.
9ae3a8
9ae3a8
Without this, flat extent opening is broken:
9ae3a8
9ae3a8
    # qemu-img create -f vmdk -o subformat=monolithicFlat /tmp/a.vmdk 100G
9ae3a8
    Formatting '/tmp/a.vmdk', fmt=vmdk size=107374182400 compat6=off subformat='monolithicFlat' zeroed_grain=off
9ae3a8
    # qemu-img info /tmp/a.vmdk
9ae3a8
    image: /tmp/a.vmdk
9ae3a8
    file format: raw
9ae3a8
    virtual size: 0 (0 bytes)
9ae3a8
    disk size: 4.0K
9ae3a8
9ae3a8
Signed-off-by: Fam Zheng <famz@redhat.com>
9ae3a8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
(cherry picked from commit 301c7d38a0c359b91526391d13617386f3d9bb29)
9ae3a8
Signed-off-by: Fam Zheng <famz@redhat.com>
9ae3a8
---
9ae3a8
 block/vmdk.c | 6 +++---
9ae3a8
 1 file changed, 3 insertions(+), 3 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 block/vmdk.c |    6 +++---
9ae3a8
 1 files changed, 3 insertions(+), 3 deletions(-)
9ae3a8
9ae3a8
diff --git a/block/vmdk.c b/block/vmdk.c
9ae3a8
index b0b419b..66735ab 100644
9ae3a8
--- a/block/vmdk.c
9ae3a8
+++ b/block/vmdk.c
9ae3a8
@@ -105,7 +105,7 @@ typedef struct VmdkExtent {
9ae3a8
     uint32_t l2_cache_offsets[L2_CACHE_SIZE];
9ae3a8
     uint32_t l2_cache_counts[L2_CACHE_SIZE];
9ae3a8
 
9ae3a8
-    unsigned int cluster_sectors;
9ae3a8
+    int64_t cluster_sectors;
9ae3a8
 } VmdkExtent;
9ae3a8
 
9ae3a8
 typedef struct BDRVVmdkState {
9ae3a8
@@ -424,7 +424,7 @@ static int vmdk_add_extent(BlockDriverState *bs,
9ae3a8
     extent->l1_size = l1_size;
9ae3a8
     extent->l1_entry_sectors = l2_size * cluster_sectors;
9ae3a8
     extent->l2_size = l2_size;
9ae3a8
-    extent->cluster_sectors = cluster_sectors;
9ae3a8
+    extent->cluster_sectors = flat ? sectors : cluster_sectors;
9ae3a8
 
9ae3a8
     if (s->num_extents > 1) {
9ae3a8
         extent->end_sector = (*(extent - 1)).end_sector + extent->sectors;
9ae3a8
@@ -737,7 +737,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
9ae3a8
             VmdkExtent *extent;
9ae3a8
 
9ae3a8
             ret = vmdk_add_extent(bs, extent_file, true, sectors,
9ae3a8
-                            0, 0, 0, 0, sectors, &extent);
9ae3a8
+                            0, 0, 0, 0, 0, &extent);
9ae3a8
             if (ret < 0) {
9ae3a8
                 return ret;
9ae3a8
             }
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8