diff options
author | Max Reitz | 2019-11-28 09:49:22 +0100 |
---|---|---|
committer | Kevin Wolf | 2020-09-07 12:31:31 +0200 |
commit | 3f26191c7350c28d9c17b5eba253bff367b6cb2e (patch) | |
tree | ba8f1c9c8834e0927ffff85d1db3713966fa84ef | |
parent | blockdev: Use CAF in external_snapshot_prepare() (diff) | |
download | qemu-3f26191c7350c28d9c17b5eba253bff367b6cb2e.tar.gz qemu-3f26191c7350c28d9c17b5eba253bff367b6cb2e.tar.xz qemu-3f26191c7350c28d9c17b5eba253bff367b6cb2e.zip |
block: Report data child for query-blockstats
It makes no sense to report the block stats of a purely metadata-storing
child in query-blockstats. So if the primary child does not have any
data, try to find a unique data-storing child.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block/qapi.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/block/qapi.c b/block/qapi.c index 4807a2b344..c57b42d86d 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -526,6 +526,7 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk) static BlockStats *bdrv_query_bds_stats(BlockDriverState *bs, bool blk_level) { + BdrvChild *parent_child; BlockStats *s = NULL; s = g_malloc0(sizeof(*s)); @@ -555,9 +556,35 @@ static BlockStats *bdrv_query_bds_stats(BlockDriverState *bs, s->has_driver_specific = true; } - if (bs->file) { + parent_child = bdrv_primary_child(bs); + if (!parent_child || + !(parent_child->role & (BDRV_CHILD_DATA | BDRV_CHILD_FILTERED))) + { + BdrvChild *c; + + /* + * Look for a unique data-storing child. We do not need to look for + * filtered children, as there would be only one and it would have been + * the primary child. + */ + parent_child = NULL; + QLIST_FOREACH(c, &bs->children, next) { + if (c->role & BDRV_CHILD_DATA) { + if (parent_child) { + /* + * There are multiple data-storing children and we cannot + * choose between them. + */ + parent_child = NULL; + break; + } + parent_child = c; + } + } + } + if (parent_child) { s->has_parent = true; - s->parent = bdrv_query_bds_stats(bs->file->bs, blk_level); + s->parent = bdrv_query_bds_stats(parent_child->bs, blk_level); } if (blk_level && bs->backing) { |