block: More operations for meta dirty bitmap
Callers can create an iterator of meta bitmap with bdrv_dirty_meta_iter_new(), then use the bdrv_dirty_iter_* operations on it. Meta iterators are also counted by bitmap->active_iterators. Also add a couple of functions to retrieve granularity and count. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 1476395910-8697-11-git-send-email-jsnow@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
2071f26e2d
commit
6d3f4049ba
@ -393,6 +393,11 @@ uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap)
|
|||||||
return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
|
return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t bdrv_dirty_bitmap_meta_granularity(BdrvDirtyBitmap *bitmap)
|
||||||
|
{
|
||||||
|
return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->meta);
|
||||||
|
}
|
||||||
|
|
||||||
BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
|
BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
|
||||||
uint64_t first_sector)
|
uint64_t first_sector)
|
||||||
{
|
{
|
||||||
@ -403,6 +408,15 @@ BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
|
|||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap)
|
||||||
|
{
|
||||||
|
BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
|
||||||
|
hbitmap_iter_init(&iter->hbi, bitmap->meta, 0);
|
||||||
|
iter->bitmap = bitmap;
|
||||||
|
bitmap->active_iterators++;
|
||||||
|
return iter;
|
||||||
|
}
|
||||||
|
|
||||||
void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
|
void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
|
||||||
{
|
{
|
||||||
if (!iter) {
|
if (!iter) {
|
||||||
@ -514,3 +528,8 @@ int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
|
|||||||
{
|
{
|
||||||
return hbitmap_count(bitmap->bitmap);
|
return hbitmap_count(bitmap->bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t bdrv_get_meta_dirty_count(BdrvDirtyBitmap *bitmap)
|
||||||
|
{
|
||||||
|
return hbitmap_count(bitmap->meta);
|
||||||
|
}
|
||||||
|
@ -30,6 +30,7 @@ void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap);
|
|||||||
BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs);
|
BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs);
|
||||||
uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
|
uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
|
||||||
uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap);
|
uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap);
|
||||||
|
uint32_t bdrv_dirty_bitmap_meta_granularity(BdrvDirtyBitmap *bitmap);
|
||||||
bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
|
bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
|
||||||
bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
|
bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
|
||||||
const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
|
const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
|
||||||
@ -47,12 +48,14 @@ int bdrv_dirty_bitmap_get_meta(BlockDriverState *bs,
|
|||||||
void bdrv_dirty_bitmap_reset_meta(BlockDriverState *bs,
|
void bdrv_dirty_bitmap_reset_meta(BlockDriverState *bs,
|
||||||
BdrvDirtyBitmap *bitmap, int64_t sector,
|
BdrvDirtyBitmap *bitmap, int64_t sector,
|
||||||
int nb_sectors);
|
int nb_sectors);
|
||||||
|
BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap);
|
||||||
BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
|
BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
|
||||||
uint64_t first_sector);
|
uint64_t first_sector);
|
||||||
void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter);
|
void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter);
|
||||||
int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter);
|
int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter);
|
||||||
void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *hbi, int64_t sector_num);
|
void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *hbi, int64_t sector_num);
|
||||||
int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap);
|
int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap);
|
||||||
|
int64_t bdrv_get_meta_dirty_count(BdrvDirtyBitmap *bitmap);
|
||||||
void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
|
void bdrv_dirty_bitmap_truncate(BlockDriverState *bs);
|
||||||
|
|
||||||
uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
|
uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
|
||||||
|
Loading…
Reference in New Issue
Block a user