Commit f71eaa74 authored by Fam Zheng's avatar Fam Zheng Committed by Kevin Wolf
Browse files

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: default avatarFam Zheng <famz@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 4875a779
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -300,7 +300,8 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_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;

@@ -330,12 +331,12 @@ static BlockStats *bdrv_query_stats(const BlockDriverState *bs)

    if (bs->file) {
        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->backing = bdrv_query_stats(bs->backing_hd);
        s->backing = bdrv_query_stats(bs->backing_hd, query_backing);
    }

    return s;
@@ -366,17 +367,22 @@ BlockInfoList *qmp_query_block(Error **errp)
    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;
    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));
        AioContext *ctx = bdrv_get_aio_context(bs);

        aio_context_acquire(ctx);
        info->value = bdrv_query_stats(bs);
        info->value = bdrv_query_stats(bs, !query_nodes);
        aio_context_release(ctx);

        *p_next = info;
+1 −1
Original line number Diff line number Diff line
@@ -403,7 +403,7 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
{
    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) {
        if (!stats->value->has_device) {
+10 −1
Original line number Diff line number Diff line
@@ -427,11 +427,20 @@
#
# 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.
#
# Since: 0.14.0
##
{ 'command': 'query-blockstats', 'returns': ['BlockStats'] }
{ 'command': 'query-blockstats',
  'data': { '*query-nodes': 'bool' },
  'returns': ['BlockStats'] }

##
# @BlockdevOnError:
+1 −1
Original line number Diff line number Diff line
@@ -2347,7 +2347,7 @@ EQMP

    {
        .name       = "query-blockstats",
        .args_type  = "",
        .args_type  = "query-nodes:b?",
        .mhandler.cmd_new = qmp_marshal_input_query_blockstats,
    },