[pve-devel] [PATCH qemu 3/3] blockdev: query file child QMP command

Fiona Ebner f.ebner at proxmox.com
Thu Jun 26 18:04:39 CEST 2025


There currently does not seem to be a good way to obtain information
about the file child of a node, so add a custom command. The
query-block and query-named-block-nodes commands lack the necessary
info and while x-debug-query-block-graph exists, that is explicitly
only for debugging and experimental.

This is requried for e.g. blockdev-mirror in PVE to determine the
node below the top throttle node.

Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

Alternatively, we could think about adding the node name of the file
child to the info returned by query-named-block-nodes. I can give that
a shot and also ask upstream which approach is prefered.

 blockdev.c           | 22 ++++++++++++++++++++++
 qapi/block-core.json | 13 +++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/blockdev.c b/blockdev.c
index 17de5d2ae4..3be209767a 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -57,6 +57,7 @@
 #include "system/system.h"
 #include "system/iothread.h"
 #include "block/block_int.h"
+#include "block/qapi.h"
 #include "block/trace.h"
 #include "system/runstate.h"
 #include "system/replay.h"
@@ -2782,6 +2783,27 @@ XDbgBlockGraph *qmp_x_debug_query_block_graph(Error **errp)
     return bdrv_get_xdbg_block_graph(errp);
 }
 
+BlockDeviceInfo *qmp_block_node_query_file_child(const char *node_name,
+                                                 Error **errp)
+{
+    GRAPH_RDLOCK_GUARD_MAINLOOP();
+
+    BlockDriverState *bs;
+
+    bs = bdrv_find_node(node_name);
+    if (!bs) {
+        error_setg(errp, "Failed to find node with node-name='%s'", node_name);
+        return NULL;
+    }
+
+    if (!bs->file || !bs->file->bs) {
+        error_setg(errp, "Node '%s' has no 'file' child", node_name);
+        return NULL;
+    }
+
+    return bdrv_block_device_info(NULL, bs->file->bs, false, errp);
+}
+
 void qmp_blockdev_backup(BlockdevBackup *backup, Error **errp)
 {
     TransactionAction action = {
diff --git a/qapi/block-core.json b/qapi/block-core.json
index f8ed564cf0..6c683b00ec 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2463,6 +2463,19 @@
   'features': [ 'unstable' ],
   'allow-preconfig': true }
 
+##
+# @block-node-query-file-child:
+#
+# Get information about a child of the specified block node.
+#
+# @node-name: the block node name of the node to query.
+#
+# Returns: the BlockDeviceInfo of the file child.
+##
+{ 'command': 'block-node-query-file-child',
+  'data': { 'node-name': 'str' },
+  'returns': 'BlockDeviceInfo' }
+
 ##
 # @drive-mirror:
 #
-- 
2.47.2





More information about the pve-devel mailing list