block: Add 'active' field to BlockDeviceInfo

This allows querying from QMP (and also HMP) whether an image is
currently active or inactive (in the sense of BDRV_O_INACTIVE).

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-ID: <20250204211407.381505-2-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2025-02-04 22:13:52 +01:00
parent 107c551de0
commit aec81049c2
8 changed files with 39 additions and 3 deletions

View File

@ -6824,6 +6824,10 @@ void bdrv_init_with_whitelist(void)
bdrv_init(); bdrv_init();
} }
bool bdrv_is_inactive(BlockDriverState *bs) {
return bs->open_flags & BDRV_O_INACTIVE;
}
int bdrv_activate(BlockDriverState *bs, Error **errp) int bdrv_activate(BlockDriverState *bs, Error **errp)
{ {
BdrvChild *child, *parent; BdrvChild *child, *parent;

View File

@ -630,11 +630,12 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
} }
if (inserted) { if (inserted) {
monitor_printf(mon, ": %s (%s%s%s)\n", monitor_printf(mon, ": %s (%s%s%s%s)\n",
inserted->file, inserted->file,
inserted->drv, inserted->drv,
inserted->ro ? ", read-only" : "", inserted->ro ? ", read-only" : "",
inserted->encrypted ? ", encrypted" : ""); inserted->encrypted ? ", encrypted" : "",
inserted->active ? "" : ", inactive");
} else { } else {
monitor_printf(mon, ": [not inserted]\n"); monitor_printf(mon, ": [not inserted]\n");
} }

View File

@ -63,6 +63,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
info->file = g_strdup(bs->filename); info->file = g_strdup(bs->filename);
info->ro = bdrv_is_read_only(bs); info->ro = bdrv_is_read_only(bs);
info->drv = g_strdup(bs->drv->format_name); info->drv = g_strdup(bs->drv->format_name);
info->active = !bdrv_is_inactive(bs);
info->encrypted = bs->encrypted; info->encrypted = bs->encrypted;
info->cache = g_new(BlockdevCacheInfo, 1); info->cache = g_new(BlockdevCacheInfo, 1);

View File

@ -175,6 +175,9 @@ BlockDriverState * GRAPH_RDLOCK
check_to_replace_node(BlockDriverState *parent_bs, const char *node_name, check_to_replace_node(BlockDriverState *parent_bs, const char *node_name,
Error **errp); Error **errp);
bool GRAPH_RDLOCK bdrv_is_inactive(BlockDriverState *bs);
int no_coroutine_fn GRAPH_RDLOCK int no_coroutine_fn GRAPH_RDLOCK
bdrv_activate(BlockDriverState *bs, Error **errp); bdrv_activate(BlockDriverState *bs, Error **errp);

View File

@ -486,6 +486,10 @@
# @backing_file_depth: number of files in the backing file chain # @backing_file_depth: number of files in the backing file chain
# (since: 1.2) # (since: 1.2)
# #
# @active: true if the backend is active; typical cases for inactive backends
# are on the migration source instance after migration completes and on the
# destination before it completes. (since: 10.0)
#
# @encrypted: true if the backing device is encrypted # @encrypted: true if the backing device is encrypted
# #
# @detect_zeroes: detect and optimize zero writes (Since 2.1) # @detect_zeroes: detect and optimize zero writes (Since 2.1)
@ -556,7 +560,7 @@
{ 'struct': 'BlockDeviceInfo', { 'struct': 'BlockDeviceInfo',
'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str', 'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str',
'*backing_file': 'str', 'backing_file_depth': 'int', '*backing_file': 'str', 'backing_file_depth': 'int',
'encrypted': 'bool', 'active': 'bool', 'encrypted': 'bool',
'detect_zeroes': 'BlockdevDetectZeroesOptions', 'detect_zeroes': 'BlockdevDetectZeroesOptions',
'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int', 'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int', 'iops': 'int', 'iops_rd': 'int', 'iops_wr': 'int',

View File

@ -26,6 +26,7 @@ Testing:
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 1073741824, "virtual-size": 1073741824,
@ -59,6 +60,7 @@ Testing:
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 1073741824, "virtual-size": 1073741824,
"filename": "null-co://", "filename": "null-co://",

View File

@ -114,6 +114,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 67108864, "virtual-size": 67108864,
@ -155,6 +156,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT.ovl2", "filename": "TEST_DIR/t.IMGFMT.ovl2",
@ -183,6 +185,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 67108864, "virtual-size": 67108864,
@ -224,6 +227,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT", "filename": "TEST_DIR/t.IMGFMT",
@ -252,6 +256,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 67108864, "virtual-size": 67108864,
@ -293,6 +298,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 393216, "virtual-size": 393216,
"filename": "TEST_DIR/t.IMGFMT.mid", "filename": "TEST_DIR/t.IMGFMT.mid",
@ -321,6 +327,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 67108864, "virtual-size": 67108864,
"filename": "TEST_DIR/t.IMGFMT.base", "filename": "TEST_DIR/t.IMGFMT.base",
@ -350,6 +357,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 393216, "virtual-size": 393216,
"filename": "TEST_DIR/t.IMGFMT.base", "filename": "TEST_DIR/t.IMGFMT.base",
@ -521,6 +529,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 67108864, "virtual-size": 67108864,
@ -562,6 +571,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT.ovl2", "filename": "TEST_DIR/t.IMGFMT.ovl2",
@ -590,6 +600,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"backing-image": { "backing-image": {
@ -642,6 +653,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT.ovl3", "filename": "TEST_DIR/t.IMGFMT.ovl3",
@ -670,6 +682,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 67108864, "virtual-size": 67108864,
"filename": "TEST_DIR/t.IMGFMT.base", "filename": "TEST_DIR/t.IMGFMT.base",
@ -699,6 +712,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 393216, "virtual-size": 393216,
"filename": "TEST_DIR/t.IMGFMT.base", "filename": "TEST_DIR/t.IMGFMT.base",
@ -727,6 +741,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 67108864, "virtual-size": 67108864,
@ -768,6 +783,7 @@ wrote 65536/65536 bytes at offset 1048576
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT", "filename": "TEST_DIR/t.IMGFMT",

View File

@ -23,6 +23,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"backing-image": { "backing-image": {
@ -74,6 +75,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT", "filename": "TEST_DIR/t.IMGFMT",
@ -102,6 +104,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"backing-image": { "backing-image": {
"virtual-size": 197120, "virtual-size": 197120,
@ -142,6 +145,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT.mid", "filename": "TEST_DIR/t.IMGFMT.mid",
@ -170,6 +174,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev
{ {
"iops_rd": 0, "iops_rd": 0,
"detect_zeroes": "off", "detect_zeroes": "off",
"active": true,
"image": { "image": {
"virtual-size": 197120, "virtual-size": 197120,
"filename": "TEST_DIR/t.IMGFMT.base", "filename": "TEST_DIR/t.IMGFMT.base",