block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()

Add a convenient function similar with bdrv_block_status() to get
status of dirty bitmap.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220303194349.2304213-9-vsementsov@virtuozzo.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2022-03-03 20:43:41 +01:00 committed by Hanna Reitz
parent 84b1e80f67
commit a6426475a7
4 changed files with 53 additions and 0 deletions

View File

@ -879,6 +879,12 @@ bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
dirty_start, dirty_count);
}
bool bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap, int64_t offset,
int64_t bytes, int64_t *count)
{
return hbitmap_status(bitmap->bitmap, offset, bytes, count);
}
/**
* bdrv_merge_dirty_bitmap: merge src into dest.
* Ensures permissions on bitmaps are reasonable; use for public API.

View File

@ -115,6 +115,8 @@ int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, int64_t offset,
bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
int64_t start, int64_t end, int64_t max_dirty_count,
int64_t *dirty_start, int64_t *dirty_count);
bool bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap, int64_t offset,
int64_t bytes, int64_t *count);
BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
Error **errp);

View File

@ -340,6 +340,18 @@ bool hbitmap_next_dirty_area(const HBitmap *hb, int64_t start, int64_t end,
int64_t max_dirty_count,
int64_t *dirty_start, int64_t *dirty_count);
/*
* bdrv_dirty_bitmap_status:
* @hb: The HBitmap to operate on
* @start: The bit to start from
* @count: Number of bits to proceed
* @pnum: Out-parameter. How many bits has same value starting from @start
*
* Returns true if bitmap is dirty at @start, false otherwise.
*/
bool hbitmap_status(const HBitmap *hb, int64_t start, int64_t count,
int64_t *pnum);
/**
* hbitmap_iter_next:
* @hbi: HBitmapIter to operate on.

View File

@ -301,6 +301,39 @@ bool hbitmap_next_dirty_area(const HBitmap *hb, int64_t start, int64_t end,
return true;
}
bool hbitmap_status(const HBitmap *hb, int64_t start, int64_t count,
int64_t *pnum)
{
int64_t next_dirty, next_zero;
assert(start >= 0);
assert(count > 0);
assert(start + count <= hb->orig_size);
next_dirty = hbitmap_next_dirty(hb, start, count);
if (next_dirty == -1) {
*pnum = count;
return false;
}
if (next_dirty > start) {
*pnum = next_dirty - start;
return false;
}
assert(next_dirty == start);
next_zero = hbitmap_next_zero(hb, start, count);
if (next_zero == -1) {
*pnum = count;
return true;
}
assert(next_zero > start);
*pnum = next_zero - start;
return false;
}
bool hbitmap_empty(const HBitmap *hb)
{
return hb->count == 0;