diff options
-rw-r--r-- | block.c | 13 | ||||
-rw-r--r-- | include/block/block.h | 1 | ||||
-rw-r--r-- | qapi/block-core.json | 23 |
3 files changed, 34 insertions, 3 deletions
@@ -3116,6 +3116,17 @@ bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap) return !(bitmap->disabled || bitmap->successor); } +DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap) +{ + if (bdrv_dirty_bitmap_frozen(bitmap)) { + return DIRTY_BITMAP_STATUS_FROZEN; + } else if (!bdrv_dirty_bitmap_enabled(bitmap)) { + return DIRTY_BITMAP_STATUS_DISABLED; + } else { + return DIRTY_BITMAP_STATUS_ACTIVE; + } +} + /** * Create a successor bitmap destined to replace this bitmap after an operation. * Requires that the bitmap is not frozen and has no successor. @@ -3256,7 +3267,7 @@ BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs) info->granularity = bdrv_dirty_bitmap_granularity(bm); info->has_name = !!bm->name; info->name = g_strdup(bm->name); - info->frozen = bdrv_dirty_bitmap_frozen(bm); + info->status = bdrv_dirty_bitmap_status(bm); entry->value = info; *plist = entry; plist = &entry->next; diff --git a/include/block/block.h b/include/block/block.h index c1c963eb5c..f7680b6e68 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -476,6 +476,7 @@ uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs); uint32_t bdrv_dirty_bitmap_granularity(BdrvDirtyBitmap *bitmap); bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap); bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap); +DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap); int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector); void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap, int64_t cur_sector, int nr_sectors); diff --git a/qapi/block-core.json b/qapi/block-core.json index 863ffea0c7..8411d4f83a 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -326,6 +326,25 @@ 'data': 'bool', '*offset': 'int' } } ## +# @DirtyBitmapStatus: +# +# An enumeration of possible states that a dirty bitmap can report to the user. +# +# @frozen: The bitmap is currently in-use by a backup operation or block job, +# and is immutable. +# +# @disabled: The bitmap is currently in-use by an internal operation and is +# read-only. It can still be deleted. +# +# @active: The bitmap is actively monitoring for new writes, and can be cleared, +# deleted, or used for backup operations. +# +# Since: 2.4 +## +{ 'enum': 'DirtyBitmapStatus', + 'data': ['active', 'disabled', 'frozen'] } + +## # @BlockDirtyInfo: # # Block dirty bitmap information. @@ -336,13 +355,13 @@ # # @granularity: granularity of the dirty bitmap in bytes (since 1.4) # -# @frozen: whether the dirty bitmap is frozen (Since 2.4) +# @status: current status of the dirty bitmap (since 2.4) # # Since: 1.3 ## { 'struct': 'BlockDirtyInfo', 'data': {'*name': 'str', 'count': 'int', 'granularity': 'uint32', - 'frozen': 'bool'} } + 'status': 'DirtyBitmapStatus'} } ## # @BlockInfo: |