@@ -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;
}