and bdrv_dirty_bitmap_reverse() helper Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> --- block/dirty-bitmap.c | 9 +++++++++ include/block/block_int-io.h | 1 + include/qemu/hbitmap.h | 8 ++++++++ util/hbitmap.c | 15 +++++++++++++++ 4 files changed, 33 insertions(+)
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c index 13a1979755..c7f453fdb9 100644 --- a/block/dirty-bitmap.c +++ b/block/dirty-bitmap.c @@ -888,3 +888,12 @@ void bdrv_dirty_bitmap_merge_internal(BdrvDirtyBitmap *dest, } } } + +void bdrv_dirty_bitmap_reverse(BdrvDirtyBitmap *bitmap) +{ + assert(!bdrv_dirty_bitmap_readonly(bitmap)); + assert(!bdrv_dirty_bitmap_inconsistent(bitmap)); + bdrv_dirty_bitmaps_lock(bitmap->bs); + hbitmap_reverse(bitmap->bitmap); + bdrv_dirty_bitmaps_unlock(bitmap->bs); +} diff --git a/include/block/block_int-io.h b/include/block/block_int-io.h index 4a7cf2b4fd..093613e7d1 100644 --- a/include/block/block_int-io.h +++ b/include/block/block_int-io.h @@ -109,6 +109,7 @@ void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out); void bdrv_dirty_bitmap_merge_internal(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src, HBitmap **backup, bool lock); +void bdrv_dirty_bitmap_reverse(BdrvDirtyBitmap *bitmap); void bdrv_inc_in_flight(BlockDriverState *bs); void bdrv_dec_in_flight(BlockDriverState *bs); diff --git a/include/qemu/hbitmap.h b/include/qemu/hbitmap.h index 8136e33674..dbdc9aa2d4 100644 --- a/include/qemu/hbitmap.h +++ b/include/qemu/hbitmap.h @@ -350,4 +350,12 @@ bool hbitmap_status(const HBitmap *hb, int64_t start, int64_t count, */ int64_t hbitmap_iter_next(HBitmapIter *hbi); +/** + * hbitmap_reverse: + * @bitmap: The HBitmap to operate on + * + * Reverse the bits in the bitmap. + */ +void hbitmap_reverse(HBitmap *bitmap); + #endif diff --git a/util/hbitmap.c b/util/hbitmap.c index 16674f33e4..b99c4b1eec 100644 --- a/util/hbitmap.c +++ b/util/hbitmap.c @@ -940,3 +940,18 @@ char *hbitmap_sha256(const HBitmap *bitmap, Error **errp) return hash; } + +void hbitmap_reverse(HBitmap *bitmap) +{ + int64_t pnum, pos = 0; + int64_t size = bitmap->orig_size; + + while (pos < size) { + if (hbitmap_status(bitmap, pos, size - pos, &pnum)) { + hbitmap_reset(bitmap, pos, pnum); + } else { + hbitmap_set(bitmap, pos, pnum); + } + pos += pnum; + } +} -- 2.43.0