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:
parent
84b1e80f67
commit
a6426475a7
@ -879,6 +879,12 @@ bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
|
|||||||
dirty_start, dirty_count);
|
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.
|
* bdrv_merge_dirty_bitmap: merge src into dest.
|
||||||
* Ensures permissions on bitmaps are reasonable; use for public API.
|
* Ensures permissions on bitmaps are reasonable; use for public API.
|
||||||
|
@ -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,
|
bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
|
||||||
int64_t start, int64_t end, int64_t max_dirty_count,
|
int64_t start, int64_t end, int64_t max_dirty_count,
|
||||||
int64_t *dirty_start, int64_t *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,
|
BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
|
@ -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 max_dirty_count,
|
||||||
int64_t *dirty_start, int64_t *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:
|
* hbitmap_iter_next:
|
||||||
* @hbi: HBitmapIter to operate on.
|
* @hbi: HBitmapIter to operate on.
|
||||||
|
@ -301,6 +301,39 @@ bool hbitmap_next_dirty_area(const HBitmap *hb, int64_t start, int64_t end,
|
|||||||
return true;
|
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)
|
bool hbitmap_empty(const HBitmap *hb)
|
||||||
{
|
{
|
||||||
return hb->count == 0;
|
return hb->count == 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user