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:
parent
4875a77950
commit
f71eaa74c0
20
block/qapi.c
20
block/qapi.c
|
@ -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
2
hmp.c
|
@ -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) {
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue