Loading block/backup.c +2 −1 Original line number Diff line number Diff line Loading @@ -422,7 +422,8 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job) break; } offset = bdrv_dirty_bitmap_next_zero(job->sync_bitmap, offset); offset = bdrv_dirty_bitmap_next_zero(job->sync_bitmap, offset, UINT64_MAX); if (offset == -1) { hbitmap_set(job->copy_bitmap, cluster, end - cluster); break; Loading block/dirty-bitmap.c +3 −2 Original line number Diff line number Diff line Loading @@ -781,9 +781,10 @@ char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp) return hbitmap_sha256(bitmap->bitmap, errp); } int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset) int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset, uint64_t bytes) { return hbitmap_next_zero(bitmap->bitmap, offset); return hbitmap_next_zero(bitmap->bitmap, offset, bytes); } void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src, Loading include/block/dirty-bitmap.h +2 −1 Original line number Diff line number Diff line Loading @@ -99,7 +99,8 @@ bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs); BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp); int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t start); int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset, uint64_t bytes); BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, Error **errp); Loading include/qemu/hbitmap.h +7 −3 Original line number Diff line number Diff line Loading @@ -300,12 +300,16 @@ void hbitmap_iter_init(HBitmapIter *hbi, const HBitmap *hb, uint64_t first); unsigned long hbitmap_iter_skip_words(HBitmapIter *hbi); /* hbitmap_next_zero: * * Find next not dirty bit within selected range. If not found, return -1. * * @hb: The HBitmap to operate on * @start: The bit to start from. * * Find next not dirty bit. * @count: Number of bits to proceed. If @start+@count > bitmap size, the whole * bitmap is looked through. You can use UINT64_MAX as @count to search up to * the bitmap end. */ int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start); int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start, uint64_t count); /* hbitmap_create_meta: * Create a "meta" hbitmap to track dirtiness of the bits in this HBitmap. Loading nbd/server.c +1 −1 Original line number Diff line number Diff line Loading @@ -2014,7 +2014,7 @@ static unsigned int bitmap_to_extents(BdrvDirtyBitmap *bitmap, uint64_t offset, bool next_dirty = !dirty; if (dirty) { end = bdrv_dirty_bitmap_next_zero(bitmap, begin); end = bdrv_dirty_bitmap_next_zero(bitmap, begin, UINT64_MAX); } else { bdrv_set_dirty_iter(it, begin); end = bdrv_dirty_iter_next(it); Loading Loading
block/backup.c +2 −1 Original line number Diff line number Diff line Loading @@ -422,7 +422,8 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job) break; } offset = bdrv_dirty_bitmap_next_zero(job->sync_bitmap, offset); offset = bdrv_dirty_bitmap_next_zero(job->sync_bitmap, offset, UINT64_MAX); if (offset == -1) { hbitmap_set(job->copy_bitmap, cluster, end - cluster); break; Loading
block/dirty-bitmap.c +3 −2 Original line number Diff line number Diff line Loading @@ -781,9 +781,10 @@ char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp) return hbitmap_sha256(bitmap->bitmap, errp); } int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset) int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset, uint64_t bytes) { return hbitmap_next_zero(bitmap->bitmap, offset); return hbitmap_next_zero(bitmap->bitmap, offset, bytes); } void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src, Loading
include/block/dirty-bitmap.h +2 −1 Original line number Diff line number Diff line Loading @@ -99,7 +99,8 @@ bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs); BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp); int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t start); int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset, uint64_t bytes); BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, Error **errp); Loading
include/qemu/hbitmap.h +7 −3 Original line number Diff line number Diff line Loading @@ -300,12 +300,16 @@ void hbitmap_iter_init(HBitmapIter *hbi, const HBitmap *hb, uint64_t first); unsigned long hbitmap_iter_skip_words(HBitmapIter *hbi); /* hbitmap_next_zero: * * Find next not dirty bit within selected range. If not found, return -1. * * @hb: The HBitmap to operate on * @start: The bit to start from. * * Find next not dirty bit. * @count: Number of bits to proceed. If @start+@count > bitmap size, the whole * bitmap is looked through. You can use UINT64_MAX as @count to search up to * the bitmap end. */ int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start); int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start, uint64_t count); /* hbitmap_create_meta: * Create a "meta" hbitmap to track dirtiness of the bits in this HBitmap. Loading
nbd/server.c +1 −1 Original line number Diff line number Diff line Loading @@ -2014,7 +2014,7 @@ static unsigned int bitmap_to_extents(BdrvDirtyBitmap *bitmap, uint64_t offset, bool next_dirty = !dirty; if (dirty) { end = bdrv_dirty_bitmap_next_zero(bitmap, begin); end = bdrv_dirty_bitmap_next_zero(bitmap, begin, UINT64_MAX); } else { bdrv_set_dirty_iter(it, begin); end = bdrv_dirty_iter_next(it); Loading