diff options
-rw-r--r-- | block.c | 20 | ||||
-rw-r--r-- | block/qapi.c | 5 | ||||
-rw-r--r-- | include/block/block.h | 1 | ||||
-rw-r--r-- | qapi-schema.json | 6 |
4 files changed, 29 insertions, 3 deletions
@@ -4522,6 +4522,26 @@ void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap) } } +BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs) +{ + BdrvDirtyBitmap *bm; + BlockDirtyInfoList *list = NULL; + BlockDirtyInfoList **plist = &list; + + QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) { + BlockDirtyInfo *info = g_malloc0(sizeof(BlockDirtyInfo)); + BlockDirtyInfoList *entry = g_malloc0(sizeof(BlockDirtyInfoList)); + info->count = bdrv_get_dirty_count(bs, bm); + info->granularity = + ((int64_t) BDRV_SECTOR_SIZE << hbitmap_granularity(bm->bitmap)); + entry->value = info; + *plist = entry; + plist = &entry->next; + } + + return list; +} + int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector) { if (bitmap) { diff --git a/block/qapi.c b/block/qapi.c index 6b0cdcfa95..a32cb79db8 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -204,6 +204,11 @@ void bdrv_query_info(BlockDriverState *bs, info->io_status = bs->iostatus; } + if (!QLIST_EMPTY(&bs->dirty_bitmaps)) { + info->has_dirty_bitmaps = true; + info->dirty_bitmaps = bdrv_query_dirty_bitmaps(bs); + } + if (bs->drv) { info->has_inserted = true; info->inserted = g_malloc0(sizeof(*info->inserted)); diff --git a/include/block/block.h b/include/block/block.h index 33ae9a9b5a..b6bdae8dcc 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -422,6 +422,7 @@ struct HBitmapIter; typedef struct BdrvDirtyBitmap BdrvDirtyBitmap; BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity); void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); +BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs); int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector); void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); diff --git a/qapi-schema.json b/qapi-schema.json index 83fa4852ce..8630eb50ea 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -948,8 +948,8 @@ # @tray_open: #optional True if the device has a tray and it is open # (only present if removable is true) # -# @dirty: #optional dirty bitmap information (only present if the dirty -# bitmap is enabled) +# @dirty-bitmaps: #optional dirty bitmaps information (only present if the +# driver has one or more dirty bitmaps) (Since 1.8) # # @io-status: #optional @BlockDeviceIoStatus. Only present if the device # supports it and the VM is configured to stop on errors @@ -963,7 +963,7 @@ 'data': {'device': 'str', 'type': 'str', 'removable': 'bool', 'locked': 'bool', '*inserted': 'BlockDeviceInfo', '*tray_open': 'bool', '*io-status': 'BlockDeviceIoStatus', - '*dirty': 'BlockDirtyInfo' } } + '*dirty-bitmaps': ['BlockDirtyInfo'] } } ## # @query-block: |