In combination with using a throttle filter to enforce IO limits for a guest device, knowing the 'file' child of a block device can be useful. If the throttle filter is only intended for guest IO, block jobs should not also be limited by the throttle filter, so the block operations need to be done with the 'file' child of the top throttle node as the target. In combination with mirroring, the name of that child is not fixed.
Another scenario is when unplugging a guest device after mirroring below a top throttle node, where the mirror target is added explicitly via blockdev-add. After mirroring, the target becomes the new 'file' child of the throttle node. For unplugging, both the top throttle node and the mirror target need to be deleted, because only implicitly added child nodes are deleted automatically, and the current 'file' child of the throttle node was explicitly added (as the mirror target). Signed-off-by: Fiona Ebner <f.eb...@proxmox.com> --- block/qapi.c | 4 ++++ qapi/block-core.json | 4 ++++ tests/qemu-iotests/184.out | 1 + tests/qemu-iotests/191.out | 8 ++++++++ tests/qemu-iotests/273.out | 2 ++ 5 files changed, 19 insertions(+) diff --git a/block/qapi.c b/block/qapi.c index 2c50a6bf3b..bbca042baf 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -77,6 +77,10 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk, info->node_name = g_strdup(bs->node_name); } + if (bs->file && bs->file->bs && bs->file->bs->node_name[0]) { + info->file_child_node_name = g_strdup(bs->file->bs->node_name); + } + backing = bdrv_cow_bs(bs); if (backing) { info->backing_file = g_strdup(backing->filename); diff --git a/qapi/block-core.json b/qapi/block-core.json index 1df6644f0d..74d049606b 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -481,6 +481,9 @@ # 2.5: 'host_floppy' dropped 2.6: 'luks' added 2.8: 'replication' # added, 'tftp' dropped 2.9: 'archipelago' dropped # +# @file-child-node-name: the name of the 'file' child block driver node. +# (since: 10.1) +# # @backing_file: the name of the backing file (for copy-on-write) # # @backing_file_depth: number of files in the backing file chain @@ -559,6 +562,7 @@ ## { 'struct': 'BlockDeviceInfo', 'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str', + '*file-child-node-name': 'str', '*backing_file': 'str', 'backing_file_depth': 'int', 'active': 'bool', 'encrypted': 'bool', 'detect_zeroes': 'BlockdevDetectZeroesOptions', diff --git a/tests/qemu-iotests/184.out b/tests/qemu-iotests/184.out index 52692b6b3b..aa02df950b 100644 --- a/tests/qemu-iotests/184.out +++ b/tests/qemu-iotests/184.out @@ -47,6 +47,7 @@ Testing: "iops": 0, "bps_wr": 0, "write_threshold": 0, + "file-child-node-name": "disk0", "encrypted": false, "bps": 0, "bps_rd": 0, diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out index 2a72ca7106..f29e1b5209 100644 --- a/tests/qemu-iotests/191.out +++ b/tests/qemu-iotests/191.out @@ -143,6 +143,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -214,6 +215,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -285,6 +287,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -344,6 +347,7 @@ wrote 65536/65536 bytes at offset 1048576 "iops": 0, "bps_wr": 0, "write_threshold": 0, + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -558,6 +562,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -640,6 +645,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.ovl2", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -699,6 +705,7 @@ wrote 65536/65536 bytes at offset 1048576 "iops": 0, "bps_wr": 0, "write_threshold": 0, + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -770,6 +777,7 @@ wrote 65536/65536 bytes at offset 1048576 "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "NODE_NAME", "encrypted": false, "bps": 0, "bps_rd": 0, diff --git a/tests/qemu-iotests/273.out b/tests/qemu-iotests/273.out index c19753c685..eabe95c1a0 100644 --- a/tests/qemu-iotests/273.out +++ b/tests/qemu-iotests/273.out @@ -62,6 +62,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.mid", + "file-child-node-name": "topf", "encrypted": false, "bps": 0, "bps_rd": 0, @@ -132,6 +133,7 @@ Testing: -blockdev file,node-name=base,filename=TEST_DIR/t.IMGFMT.base -blockdev "bps_wr": 0, "write_threshold": 0, "backing_file": "TEST_DIR/t.IMGFMT.base", + "file-child-node-name": "midf", "encrypted": false, "bps": 0, "bps_rd": 0, -- 2.47.2