[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree
From: |
Max Reitz |
Subject: |
[Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree |
Date: |
Thu, 24 Mar 2016 20:07:18 +0100 |
This command returns the tree of BlockDriverStates under a given root
node.
Every tree node is described by its node name and the connection of a
parent node to its children additionally contains the role the child
assumes.
A node's name can then be used e.g. in conjunction with
query-named-block-nodes to get more information about the node.
Signed-off-by: Max Reitz <address@hidden>
---
block/qapi.c | 43 +++++++++++++++++++++++++++++++++++++++++++
qapi/block-core.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++
qmp-commands.hx | 38 ++++++++++++++++++++++++++++++++++++++
3 files changed, 127 insertions(+)
diff --git a/block/qapi.c b/block/qapi.c
index 6a4869a..a35d32b 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -493,6 +493,49 @@ BlockInfoList *qmp_query_block(Error **errp)
return head;
}
+static BlockNodeTreeNode *qmp_query_block_node_tree_by_bs(BlockDriverState *bs)
+{
+ BlockNodeTreeNode *bntn;
+ BlockNodeTreeChildList **p_next;
+ BdrvChild *child;
+
+ bntn = g_new0(BlockNodeTreeNode, 1);
+
+ bntn->node_name = g_strdup(bdrv_get_node_name(bs));
+ bntn->has_node_name = bntn->node_name;
+
+ p_next = &bntn->children;
+ QLIST_FOREACH(child, &bs->children, next) {
+ BlockNodeTreeChild *bntc;
+
+ bntc = g_new(BlockNodeTreeChild, 1);
+ *bntc = (BlockNodeTreeChild){
+ .role = g_strdup(child->name),
+ .node = qmp_query_block_node_tree_by_bs(child->bs),
+ };
+
+ *p_next = g_new0(BlockNodeTreeChildList, 1);
+ (*p_next)->value = bntc;
+ p_next = &(*p_next)->next;
+ }
+
+ *p_next = NULL;
+ return bntn;
+}
+
+BlockNodeTreeNode *qmp_query_block_node_tree(const char *root_node,
+ Error **errp)
+{
+ BlockDriverState *bs;
+
+ bs = bdrv_lookup_bs(root_node, root_node, errp);
+ if (!bs) {
+ return NULL;
+ }
+
+ return qmp_query_block_node_tree_by_bs(bs);
+}
+
static bool next_query_bds(BlockBackend **blk, BlockDriverState **bs,
bool query_nodes)
{
diff --git a/qapi/block-core.json b/qapi/block-core.json
index b1cf77d..754ccd6 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -470,6 +470,52 @@
##
+# @BlockNodeTreeNode:
+#
+# Describes a node in the block node graph.
+#
+# @node-name: If present, the node's name.
+#
+# @children: List of the node's children.
+#
+# Since: 2.7
+##
+{ 'struct': 'BlockNodeTreeNode',
+ 'data': { '*node-name': 'str',
+ 'children': ['BlockNodeTreeChild'] } }
+
+##
+# @BlockNodeTreeChild:
+#
+# Describes a child node in the block node graph.
+#
+# @role: Role the child assumes for its parent, e.g. "file" or "backing".
+#
+# @node: The child node's BlockNodeTreeNode structure.
+#
+# Since: 2.7
+##
+{ 'struct': 'BlockNodeTreeChild',
+ 'data': { 'role': 'str',
+ 'node': 'BlockNodeTreeNode' } }
+
+##
+# @query-block-node-tree:
+#
+# Queries the tree of nodes under a given node in the block graph.
+#
+# @root-node: Node name or device name of the tree's root node.
+#
+# Returns: The root node's BlockNodeTreeNode structure.
+#
+# Since: 2.7
+##
+{ 'command': 'query-block-node-tree',
+ 'data': { 'root-node': 'str' },
+ 'returns': 'BlockNodeTreeNode' }
+
+
+##
# @BlockDeviceTimedStats:
#
# Statistics of a block device during a given interval of time.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 9e05365..5c404aa 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -2637,6 +2637,44 @@ EQMP
},
SQMP
+query-block-node-tree
+---------------------
+
+Queries the tree of nodes under a given node in the block graph.
+
+Arguments:
+
+- "root-node": Node name or device name of the tree's root node (json-string)
+
+The block node tree is represented with BlockNodeTreeNode and
BlockNodeTreeChild
+json-objects.
+
+Each BlockNodeTreeNode json-object contains the following:
+
+- "node-name": If present, the node's name (json-string, optional)
+- "children": json-array of the node's children, each entry is a json-object of
+ type BlockNodeTreeChild
+
+Each BlockNodeTreeChild json-object contains the following:
+
+- "role": Role the child node assumes for its parent, e.g. "file" or "backing"
+ (json-string)
+- "node": BlockNodeTreeNode describing the child node (json-object)
+
+The cyclic reference of BlockNodeTreeNode and BlockNodeTreeChild to each other
+thus spawns a tree.
+
+This command returns the root node's BlockNodeTreeNode structure.
+
+EQMP
+
+ {
+ .name = "query-block-node-tree",
+ .args_type = "root-node:B",
+ .mhandler.cmd_new = qmp_marshal_query_block_node_tree,
+ },
+
+SQMP
query-blockstats
----------------
--
2.7.4
- [Qemu-devel] [RFC for-2.7 0/1] block/qapi: Add query-block-node-tree, Max Reitz, 2016/03/24
- [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree,
Max Reitz <=
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Wen Congyang, 2016/03/24
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Wen Congyang, 2016/03/25
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Max Reitz, 2016/03/26
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Eric Blake, 2016/03/28
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Max Reitz, 2016/03/29
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Eric Blake, 2016/03/29
- Re: [Qemu-devel] [RFC for-2.7 1/1] block/qapi: Add query-block-node-tree, Max Reitz, 2016/03/29
Re: [Qemu-devel] [RFC for-2.7 0/1] block/qapi: Add query-block-node-tree, Kevin Wolf, 2016/03/29