Am 10.07.2026 um 11:36 hat Thomas Huth geschrieben:
> From: Thomas Huth <[email protected]>
> 
> Other command line options like "-chardev", "-netdev" or "-device"
> already present the user with a list of available parameters, but
> when running "-blockdev help", there is currently only an error
> message. There is already the possibility to run "-drive format=help",
> but it does not seem to be documented, so this is not very useful
> for the average user. Let's improve this situation by providing
> the same list of available drivers when running QEMU with
> "-blockdev help".
> 
> Signed-off-by: Thomas Huth <[email protected]>

Seems like a good idea to print at least some minimal help there.
However, I find the list from -drive format=help quite hard to read, and
repeating the same list twice for read-write and read-only doesn't help
either.

I don't expect we can change -drive because I seem to remember that
management tools look at it, but can we make -blockdev help more
consistent with the other examples you mention? Something like this:

    Available blockdev drivers:
      blkdebug
      blklogwrites (read-only)
      blkreplay
      ...

Ideally, I'd also love to have a way to show all the options a specific
driver offers, but that probably won't happen before Markus QAPIfies the
CLI. :-)

>  include/block/block-common.h |  1 +
>  blockdev.c                   | 15 ++++++++++-----
>  system/vl.c                  |  7 +++++--
>  3 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/include/block/block-common.h b/include/block/block-common.h
> index 895ea175413..010c4425dcf 100644
> --- a/include/block/block-common.h
> +++ b/include/block/block-common.h
> @@ -583,5 +583,6 @@ char *path_combine(const char *base_path, const char 
> *filename);
>  char *bdrv_get_full_backing_filename_from_filename(const char *backed,
>                                                     const char *backing,
>                                                     Error **errp);
> +void blockdev_show_help(void);
>  
>  #endif /* BLOCK_COMMON_H */
> diff --git a/blockdev.c b/blockdev.c
> index 6e86c6262f9..3d179939205 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -475,6 +475,15 @@ static OnOffAuto account_get_opt(QemuOpts *opts, const 
> char *name)
>      return ON_OFF_AUTO_OFF;
>  }
>  
> +void blockdev_show_help(void)
> +{
> +      qemu_printf("Supported formats:");

We should definitely talk about "drivers" rather than "formats" with
-blockdev. The help in -drive was added in QEMU 0.10 when "formats" was
actually still accurate, but it hasn't been for a long time.

> +      bdrv_iterate_format(bdrv_format_print, NULL, false);
> +      qemu_printf("\nSupported formats (read-only):");
> +      bdrv_iterate_format(bdrv_format_print, NULL, true);
> +      qemu_printf("\n");
> +}
> +
>  /* Takes the ownership of bs_opts */
>  static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
>                                     Error **errp)
> @@ -541,11 +550,7 @@ static BlockBackend *blockdev_init(const char *file, 
> QDict *bs_opts,
>  
>      if ((buf = qemu_opt_get(opts, "format")) != NULL) {
>          if (is_help_option(buf)) {
> -            qemu_printf("Supported formats:");
> -            bdrv_iterate_format(bdrv_format_print, NULL, false);
> -            qemu_printf("\nSupported formats (read-only):");
> -            bdrv_iterate_format(bdrv_format_print, NULL, true);
> -            qemu_printf("\n");
> +            blockdev_show_help();
>              goto early_err;
>          }
>  
> diff --git a/system/vl.c b/system/vl.c
> index 061cbdf860b..40c0593154a 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -2961,7 +2961,10 @@ void qemu_init(int argc, char **argv)
>                            HD_OPTS);
>                  break;
>              case QEMU_OPTION_blockdev:
> -                {
> +                if (is_help_option(optarg)) {
> +                    blockdev_show_help();
> +                    exit(EXIT_SUCCESS);
> +                } else {
>                      Visitor *v;
>                      BlockdevOptionsQueueEntry *bdo;
>  
> @@ -2974,8 +2977,8 @@ void qemu_init(int argc, char **argv)
>                      visit_free(v);
>                      loc_save(&bdo->loc);
>                      QSIMPLEQ_INSERT_TAIL(&bdo_queue, bdo, entry);
> -                    break;
>                  }
> +                break;
>              case QEMU_OPTION_drive:
>                  if (!qemu_opts_parse_noisily(qemu_find_opts("drive"),
>                                               optarg, false)) {
> -- 
> 2.55.0

Kevin


Reply via email to