Move the qcow2_check_bitmaps_refcounts function in order to be able to
call update_ext_header_and_dir from this function in the following patch.
Signed-off-by: Jean-Louis Dupond <jean-louis@dupond.be>
---
block/qcow2-bitmap.c | 154 +++++++++++++++++++++----------------------
1 file changed, 77 insertions(+), 77 deletions(-)
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index 256ec99878..b87940bb43 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -652,83 +652,6 @@ fail:
return NULL;
}
-int coroutine_fn
-qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
- void **refcount_table,
- int64_t *refcount_table_size)
-{
- int ret;
- BDRVQcow2State *s = bs->opaque;
- Qcow2BitmapList *bm_list;
- Qcow2Bitmap *bm;
-
- if (s->nb_bitmaps == 0) {
- return 0;
- }
-
- ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, refcount_table_size,
- s->bitmap_directory_offset,
- s->bitmap_directory_size);
- if (ret < 0) {
- return ret;
- }
-
- bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
- s->bitmap_directory_size, NULL);
- if (bm_list == NULL) {
- res->corruptions++;
- return -EINVAL;
- }
-
- QSIMPLEQ_FOREACH(bm, bm_list, entry) {
- uint64_t *bitmap_table = NULL;
- int i;
-
- ret = qcow2_inc_refcounts_imrt(bs, res,
- refcount_table, refcount_table_size,
- bm->table.offset,
- bm->table.size * BME_TABLE_ENTRY_SIZE);
- if (ret < 0) {
- goto out;
- }
-
- ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
- if (ret < 0) {
- res->corruptions++;
- goto out;
- }
-
- for (i = 0; i < bm->table.size; ++i) {
- uint64_t entry = bitmap_table[i];
- uint64_t offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
-
- if (check_table_entry(entry, s->cluster_size) < 0) {
- res->corruptions++;
- continue;
- }
-
- if (offset == 0) {
- continue;
- }
-
- ret = qcow2_inc_refcounts_imrt(bs, res,
- refcount_table, refcount_table_size,
- offset, s->cluster_size);
- if (ret < 0) {
- g_free(bitmap_table);
- goto out;
- }
- }
-
- g_free(bitmap_table);
- }
-
-out:
- bitmap_list_free(bm_list);
-
- return ret;
-}
-
/* bitmap_list_store
* Store bitmap list to qcow2 image as a bitmap directory.
* Everything is checked.
@@ -1807,3 +1730,80 @@ uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *in_bs,
return bitmaps_size;
}
+
+int coroutine_fn
+qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ void **refcount_table,
+ int64_t *refcount_table_size)
+{
+ int ret;
+ BDRVQcow2State *s = bs->opaque;
+ Qcow2BitmapList *bm_list;
+ Qcow2Bitmap *bm;
+
+ if (s->nb_bitmaps == 0) {
+ return 0;
+ }
+
+ ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, refcount_table_size,
+ s->bitmap_directory_offset,
+ s->bitmap_directory_size);
+ if (ret < 0) {
+ return ret;
+ }
+
+ bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
+ s->bitmap_directory_size, NULL);
+ if (bm_list == NULL) {
+ res->corruptions++;
+ return -EINVAL;
+ }
+
+ QSIMPLEQ_FOREACH(bm, bm_list, entry) {
+ uint64_t *bitmap_table = NULL;
+ int i;
+
+ ret = qcow2_inc_refcounts_imrt(bs, res,
+ refcount_table, refcount_table_size,
+ bm->table.offset,
+ bm->table.size * BME_TABLE_ENTRY_SIZE);
+ if (ret < 0) {
+ goto out;
+ }
+
+ ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
+ if (ret < 0) {
+ res->corruptions++;
+ goto out;
+ }
+
+ for (i = 0; i < bm->table.size; ++i) {
+ uint64_t entry = bitmap_table[i];
+ uint64_t offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
+
+ if (check_table_entry(entry, s->cluster_size) < 0) {
+ res->corruptions++;
+ continue;
+ }
+
+ if (offset == 0) {
+ continue;
+ }
+
+ ret = qcow2_inc_refcounts_imrt(bs, res,
+ refcount_table, refcount_table_size,
+ offset, s->cluster_size);
+ if (ret < 0) {
+ g_free(bitmap_table);
+ goto out;
+ }
+ }
+
+ g_free(bitmap_table);
+ }
+
+out:
+ bitmap_list_free(bm_list);
+
+ return ret;
+}
--
2.54.0
On 21.05.26 12:19, Jean-Louis Dupond wrote: > Move the qcow2_check_bitmaps_refcounts function in order to be able to > call update_ext_header_and_dir from this function in the following patch. > > Signed-off-by: Jean-Louis Dupond <jean-louis@dupond.be> IMO, for such cases it's better just create a forward declaration for needed function (update_ext_header_and_dir) at top of the file. Such movements makes extra complexes (conflicts) for any kind of future patch rebasing (porting patches to/from downstream, conflicting series, ..) (And one another small negative thing is that to honestly review such patch, I had to apply it locally, to check, is it a clear copy with no changes or not) -- Best regards, Vladimir
© 2016 - 2026 Red Hat, Inc.