On Tue, 11/04 09:54, Max Reitz wrote: > On 2014-10-31 at 04:32, Fam Zheng wrote: > >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 <f...@redhat.com> > >--- > > block/qapi.c | 20 +++++++++++++------- > > hmp.c | 2 +- > > qapi/block-core.json | 11 ++++++++++- > > qmp-commands.hx | 2 +- > > 4 files changed, 25 insertions(+), 10 deletions(-) > > > >diff --git a/block/qapi.c b/block/qapi.c > >index a4d1a20..a0a50b9 100644 > >--- a/block/qapi.c > >+++ b/block/qapi.c > >@@ -322,7 +322,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; > >@@ -352,12 +353,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; > >@@ -388,17 +389,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; > >diff --git a/hmp.c b/hmp.c > >index 63d7686..94b27df 100644 > >--- a/hmp.c > >+++ b/hmp.c > >@@ -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) { > >diff --git a/qapi/block-core.json b/qapi/block-core.json > >index 6b4b96c..db4e8e9 100644 > >--- a/qapi/block-core.json > >+++ b/qapi/block-core.json > >@@ -430,11 +430,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 # > > Is there a reason for the # at the end of the line?
Badd vim "J". Thanks for reviewing! Fam