qapi: Allow getting flat output from 'query-named-block-nodes'

When a management application manages node names there's no reason to
recurse into backing images in the output of query-named-block-nodes.

Add a parameter to the command which will return just the top level
structs.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Message-Id: <4470f8c779abc404dcf65e375db195cd91a80651.1579509782.git.pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[mreitz: Fixed coding style]
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Peter Krempa 2020-01-20 09:50:49 +01:00 committed by Max Reitz
parent b0c4cf21b0
commit facda5443f
7 changed files with 29 additions and 10 deletions

View file

@ -4807,14 +4807,15 @@ BlockDriverState *bdrv_find_node(const char *node_name)
} }
/* Put this QMP function here so it can access the static graph_bdrv_states. */ /* Put this QMP function here so it can access the static graph_bdrv_states. */
BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp) BlockDeviceInfoList *bdrv_named_nodes_list(bool flat,
Error **errp)
{ {
BlockDeviceInfoList *list, *entry; BlockDeviceInfoList *list, *entry;
BlockDriverState *bs; BlockDriverState *bs;
list = NULL; list = NULL;
QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) { QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
BlockDeviceInfo *info = bdrv_block_device_info(NULL, bs, errp); BlockDeviceInfo *info = bdrv_block_device_info(NULL, bs, flat, errp);
if (!info) { if (!info) {
qapi_free_BlockDeviceInfoList(list); qapi_free_BlockDeviceInfoList(list);
return NULL; return NULL;

View file

@ -42,7 +42,9 @@
#include "qemu/cutils.h" #include "qemu/cutils.h"
BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk, BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
BlockDriverState *bs, Error **errp) BlockDriverState *bs,
bool flat,
Error **errp)
{ {
ImageInfo **p_image_info; ImageInfo **p_image_info;
BlockDriverState *bs0; BlockDriverState *bs0;
@ -156,6 +158,11 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
return NULL; return NULL;
} }
/* stop gathering data for flat output */
if (flat) {
break;
}
if (bs0->drv && bs0->backing) { if (bs0->drv && bs0->backing) {
info->backing_file_depth++; info->backing_file_depth++;
bs0 = bs0->backing->bs; bs0 = bs0->backing->bs;
@ -389,7 +396,7 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info,
if (bs && bs->drv) { if (bs && bs->drv) {
info->has_inserted = true; info->has_inserted = true;
info->inserted = bdrv_block_device_info(blk, bs, errp); info->inserted = bdrv_block_device_info(blk, bs, false, errp);
if (info->inserted == NULL) { if (info->inserted == NULL) {
goto err; goto err;
} }

View file

@ -3734,9 +3734,13 @@ void qmp_drive_backup(DriveBackup *backup, Error **errp)
blockdev_do_action(&action, errp); blockdev_do_action(&action, errp);
} }
BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp) BlockDeviceInfoList *qmp_query_named_block_nodes(bool has_flat,
bool flat,
Error **errp)
{ {
return bdrv_named_nodes_list(errp); bool return_flat = has_flat && flat;
return bdrv_named_nodes_list(return_flat, errp);
} }
XDbgBlockGraph *qmp_x_debug_query_block_graph(Error **errp) XDbgBlockGraph *qmp_x_debug_query_block_graph(Error **errp)

View file

@ -454,7 +454,7 @@ void bdrv_lock_medium(BlockDriverState *bs, bool locked);
void bdrv_eject(BlockDriverState *bs, bool eject_flag); void bdrv_eject(BlockDriverState *bs, bool eject_flag);
const char *bdrv_get_format_name(BlockDriverState *bs); const char *bdrv_get_format_name(BlockDriverState *bs);
BlockDriverState *bdrv_find_node(const char *node_name); BlockDriverState *bdrv_find_node(const char *node_name);
BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp); BlockDeviceInfoList *bdrv_named_nodes_list(bool flat, Error **errp);
XDbgBlockGraph *bdrv_get_xdbg_block_graph(Error **errp); XDbgBlockGraph *bdrv_get_xdbg_block_graph(Error **errp);
BlockDriverState *bdrv_lookup_bs(const char *device, BlockDriverState *bdrv_lookup_bs(const char *device,
const char *node_name, const char *node_name,

View file

@ -29,7 +29,9 @@
#include "block/snapshot.h" #include "block/snapshot.h"
BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk, BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
BlockDriverState *bs, Error **errp); BlockDriverState *bs,
bool flat,
Error **errp);
int bdrv_query_snapshot_info_list(BlockDriverState *bs, int bdrv_query_snapshot_info_list(BlockDriverState *bs,
SnapshotInfoList **p_list, SnapshotInfoList **p_list,
Error **errp); Error **errp);

View file

@ -620,7 +620,7 @@ void hmp_info_block(Monitor *mon, const QDict *qdict)
} }
/* Print node information */ /* Print node information */
blockdev_list = qmp_query_named_block_nodes(NULL); blockdev_list = qmp_query_named_block_nodes(false, false, NULL);
for (blockdev = blockdev_list; blockdev; blockdev = blockdev->next) { for (blockdev = blockdev_list; blockdev; blockdev = blockdev->next) {
assert(blockdev->value->has_node_name); assert(blockdev->value->has_node_name);
if (device && strcmp(device, blockdev->value->node_name)) { if (device && strcmp(device, blockdev->value->node_name)) {

View file

@ -1758,6 +1758,9 @@
# #
# Get the named block driver list # Get the named block driver list
# #
# @flat: Omit the nested data about backing image ("backing-image" key) if true.
# Default is false (Since 5.0)
#
# Returns: the list of BlockDeviceInfo # Returns: the list of BlockDeviceInfo
# #
# Since: 2.0 # Since: 2.0
@ -1811,7 +1814,9 @@
# } } ] } # } } ] }
# #
## ##
{ 'command': 'query-named-block-nodes', 'returns': [ 'BlockDeviceInfo' ] } { 'command': 'query-named-block-nodes',
'returns': [ 'BlockDeviceInfo' ],
'data': { '*flat': 'bool' } }
## ##
# @XDbgBlockGraphNodeType: # @XDbgBlockGraphNodeType: