Sometimes image is being reopened without removing bdrv state and
therefore bitmaps. So here we allow not loading qcow2 bitmap if it
already exists. It may lead to problem, if existing of such bitmap is a
mistake - this mistake would be skipped.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>
Signed-off-by: Denis V. Lunev <d...@openvz.org>
---
 block/qcow2-bitmap.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index e94019c..def2005 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -642,15 +642,23 @@ static BdrvDirtyBitmap *load_bitmap(BlockDriverState *bs,
     }
 
     granularity = 1U << bmh->granularity_bits;
-    bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
+
+    bitmap = bdrv_find_dirty_bitmap(bs, name);
     if (bitmap == NULL) {
-        goto fail;
-    }
+        bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
+        if (bitmap == NULL) {
+            goto fail;
+        }
 
-    ret = load_bitmap_data(bs, bitmap_table, bmh->bitmap_table_size,
-                           bitmap);
-    if (ret < 0) {
-        error_setg_errno(errp, -ret, "Could not read bitmap from image");
+        ret = load_bitmap_data(bs, bitmap_table, bmh->bitmap_table_size,
+                               bitmap);
+        if (ret < 0) {
+            error_setg_errno(errp, -ret, "Could not read bitmap from image");
+            goto fail;
+        }
+    } else if (granularity != bdrv_dirty_bitmap_granularity(bitmap)) {
+        error_setg(errp, "Bitmap '%s' already exists with other granularity",
+                   name);
         goto fail;
     }
 
-- 
1.8.3.1


Reply via email to