From e6bb31ec6f7ef7c78c897390ecc6c6a34a7f9f5a Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 15 Sep 2014 12:19:14 +0200 Subject: [PATCH] block/hmp: Allow node-name in 'info block' The optional parameter specifying a block device allows now to use a node-name instead of a drive name (and therefore to inspect any node in the graph). The new -n options allows listing all named nodes instead of BlockBackends. Signed-off-by: Kevin Wolf --- hmp.c | 31 ++++++++++++++++++++++++++++++- monitor.c | 6 +++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/hmp.c b/hmp.c index 05ccf5faec..481be8019b 100644 --- a/hmp.c +++ b/hmp.c @@ -403,10 +403,18 @@ static void print_block_info(Monitor *mon, BlockInfo *info, void hmp_info_block(Monitor *mon, const QDict *qdict) { BlockInfoList *block_list, *info; + BlockDeviceInfoList *blockdev_list, *blockdev; const char *device = qdict_get_try_str(qdict, "device"); bool verbose = qdict_get_try_bool(qdict, "verbose", 0); + bool nodes = qdict_get_try_bool(qdict, "nodes", 0); + bool printed = false; - block_list = qmp_query_block(false); + /* Print BlockBackend information */ + if (!nodes) { + block_list = qmp_query_block(false); + } else { + block_list = NULL; + } for (info = block_list; info; info = info->next) { if (device && strcmp(device, info->value->device)) { @@ -420,9 +428,30 @@ void hmp_info_block(Monitor *mon, const QDict *qdict) print_block_info(mon, info->value, info->value->has_inserted ? info->value->inserted : NULL, verbose); + printed = true; } qapi_free_BlockInfoList(block_list); + + if ((!device && !nodes) || printed) { + return; + } + + /* Print node information */ + blockdev_list = qmp_query_named_block_nodes(NULL); + for (blockdev = blockdev_list; blockdev; blockdev = blockdev->next) { + assert(blockdev->value->has_node_name); + if (device && strcmp(device, blockdev->value->node_name)) { + continue; + } + + if (blockdev != blockdev_list) { + monitor_printf(mon, "\n"); + } + + print_block_info(mon, NULL, blockdev->value, verbose); + } + qapi_free_BlockDeviceInfoList(blockdev_list); } void hmp_info_blockstats(Monitor *mon, const QDict *qdict) diff --git a/monitor.c b/monitor.c index f1031a1e34..f63a3aae28 100644 --- a/monitor.c +++ b/monitor.c @@ -2628,10 +2628,10 @@ static mon_cmd_t info_cmds[] = { }, { .name = "block", - .args_type = "verbose:-v,device:B?", - .params = "[-v] [device]", + .args_type = "nodes:-n,verbose:-v,device:B?", + .params = "[-n] [-v] [device]", .help = "show info of one block device or all block devices " - "(and details of images with -v option)", + "(-n: show named nodes; -v: show details)", .mhandler.cmd = hmp_info_block, }, { -- GitLab