From c8c282c2e1d74cfc5de6527f7e20dfc3e76b67ac Mon Sep 17 00:00:00 2001 From: Hanna Reitz Date: Mon, 20 Jun 2022 18:27:00 +0200 Subject: [PATCH 13/20] block/qapi: Add indentation to bdrv_node_info_dump() RH-Author: Hanna Czenczek RH-MergeRequest: 145: Show protocol-level information in qemu-img info RH-Bugzilla: 1860292 RH-Acked-by: Kevin Wolf RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Stefano Garzarella RH-Commit: [8/12] d3a697e81ab9828457198075e5815a592363c725 (hreitz/qemu-kvm-c-9-s) In order to let qemu-img info present a block graph, add a parameter to bdrv_node_info_dump() and bdrv_image_info_specific_dump() so that the information of nodes below the root level can be given an indentation. Signed-off-by: Hanna Reitz Message-Id: <20220620162704.80987-9-hreitz@redhat.com> Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf (cherry picked from commit 76c9e9750d1bd580e8ed4465f6be3a986434e7c3) Signed-off-by: Hanna Czenczek --- block/monitor/block-hmp-cmds.c | 2 +- block/qapi.c | 47 +++++++++++++++++++--------------- include/block/qapi.h | 5 ++-- qemu-img.c | 2 +- qemu-io-cmds.c | 3 ++- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index aa37faa601..72824d4e2e 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -734,7 +734,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info, monitor_printf(mon, "\nImages:\n"); image_info = inserted->image; while (1) { - bdrv_node_info_dump(qapi_ImageInfo_base(image_info)); + bdrv_node_info_dump(qapi_ImageInfo_base(image_info), 0); if (image_info->has_backing_image) { image_info = image_info->backing_image; } else { diff --git a/block/qapi.c b/block/qapi.c index f208c21ccf..3e35603f0c 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -915,7 +915,8 @@ static bool qobject_is_empty_dump(const QObject *obj) * prepending an optional prefix if the dump is not empty. */ void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec, - const char *prefix) + const char *prefix, + int indentation) { QObject *obj, *data; Visitor *v = qobject_output_visitor_new(&obj); @@ -925,48 +926,51 @@ void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec, data = qdict_get(qobject_to(QDict, obj), "data"); if (!qobject_is_empty_dump(data)) { if (prefix) { - qemu_printf("%s", prefix); + qemu_printf("%*s%s", indentation * 4, "", prefix); } - dump_qobject(1, data); + dump_qobject(indentation + 1, data); } qobject_unref(obj); visit_free(v); } -void bdrv_node_info_dump(BlockNodeInfo *info) +void bdrv_node_info_dump(BlockNodeInfo *info, int indentation) { char *size_buf, *dsize_buf; + g_autofree char *ind_s = g_strdup_printf("%*s", indentation * 4, ""); + if (!info->has_actual_size) { dsize_buf = g_strdup("unavailable"); } else { dsize_buf = size_to_str(info->actual_size); } size_buf = size_to_str(info->virtual_size); - qemu_printf("image: %s\n" - "file format: %s\n" - "virtual size: %s (%" PRId64 " bytes)\n" - "disk size: %s\n", - info->filename, info->format, size_buf, - info->virtual_size, - dsize_buf); + qemu_printf("%simage: %s\n" + "%sfile format: %s\n" + "%svirtual size: %s (%" PRId64 " bytes)\n" + "%sdisk size: %s\n", + ind_s, info->filename, + ind_s, info->format, + ind_s, size_buf, info->virtual_size, + ind_s, dsize_buf); g_free(size_buf); g_free(dsize_buf); if (info->has_encrypted && info->encrypted) { - qemu_printf("encrypted: yes\n"); + qemu_printf("%sencrypted: yes\n", ind_s); } if (info->has_cluster_size) { - qemu_printf("cluster_size: %" PRId64 "\n", - info->cluster_size); + qemu_printf("%scluster_size: %" PRId64 "\n", + ind_s, info->cluster_size); } if (info->has_dirty_flag && info->dirty_flag) { - qemu_printf("cleanly shut down: no\n"); + qemu_printf("%scleanly shut down: no\n", ind_s); } if (info->has_backing_filename) { - qemu_printf("backing file: %s", info->backing_filename); + qemu_printf("%sbacking file: %s", ind_s, info->backing_filename); if (!info->has_full_backing_filename) { qemu_printf(" (cannot determine actual path)"); } else if (strcmp(info->backing_filename, @@ -975,15 +979,16 @@ void bdrv_node_info_dump(BlockNodeInfo *info) } qemu_printf("\n"); if (info->has_backing_filename_format) { - qemu_printf("backing file format: %s\n", - info->backing_filename_format); + qemu_printf("%sbacking file format: %s\n", + ind_s, info->backing_filename_format); } } if (info->has_snapshots) { SnapshotInfoList *elem; - qemu_printf("Snapshot list:\n"); + qemu_printf("%sSnapshot list:\n", ind_s); + qemu_printf("%s", ind_s); bdrv_snapshot_dump(NULL); qemu_printf("\n"); @@ -1003,6 +1008,7 @@ void bdrv_node_info_dump(BlockNodeInfo *info) pstrcpy(sn.id_str, sizeof(sn.id_str), elem->value->id); pstrcpy(sn.name, sizeof(sn.name), elem->value->name); + qemu_printf("%s", ind_s); bdrv_snapshot_dump(&sn); qemu_printf("\n"); } @@ -1010,6 +1016,7 @@ void bdrv_node_info_dump(BlockNodeInfo *info) if (info->has_format_specific) { bdrv_image_info_specific_dump(info->format_specific, - "Format specific information:\n"); + "Format specific information:\n", + indentation); } } diff --git a/include/block/qapi.h b/include/block/qapi.h index 196436020e..38855f2ae9 100644 --- a/include/block/qapi.h +++ b/include/block/qapi.h @@ -49,6 +49,7 @@ void bdrv_query_block_graph_info(BlockDriverState *bs, void bdrv_snapshot_dump(QEMUSnapshotInfo *sn); void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec, - const char *prefix); -void bdrv_node_info_dump(BlockNodeInfo *info); + const char *prefix, + int indentation); +void bdrv_node_info_dump(BlockNodeInfo *info, int indentation); #endif diff --git a/qemu-img.c b/qemu-img.c index 3b2ca3bbcb..30b4ea58bb 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2859,7 +2859,7 @@ static void dump_human_image_info_list(BlockNodeInfoList *list) } delim = true; - bdrv_node_info_dump(elem->value); + bdrv_node_info_dump(elem->value, 0); } } diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index f4a374528e..fdcb89211b 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -1826,7 +1826,8 @@ static int info_f(BlockBackend *blk, int argc, char **argv) } if (spec_info) { bdrv_image_info_specific_dump(spec_info, - "Format specific information:\n"); + "Format specific information:\n", + 0); qapi_free_ImageInfoSpecific(spec_info); } -- 2.31.1