Re: [Qemu-block] [PATCH v6 24/42] block: Use child access functions for QAPI queries

2019-08-10 Thread Vladimir Sementsov-Ogievskiy
09.08.2019 19:13, Max Reitz wrote:
> query-block, query-named-block-nodes, and query-blockstats now return
> any filtered child under "backing", not just bs->backing or COW
> children.  This is so that filters do not interrupt the reported backing
> chain.  This changes the output for iotest 184, as the throttled node
> now appears as a backing child.
> 
> Signed-off-by: Max Reitz 
> ---
>   block/qapi.c   | 39 +++---
>   tests/qemu-iotests/184.out |  7 ++-
>   2 files changed, 30 insertions(+), 16 deletions(-)
> 
> diff --git a/block/qapi.c b/block/qapi.c
> index 9a185cba48..4f59ac1c0f 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c

[..]

> @@ -354,9 +357,9 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo 
> **p_info,
>   BlockDriverState *bs = blk_bs(blk);
>   char *qdev;
>   
> -/* Skip automatically inserted nodes that the user isn't aware of */
> -while (bs && bs->drv && bs->implicit) {
> -bs = backing_bs(bs);
> +if (bs) {
> +/* Skip automatically inserted nodes that the user isn't aware of */
> +bs = bdrv_skip_implicit_filters(bs);
>   }

bdrv_skip_implicit_filters supports NULL, so it may be written without "if"

Anyway:
Reviewed-by: Vladimir Sementsov-Ogievskiy 

[..]

-- 
Best regards,
Vladimir


[Qemu-block] [PATCH v6 24/42] block: Use child access functions for QAPI queries

2019-08-09 Thread Max Reitz
query-block, query-named-block-nodes, and query-blockstats now return
any filtered child under "backing", not just bs->backing or COW
children.  This is so that filters do not interrupt the reported backing
chain.  This changes the output for iotest 184, as the throttled node
now appears as a backing child.

Signed-off-by: Max Reitz 
---
 block/qapi.c   | 39 +++---
 tests/qemu-iotests/184.out |  7 ++-
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/block/qapi.c b/block/qapi.c
index 9a185cba48..4f59ac1c0f 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -156,9 +156,13 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
 return NULL;
 }
 
-if (bs0->drv && bs0->backing) {
+if (bs0->drv && bdrv_filtered_child(bs0)) {
+/*
+ * Put any filtered child here (for backwards compatibility to when
+ * we put bs0->backing here, which might be any filtered child).
+ */
 info->backing_file_depth++;
-bs0 = bs0->backing->bs;
+bs0 = bdrv_filtered_bs(bs0);
 (*p_image_info)->has_backing_image = true;
 p_image_info = &((*p_image_info)->backing_image);
 } else {
@@ -167,9 +171,8 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
 
 /* Skip automatically inserted nodes that the user isn't aware of for
  * query-block (blk != NULL), but not for query-named-block-nodes */
-while (blk && bs0->drv && bs0->implicit) {
-bs0 = backing_bs(bs0);
-assert(bs0);
+if (blk) {
+bs0 = bdrv_skip_implicit_filters(bs0);
 }
 }
 
@@ -354,9 +357,9 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo 
**p_info,
 BlockDriverState *bs = blk_bs(blk);
 char *qdev;
 
-/* Skip automatically inserted nodes that the user isn't aware of */
-while (bs && bs->drv && bs->implicit) {
-bs = backing_bs(bs);
+if (bs) {
+/* Skip automatically inserted nodes that the user isn't aware of */
+bs = bdrv_skip_implicit_filters(bs);
 }
 
 info->device = g_strdup(blk_name(blk));
@@ -513,6 +516,7 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, 
BlockBackend *blk)
 static BlockStats *bdrv_query_bds_stats(BlockDriverState *bs,
 bool blk_level)
 {
+BlockDriverState *storage_bs, *filtered_bs;
 BlockStats *s = NULL;
 
 s = g_malloc0(sizeof(*s));
@@ -525,9 +529,8 @@ static BlockStats *bdrv_query_bds_stats(BlockDriverState 
*bs,
 /* Skip automatically inserted nodes that the user isn't aware of in
  * a BlockBackend-level command. Stay at the exact node for a node-level
  * command. */
-while (blk_level && bs->drv && bs->implicit) {
-bs = backing_bs(bs);
-assert(bs);
+if (blk_level) {
+bs = bdrv_skip_implicit_filters(bs);
 }
 
 if (bdrv_get_node_name(bs)[0]) {
@@ -537,14 +540,20 @@ static BlockStats *bdrv_query_bds_stats(BlockDriverState 
*bs,
 
 s->stats->wr_highest_offset = stat64_get(&bs->wr_highest_offset);
 
-if (bs->file) {
+storage_bs = bdrv_storage_bs(bs);
+if (storage_bs) {
 s->has_parent = true;
-s->parent = bdrv_query_bds_stats(bs->file->bs, blk_level);
+s->parent = bdrv_query_bds_stats(storage_bs, blk_level);
 }
 
-if (blk_level && bs->backing) {
+filtered_bs = bdrv_filtered_bs(bs);
+if (blk_level && filtered_bs) {
+/*
+ * Put any filtered child here (for backwards compatibility to when
+ * we put bs0->backing here, which might be any filtered child).
+ */
 s->has_backing = true;
-s->backing = bdrv_query_bds_stats(bs->backing->bs, blk_level);
+s->backing = bdrv_query_bds_stats(filtered_bs, blk_level);
 }
 
 return s;
diff --git a/tests/qemu-iotests/184.out b/tests/qemu-iotests/184.out
index 3deb3cfb94..1d61f7e224 100644
--- a/tests/qemu-iotests/184.out
+++ b/tests/qemu-iotests/184.out
@@ -27,6 +27,11 @@ Testing:
 "iops_rd": 0,
 "detect_zeroes": "off",
 "image": {
+"backing-image": {
+"virtual-size": 1073741824,
+"filename": "null-co://",
+"format": "null-co"
+},
 "virtual-size": 1073741824,
 "filename": "json:{\"throttle-group\": \"group0\", \"driver\": 
\"throttle\", \"file\": {\"driver\": \"null-co\"}}",
 "format": "throttle"
@@ -34,7 +39,7 @@ Testing:
 "iops_wr": 0,
 "ro": false,
 "node-name": "throttle0",
-"backing_file_depth": 0,
+"backing_file_depth": 1,
 "drv": "throttle",
 "iops": 0,
 "bps_wr": 0,
-- 
2.21.0