You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
7.9 KiB
247 lines
7.9 KiB
From 54e290df4bc1c9e83be7357caed6a2b1ba4f21f0 Mon Sep 17 00:00:00 2001
|
|
From: Hanna Reitz <hreitz@redhat.com>
|
|
Date: Mon, 20 Jun 2022 18:26:56 +0200
|
|
Subject: [PATCH 09/20] block: Split BlockNodeInfo off of ImageInfo
|
|
|
|
RH-Author: Hanna Czenczek <hreitz@redhat.com>
|
|
RH-MergeRequest: 145: Show protocol-level information in qemu-img info
|
|
RH-Bugzilla: 1860292
|
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
|
RH-Commit: [4/12] fc8d69d549bb9a929db218b91697ee3ae95c1ff6 (hreitz/qemu-kvm-c-9-s)
|
|
|
|
ImageInfo sometimes contains flat information, and sometimes it does
|
|
not. Split off a BlockNodeInfo struct, which only contains information
|
|
about a single node and has no link to the backing image.
|
|
|
|
We do this so we can extend BlockNodeInfo to a BlockGraphInfo struct,
|
|
which has links to all child nodes, not just the backing node. It would
|
|
be strange to base BlockGraphInfo on ImageInfo, because then this
|
|
extended struct would have two links to the backing node (one in
|
|
BlockGraphInfo as one of all the child links, and one in ImageInfo).
|
|
|
|
Furthermore, it is quite common to ignore the backing-image field
|
|
altogether: bdrv_query_image_info() does not set it, and
|
|
bdrv_image_info_dump() does not evaluate it. That signals that we
|
|
should have different structs for describing a single node and one that
|
|
has a link to the backing image.
|
|
|
|
Still, bdrv_query_image_info() and bdrv_image_info_dump() are not
|
|
changed too much in this patch. Follow-up patches will handle them.
|
|
|
|
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
|
|
Message-Id: <20220620162704.80987-5-hreitz@redhat.com>
|
|
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
(cherry picked from commit a2085f8909377b6df738f6c3f7ee6db4d16da8f7)
|
|
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
|
|
---
|
|
block/qapi.c | 86 ++++++++++++++++++++++++++++++++------------
|
|
include/block/qapi.h | 3 ++
|
|
qapi/block-core.json | 24 +++++++++----
|
|
3 files changed, 85 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/block/qapi.c b/block/qapi.c
|
|
index 51202b470a..e5022b4481 100644
|
|
--- a/block/qapi.c
|
|
+++ b/block/qapi.c
|
|
@@ -241,30 +241,18 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
|
}
|
|
|
|
/**
|
|
- * bdrv_query_image_info:
|
|
- * @bs: block device to examine
|
|
- * @p_info: location to store image information
|
|
- * @errp: location to store error information
|
|
- *
|
|
- * Store "flat" image information in @p_info.
|
|
- *
|
|
- * "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.
|
|
- *
|
|
- * @p_info will be set only on success. On error, store error in @errp.
|
|
+ * Helper function for other query info functions. Store information about @bs
|
|
+ * in @info, setting @errp on error.
|
|
*/
|
|
-void bdrv_query_image_info(BlockDriverState *bs,
|
|
- ImageInfo **p_info,
|
|
- Error **errp)
|
|
+static void bdrv_do_query_node_info(BlockDriverState *bs,
|
|
+ BlockNodeInfo *info,
|
|
+ Error **errp)
|
|
{
|
|
int64_t size;
|
|
const char *backing_filename;
|
|
BlockDriverInfo bdi;
|
|
int ret;
|
|
Error *err = NULL;
|
|
- ImageInfo *info;
|
|
|
|
aio_context_acquire(bdrv_get_aio_context(bs));
|
|
|
|
@@ -277,7 +265,6 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
|
|
|
bdrv_refresh_filename(bs);
|
|
|
|
- info = g_new0(ImageInfo, 1);
|
|
info->filename = g_strdup(bs->filename);
|
|
info->format = g_strdup(bdrv_get_format_name(bs));
|
|
info->virtual_size = size;
|
|
@@ -298,7 +285,6 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
|
info->format_specific = bdrv_get_specific_info(bs, &err);
|
|
if (err) {
|
|
error_propagate(errp, err);
|
|
- qapi_free_ImageInfo(info);
|
|
goto out;
|
|
}
|
|
info->has_format_specific = info->format_specific != NULL;
|
|
@@ -339,16 +325,72 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
|
break;
|
|
default:
|
|
error_propagate(errp, err);
|
|
- qapi_free_ImageInfo(info);
|
|
goto out;
|
|
}
|
|
|
|
- *p_info = info;
|
|
-
|
|
out:
|
|
aio_context_release(bdrv_get_aio_context(bs));
|
|
}
|
|
|
|
+/**
|
|
+ * bdrv_query_block_node_info:
|
|
+ * @bs: block node to examine
|
|
+ * @p_info: location to store node information
|
|
+ * @errp: location to store error information
|
|
+ *
|
|
+ * Store image information about @bs in @p_info.
|
|
+ *
|
|
+ * @p_info will be set only on success. On error, store error in @errp.
|
|
+ */
|
|
+void bdrv_query_block_node_info(BlockDriverState *bs,
|
|
+ BlockNodeInfo **p_info,
|
|
+ Error **errp)
|
|
+{
|
|
+ BlockNodeInfo *info;
|
|
+ ERRP_GUARD();
|
|
+
|
|
+ info = g_new0(BlockNodeInfo, 1);
|
|
+ bdrv_do_query_node_info(bs, info, errp);
|
|
+ if (*errp) {
|
|
+ qapi_free_BlockNodeInfo(info);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ *p_info = info;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * bdrv_query_image_info:
|
|
+ * @bs: block node to examine
|
|
+ * @p_info: location to store image information
|
|
+ * @errp: location to store error information
|
|
+ *
|
|
+ * Store "flat" image information in @p_info.
|
|
+ *
|
|
+ * "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.
|
|
+ *
|
|
+ * @p_info will be set only on success. On error, store error in @errp.
|
|
+ */
|
|
+void bdrv_query_image_info(BlockDriverState *bs,
|
|
+ ImageInfo **p_info,
|
|
+ Error **errp)
|
|
+{
|
|
+ ImageInfo *info;
|
|
+ ERRP_GUARD();
|
|
+
|
|
+ info = g_new0(ImageInfo, 1);
|
|
+ bdrv_do_query_node_info(bs, qapi_ImageInfo_base(info), errp);
|
|
+ if (*errp) {
|
|
+ qapi_free_ImageInfo(info);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ *p_info = info;
|
|
+}
|
|
+
|
|
/* @p_info will be set only on success. */
|
|
static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info,
|
|
Error **errp)
|
|
diff --git a/include/block/qapi.h b/include/block/qapi.h
|
|
index c09859ea78..c7de4e3fa9 100644
|
|
--- a/include/block/qapi.h
|
|
+++ b/include/block/qapi.h
|
|
@@ -35,6 +35,9 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
|
|
int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
|
SnapshotInfoList **p_list,
|
|
Error **errp);
|
|
+void bdrv_query_block_node_info(BlockDriverState *bs,
|
|
+ BlockNodeInfo **p_info,
|
|
+ Error **errp);
|
|
void bdrv_query_image_info(BlockDriverState *bs,
|
|
ImageInfo **p_info,
|
|
Error **errp);
|
|
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
|
index 4b9365167f..7720da0498 100644
|
|
--- a/qapi/block-core.json
|
|
+++ b/qapi/block-core.json
|
|
@@ -251,7 +251,7 @@
|
|
} }
|
|
|
|
##
|
|
-# @ImageInfo:
|
|
+# @BlockNodeInfo:
|
|
#
|
|
# Information about a QEMU image file
|
|
#
|
|
@@ -279,22 +279,34 @@
|
|
#
|
|
# @snapshots: list of VM snapshots
|
|
#
|
|
-# @backing-image: info of the backing image (since 1.6)
|
|
-#
|
|
# @format-specific: structure supplying additional format-specific
|
|
# information (since 1.7)
|
|
#
|
|
-# Since: 1.3
|
|
+# Since: 8.0
|
|
##
|
|
-{ 'struct': 'ImageInfo',
|
|
+{ 'struct': 'BlockNodeInfo',
|
|
'data': {'filename': 'str', 'format': 'str', '*dirty-flag': 'bool',
|
|
'*actual-size': 'int', 'virtual-size': 'int',
|
|
'*cluster-size': 'int', '*encrypted': 'bool', '*compressed': 'bool',
|
|
'*backing-filename': 'str', '*full-backing-filename': 'str',
|
|
'*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'],
|
|
- '*backing-image': 'ImageInfo',
|
|
'*format-specific': 'ImageInfoSpecific' } }
|
|
|
|
+##
|
|
+# @ImageInfo:
|
|
+#
|
|
+# Information about a QEMU image file, and potentially its backing image
|
|
+#
|
|
+# @backing-image: info of the backing image
|
|
+#
|
|
+# Since: 1.3
|
|
+##
|
|
+{ 'struct': 'ImageInfo',
|
|
+ 'base': 'BlockNodeInfo',
|
|
+ 'data': {
|
|
+ '*backing-image': 'ImageInfo'
|
|
+ } }
|
|
+
|
|
##
|
|
# @ImageCheck:
|
|
#
|
|
--
|
|
2.31.1
|
|
|