From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 32/38] block/qapi: Let bdrv_query_image_info() recurse
Date: Fri, 20 Jan 2023 13:26:27 +0100 [thread overview]
Message-ID: <20230120122633.84983-33-kwolf@redhat.com> (raw)
In-Reply-To: <20230120122633.84983-1-kwolf@redhat.com>
From: Hanna Reitz <hreitz@redhat.com>
There is no real reason why bdrv_query_image_info() should generally not
recurse. The ImageInfo struct has a pointer to the backing image, so it
should generally be filled, unless the caller explicitly opts out.
This moves the recursing code from bdrv_block_device_info() into
bdrv_query_image_info().
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220620162704.80987-7-hreitz@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
include/block/qapi.h | 2 +
block/qapi.c | 92 +++++++++++++++++++++++++++-----------------
2 files changed, 58 insertions(+), 36 deletions(-)
diff --git a/include/block/qapi.h b/include/block/qapi.h
index 22198dcd0c..2174bf8fa2 100644
--- a/include/block/qapi.h
+++ b/include/block/qapi.h
@@ -40,6 +40,8 @@ void bdrv_query_block_node_info(BlockDriverState *bs,
Error **errp);
void bdrv_query_image_info(BlockDriverState *bs,
ImageInfo **p_info,
+ bool flat,
+ bool skip_implicit_filters,
Error **errp);
void bdrv_snapshot_dump(QEMUSnapshotInfo *sn);
diff --git a/block/qapi.c b/block/qapi.c
index 21ef684a1c..fa8bbc3fc7 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -47,8 +47,10 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
Error **errp)
{
ImageInfo **p_image_info;
+ ImageInfo *backing_info;
BlockDriverState *bs0, *backing;
BlockDeviceInfo *info;
+ ERRP_GUARD();
if (!bs->drv) {
error_setg(errp, "Block device %s is ejected", bs->node_name);
@@ -146,37 +148,21 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
bs0 = bs;
p_image_info = &info->image;
info->backing_file_depth = 0;
- while (1) {
- Error *local_err = NULL;
- bdrv_query_image_info(bs0, p_image_info, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
- qapi_free_BlockDeviceInfo(info);
- return NULL;
- }
-
- /* stop gathering data for flat output */
- if (flat) {
- break;
- }
- if (bs0->drv && bdrv_filter_or_cow_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 = bdrv_filter_or_cow_bs(bs0);
- p_image_info = &((*p_image_info)->backing_image);
- } else {
- break;
- }
+ /*
+ * Skip automatically inserted nodes that the user isn't aware of for
+ * query-block (blk != NULL), but not for query-named-block-nodes
+ */
+ bdrv_query_image_info(bs0, p_image_info, flat, blk != NULL, errp);
+ if (*errp) {
+ qapi_free_BlockDeviceInfo(info);
+ return NULL;
+ }
- /* Skip automatically inserted nodes that the user isn't aware of for
- * query-block (blk != NULL), but not for query-named-block-nodes */
- if (blk) {
- bs0 = bdrv_skip_implicit_filters(bs0);
- }
+ backing_info = info->image->backing_image;
+ while (backing_info) {
+ info->backing_file_depth++;
+ backing_info = backing_info->backing_image;
}
return info;
@@ -354,19 +340,28 @@ void bdrv_query_block_node_info(BlockDriverState *bs,
* bdrv_query_image_info:
* @bs: block node to examine
* @p_info: location to store image information
+ * @flat: skip backing node information
+ * @skip_implicit_filters: skip implicit filters in the backing chain
* @errp: location to store error information
*
- * Store "flat" image information in @p_info.
+ * Store image information in @p_info, potentially recursively covering the
+ * backing chain.
*
- * "Flat" means it does *not* query backing image information,
- * i.e. (*pinfo)->has_backing_image will be set to false and
- * (*pinfo)->backing_image to NULL even when the image does in fact have
- * a backing image.
+ * If @flat is true, do not query backing image information, i.e.
+ * (*p_info)->has_backing_image will be set to false and
+ * (*p_info)->backing_image to NULL even when the image does in fact have a
+ * backing image.
+ *
+ * If @skip_implicit_filters is true, implicit filter nodes in the backing chain
+ * will be skipped when querying backing image information.
+ * (@skip_implicit_filters is ignored when @flat is true.)
*
* @p_info will be set only on success. On error, store error in @errp.
*/
void bdrv_query_image_info(BlockDriverState *bs,
ImageInfo **p_info,
+ bool flat,
+ bool skip_implicit_filters,
Error **errp)
{
ImageInfo *info;
@@ -375,11 +370,36 @@ void bdrv_query_image_info(BlockDriverState *bs,
info = g_new0(ImageInfo, 1);
bdrv_do_query_node_info(bs, qapi_ImageInfo_base(info), errp);
if (*errp) {
- qapi_free_ImageInfo(info);
- return;
+ goto fail;
+ }
+
+ if (!flat) {
+ BlockDriverState *backing;
+
+ /*
+ * Use any filtered child here (for backwards compatibility to when
+ * we always took bs->backing, which might be any filtered child).
+ */
+ backing = bdrv_filter_or_cow_bs(bs);
+ if (skip_implicit_filters) {
+ backing = bdrv_skip_implicit_filters(backing);
+ }
+
+ if (backing) {
+ bdrv_query_image_info(backing, &info->backing_image, false,
+ skip_implicit_filters, errp);
+ if (*errp) {
+ goto fail;
+ }
+ }
}
*p_info = info;
+ return;
+
+fail:
+ assert(*errp);
+ qapi_free_ImageInfo(info);
}
/* @p_info will be set only on success. */
--
2.38.1
next prev parent reply other threads:[~2023-01-20 12:32 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-20 12:25 [PULL 00/38] Block layer patches Kevin Wolf
2023-01-20 12:25 ` [PULL 01/38] tests/qemu-iotests/312: Mark "quorum" as required driver Kevin Wolf
2023-01-20 12:25 ` [PULL 02/38] tests/qemu-iotests/262: Check for availability of "blkverify" first Kevin Wolf
2023-01-20 12:25 ` [PULL 03/38] pflash: Only read non-zero parts of backend image Kevin Wolf
2023-02-06 15:54 ` Cédric Le Goater
2023-02-07 8:38 ` Kevin Wolf
2023-02-07 9:19 ` Cédric Le Goater
2023-02-07 12:48 ` Kevin Wolf
2023-02-08 11:19 ` Cédric Le Goater
2023-03-03 22:51 ` Maciej S. Szmigiero
2023-03-07 14:00 ` Kevin Wolf
2023-03-07 14:15 ` Cédric Le Goater
2023-01-20 12:25 ` [PULL 04/38] coroutine: annotate coroutine_fn for libclang Kevin Wolf
2023-01-20 12:26 ` [PULL 05/38] block: Add no_coroutine_fn and coroutine_mixed_fn marker Kevin Wolf
2023-01-20 12:26 ` [PULL 06/38] qemu-io: do not reinvent the blk_pwrite_zeroes wheel Kevin Wolf
2023-01-20 12:26 ` [PULL 07/38] block: remove bdrv_coroutine_enter Kevin Wolf
2023-01-20 12:26 ` [PULL 08/38] qcow2: Fix theoretical corruption in store_bitmap() error path Kevin Wolf
2023-01-20 12:26 ` [PULL 09/38] qemu-img commit: Report errors while closing the image Kevin Wolf
2023-01-20 12:26 ` [PULL 10/38] qemu-img bitmap: " Kevin Wolf
2023-01-20 12:26 ` [PULL 11/38] qemu-iotests: Test qemu-img bitmap/commit exit code on error Kevin Wolf
2023-01-20 12:26 ` [PULL 12/38] block-coroutine-wrapper: support void functions Kevin Wolf
2023-01-20 12:26 ` [PULL 13/38] block: Convert bdrv_io_plug() to co_wrapper Kevin Wolf
2023-01-20 12:26 ` [PULL 14/38] block: Convert bdrv_io_unplug() " Kevin Wolf
2023-01-20 12:26 ` [PULL 15/38] block: Convert bdrv_is_inserted() " Kevin Wolf
2023-01-20 12:26 ` [PULL 16/38] block: Rename refresh_total_sectors to bdrv_refresh_total_sectors Kevin Wolf
2023-01-20 12:26 ` [PULL 17/38] block: Convert bdrv_refresh_total_sectors() to co_wrapper_mixed Kevin Wolf
2023-01-20 12:26 ` [PULL 18/38] block-backend: use bdrv_getlength instead of blk_getlength Kevin Wolf
2023-01-20 12:26 ` [PULL 19/38] block: use bdrv_co_refresh_total_sectors when possible Kevin Wolf
2023-01-20 12:26 ` [PULL 20/38] block: Convert bdrv_get_allocated_file_size() to co_wrapper Kevin Wolf
2023-01-20 12:26 ` [PULL 21/38] block: Convert bdrv_get_info() to co_wrapper_mixed Kevin Wolf
2023-01-20 12:26 ` [PULL 22/38] block: Convert bdrv_eject() to co_wrapper Kevin Wolf
2023-01-20 12:26 ` [PULL 23/38] block: Convert bdrv_lock_medium() " Kevin Wolf
2023-01-20 12:26 ` [PULL 24/38] block: Convert bdrv_debug_event() to co_wrapper_mixed Kevin Wolf
2023-01-20 12:26 ` [PULL 25/38] block: Rename bdrv_load/save_vmstate() to bdrv_co_load/save_vmstate() Kevin Wolf
2023-01-20 12:26 ` [PULL 26/38] block/nbd: Add missing <qemu/bswap.h> include Kevin Wolf
2023-01-20 12:26 ` [PULL 27/38] block: Improve empty format-specific info dump Kevin Wolf
2023-01-20 12:26 ` [PULL 28/38] block/file: Add file-specific image info Kevin Wolf
2023-01-20 12:26 ` [PULL 29/38] block/vmdk: Change extent info type Kevin Wolf
2023-01-20 12:26 ` [PULL 30/38] block: Split BlockNodeInfo off of ImageInfo Kevin Wolf
2023-01-20 12:26 ` [PULL 31/38] qemu-img: Use BlockNodeInfo Kevin Wolf
2023-01-20 12:26 ` Kevin Wolf [this message]
2023-01-20 12:26 ` [PULL 33/38] block/qapi: Introduce BlockGraphInfo Kevin Wolf
2023-01-20 12:26 ` [PULL 34/38] block/qapi: Add indentation to bdrv_node_info_dump() Kevin Wolf
2023-01-20 12:26 ` [PULL 35/38] iotests: Filter child node information Kevin Wolf
2023-01-20 12:26 ` [PULL 36/38] iotests/106, 214, 308: Read only one size line Kevin Wolf
2023-01-20 12:26 ` [PULL 37/38] qemu-img: Let info print block graph Kevin Wolf
2023-01-20 12:26 ` [PULL 38/38] qemu-img: Change info key names for protocol nodes Kevin Wolf
2023-01-21 13:03 ` [PULL 00/38] Block layer patches Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230120122633.84983-33-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).