[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 07/34] qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap
From: |
Max Reitz |
Subject: |
[PULL 07/34] qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap |
Date: |
Mon, 6 Jan 2020 15:41:39 +0100 |
From: Vladimir Sementsov-Ogievskiy <address@hidden>
qcow2_can_store_new_dirty_bitmap works wrong, as it considers only
bitmaps already stored in the qcow2 image and ignores persistent
BdrvDirtyBitmap objects.
So, let's instead count persistent BdrvDirtyBitmaps. We load all qcow2
bitmaps on open, so there should not be any bitmap in the image for
which we don't have BdrvDirtyBitmaps version. If it is - it's a kind of
corruption, and no reason to check for corruptions here (open() and
close() are better places for it).
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Message-id: address@hidden
Reviewed-by: Max Reitz <address@hidden>
Cc: address@hidden
Signed-off-by: Max Reitz <address@hidden>
---
block/qcow2-bitmap.c | 41 ++++++++++++++++++-----------------------
1 file changed, 18 insertions(+), 23 deletions(-)
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index c6c8ebbe89..d41f5d049b 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -1703,8 +1703,14 @@ bool coroutine_fn
qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
Error **errp)
{
BDRVQcow2State *s = bs->opaque;
- bool found;
- Qcow2BitmapList *bm_list;
+ BdrvDirtyBitmap *bitmap;
+ uint64_t bitmap_directory_size = 0;
+ uint32_t nb_bitmaps = 0;
+
+ if (bdrv_find_dirty_bitmap(bs, name)) {
+ error_setg(errp, "Bitmap already exists: %s", name);
+ return false;
+ }
if (s->qcow_version < 3) {
/* Without autoclear_features, we would always have to assume
@@ -1720,38 +1726,27 @@ bool coroutine_fn
qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
goto fail;
}
- if (s->nb_bitmaps == 0) {
- return true;
+ FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
+ if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
+ nb_bitmaps++;
+ bitmap_directory_size +=
+ calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap)), 0);
+ }
}
+ nb_bitmaps++;
+ bitmap_directory_size += calc_dir_entry_size(strlen(name), 0);
- if (s->nb_bitmaps >= QCOW2_MAX_BITMAPS) {
+ if (nb_bitmaps > QCOW2_MAX_BITMAPS) {
error_setg(errp,
"Maximum number of persistent bitmaps is already reached");
goto fail;
}
- if (s->bitmap_directory_size + calc_dir_entry_size(strlen(name), 0) >
- QCOW2_MAX_BITMAP_DIRECTORY_SIZE)
- {
+ if (bitmap_directory_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
error_setg(errp, "Not enough space in the bitmap directory");
goto fail;
}
- qemu_co_mutex_lock(&s->lock);
- bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
- s->bitmap_directory_size, errp);
- qemu_co_mutex_unlock(&s->lock);
- if (bm_list == NULL) {
- goto fail;
- }
-
- found = find_bitmap_by_name(bm_list, name);
- bitmap_list_free(bm_list);
- if (found) {
- error_setg(errp, "Bitmap with the same name is already stored");
- goto fail;
- }
-
return true;
fail:
--
2.24.1
- [PULL 00/34] Block patches, Max Reitz, 2020/01/06
- [PULL 01/34] block: Add bdrv_qapi_perm_to_blk_perm(), Max Reitz, 2020/01/06
- [PULL 02/34] block: Use bdrv_qapi_perm_to_blk_perm(), Max Reitz, 2020/01/06
- [PULL 03/34] blkdebug: Allow taking/unsharing permissions, Max Reitz, 2020/01/06
- [PULL 04/34] iotests: Add @error to wait_until_completed, Max Reitz, 2020/01/06
- [PULL 05/34] iotests: Add test for failing mirror complete, Max Reitz, 2020/01/06
- [PULL 06/34] throttle-groups: fix memory leak in throttle_group_set_limit:, Max Reitz, 2020/01/06
- [PULL 07/34] qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap,
Max Reitz <=
- [PULL 08/34] iotests: s/qocw2/qcow2/, Max Reitz, 2020/01/06
- [PULL 09/34] iotests/qcow2.py: Add dump-header-exts, Max Reitz, 2020/01/06
- [PULL 11/34] iotests: Add _filter_json_filename, Max Reitz, 2020/01/06
- [PULL 10/34] iotests/qcow2.py: Split feature fields into bits, Max Reitz, 2020/01/06
- [PULL 12/34] iotests: Filter refcount_order in 036, Max Reitz, 2020/01/06
- [PULL 13/34] iotests: Replace IMGOPTS by _unsupported_imgopts, Max Reitz, 2020/01/06
- [PULL 14/34] iotests: Drop compat=1.1 in 050, Max Reitz, 2020/01/06
- [PULL 15/34] iotests: Let _make_test_img parse its parameters, Max Reitz, 2020/01/06
- [PULL 16/34] iotests: Add -o and --no-opts to _make_test_img, Max Reitz, 2020/01/06
- [PULL 17/34] iotests: Inject space into -ocompat=0.10 in 051, Max Reitz, 2020/01/06