qmp: Add optional switch "query-nodes" in query-blockstats

This bool option will allow query all the node names. It iterates all
the BDSes that are assigned a name, also in this case don't query up the
backing chain.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Fam Zheng 2014-10-31 11:32:57 +08:00 committed by Kevin Wolf
parent 4875a77950
commit f71eaa74c0
4 changed files with 25 additions and 10 deletions

View File

@ -300,7 +300,8 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info,
qapi_free_BlockInfo(info); qapi_free_BlockInfo(info);
} }
static BlockStats *bdrv_query_stats(const BlockDriverState *bs) static BlockStats *bdrv_query_stats(const BlockDriverState *bs,
bool query_backing)
{ {
BlockStats *s; BlockStats *s;
@ -330,12 +331,12 @@ static BlockStats *bdrv_query_stats(const BlockDriverState *bs)
if (bs->file) { if (bs->file) {
s->has_parent = true; s->has_parent = true;
s->parent = bdrv_query_stats(bs->file); s->parent = bdrv_query_stats(bs->file, query_backing);
} }
if (bs->backing_hd) { if (query_backing && bs->backing_hd) {
s->has_backing = true; s->has_backing = true;
s->backing = bdrv_query_stats(bs->backing_hd); s->backing = bdrv_query_stats(bs->backing_hd, query_backing);
} }
return s; return s;
@ -366,17 +367,22 @@ BlockInfoList *qmp_query_block(Error **errp)
return NULL; return NULL;
} }
BlockStatsList *qmp_query_blockstats(Error **errp) BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
bool query_nodes,
Error **errp)
{ {
BlockStatsList *head = NULL, **p_next = &head; BlockStatsList *head = NULL, **p_next = &head;
BlockDriverState *bs = NULL; BlockDriverState *bs = NULL;
while ((bs = bdrv_next(bs))) { /* Just to be safe if query_nodes is not always initialized */
query_nodes = has_query_nodes && query_nodes;
while ((bs = query_nodes ? bdrv_next_node(bs) : bdrv_next(bs))) {
BlockStatsList *info = g_malloc0(sizeof(*info)); BlockStatsList *info = g_malloc0(sizeof(*info));
AioContext *ctx = bdrv_get_aio_context(bs); AioContext *ctx = bdrv_get_aio_context(bs);
aio_context_acquire(ctx); aio_context_acquire(ctx);
info->value = bdrv_query_stats(bs); info->value = bdrv_query_stats(bs, !query_nodes);
aio_context_release(ctx); aio_context_release(ctx);
*p_next = info; *p_next = info;

2
hmp.c
View File

@ -403,7 +403,7 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
{ {
BlockStatsList *stats_list, *stats; BlockStatsList *stats_list, *stats;
stats_list = qmp_query_blockstats(NULL); stats_list = qmp_query_blockstats(false, false, NULL);
for (stats = stats_list; stats; stats = stats->next) { for (stats = stats_list; stats; stats = stats->next) {
if (!stats->value->has_device) { if (!stats->value->has_device) {

View File

@ -427,11 +427,20 @@
# #
# Query the @BlockStats for all virtual block devices. # Query the @BlockStats for all virtual block devices.
# #
# @query-nodes: #optional If true, the command will query all the block nodes
# that have a node name, in a list which will include "parent"
# information, but not "backing".
# If false or omitted, the behavior is as before - query all the
# device backends, recursively including their "parent" and
# "backing". (Since 2.3)
#
# Returns: A list of @BlockStats for each virtual block devices. # Returns: A list of @BlockStats for each virtual block devices.
# #
# Since: 0.14.0 # Since: 0.14.0
## ##
{ 'command': 'query-blockstats', 'returns': ['BlockStats'] } { 'command': 'query-blockstats',
'data': { '*query-nodes': 'bool' },
'returns': ['BlockStats'] }
## ##
# @BlockdevOnError: # @BlockdevOnError:

View File

@ -2347,7 +2347,7 @@ EQMP
{ {
.name = "query-blockstats", .name = "query-blockstats",
.args_type = "", .args_type = "query-nodes:b?",
.mhandler.cmd_new = qmp_marshal_input_query_blockstats, .mhandler.cmd_new = qmp_marshal_input_query_blockstats,
}, },