qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Markus Armbruster <armbru@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error
Date: Mon, 8 Oct 2018 23:22:19 +0200	[thread overview]
Message-ID: <a93edd67-8c1a-bb2d-7b52-db46b1e2abbd@redhat.com> (raw)
In-Reply-To: <20181008173125.19678-31-armbru@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 6026 bytes --]

On 08.10.18 19:31, Markus Armbruster wrote:
> Calling error_report() from within a a function that takes an Error **
> argument is suspicious.  drive_new() does that, and its caller
> drive_init_func() then exit()s.

I'm afraid I don't quite follow you here.  There is no function here
that takes an Error ** already and then calls error_report().  There is
however drive_new() that does not take an Error **, consequentially
calls error_report(), and there is its caller drive_init_func() which
does take an Error ** but does not set it.

So while I fully agree with you to make drive_new() take an Error **
(and thus effectively fix drive_init_func()), I don't quite understand
this explanation.

(Furthermore, drive_init_func() does not exit().  It's main() that
exit()s after calling drive_init_func().)

> Its caller main(), via
> qemu_opts_foreach(), is fine with it, but clean it up anyway:
> 
> * Convert drive_new() to Error
> 
> * Update add_init_drive() to report the error received from
>   drive_new().
> 
> * Make main() pass &error_fatal through qemu_opts_foreach(),
>   drive_init_func() to drive_new()
> 
> * Make default_drive() pass &error_abort through qemu_opts_foreach(),
>   drive_init_func() to drive_new()
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  blockdev.c                | 27 ++++++++++++++-------------
>  device-hotplug.c          |  5 ++++-
>  include/sysemu/blockdev.h |  3 ++-
>  vl.c                      | 11 ++++-------
>  4 files changed, 24 insertions(+), 22 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index a8755bd908..574adbcb7f 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -759,7 +759,8 @@ QemuOptsList qemu_legacy_drive_opts = {

[...]

> @@ -991,7 +992,7 @@ DriveInfo *drive_new(QemuOpts *all_opts, BlockInterfaceType block_default_type)
>      bs_opts = NULL;
>      if (!blk) {
>          if (local_err) {
> -            error_report_err(local_err);
> +            error_propagate(errp, local_err);
>          }

Wait, what would be the case where blockdev_init() returns NULL but
*errp remains unse——— oh no.

There is only one case which is someone specified "format=help".  Hm.  I
suppose you are as unhappy as me about the fact that because of this
drive_new() cannot guarantee that *errp is set in case of an error.

I think it's ""fine"" (*gnashing teeth*) to keep it this way, but it
means that callers need to continue to check the return value and not
*errp alone.

>          goto fail;
>      } else {
> diff --git a/device-hotplug.c b/device-hotplug.c
> index cd427e2c76..6090d5f1e9 100644
> --- a/device-hotplug.c
> +++ b/device-hotplug.c
> @@ -28,6 +28,7 @@
>  #include "sysemu/block-backend.h"
>  #include "sysemu/blockdev.h"
>  #include "qapi/qmp/qdict.h"
> +#include "qapi/error.h"
>  #include "qemu/config-file.h"
>  #include "qemu/option.h"
>  #include "sysemu/sysemu.h"
> @@ -36,6 +37,7 @@
>  
>  static DriveInfo *add_init_drive(const char *optstr)
>  {
> +    Error *err = NULL;
>      DriveInfo *dinfo;
>      QemuOpts *opts;
>      MachineClass *mc;
> @@ -45,8 +47,9 @@ static DriveInfo *add_init_drive(const char *optstr)
>          return NULL;
>  
>      mc = MACHINE_GET_CLASS(current_machine);
> -    dinfo = drive_new(opts, mc->block_default_type);
> +    dinfo = drive_new(opts, mc->block_default_type, &err);
>      if (!dinfo) {
> +        error_report_err(err);
>          qemu_opts_del(opts);
>          return NULL;
>      }
> diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
> index 24954b94e0..d34c4920dc 100644
> --- a/include/sysemu/blockdev.h
> +++ b/include/sysemu/blockdev.h
> @@ -54,7 +54,8 @@ DriveInfo *drive_get_next(BlockInterfaceType type);
>  QemuOpts *drive_def(const char *optstr);
>  QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
>                      const char *optstr);
> -DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type);
> +DriveInfo *drive_new(QemuOpts *arg, BlockInterfaceType block_default_type,
> +                     Error **errp);
>  
>  /* device-hotplug */
>  
> diff --git a/vl.c b/vl.c
> index 0d25956b2f..101e0123d9 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1129,7 +1129,7 @@ static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
>  {
>      BlockInterfaceType *block_default_type = opaque;
>  
> -    return drive_new(opts, *block_default_type) == NULL;
> +    return drive_new(opts, *block_default_type, errp) == NULL;
>  }
>  
>  static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
> @@ -1155,8 +1155,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
>          drive_enable_snapshot(NULL, opts, NULL);
>      }
>  
> -    dinfo = drive_new(opts, type);
> -    assert(dinfo);
> +    dinfo = drive_new(opts, type, &error_abort);

Which means the assertion is still necessary here.

>      dinfo->is_default = true;
>  
>  }
> @@ -4348,10 +4347,8 @@ int main(int argc, char **argv, char **envp)
>          qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot,
>                            NULL, NULL);
>      }
> -    if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
> -                          &machine_class->block_default_type, NULL)) {
> -        exit(1);
> -    }
> +    qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
> +                      &machine_class->block_default_type, &error_fatal);

And we still have to keep an exit() here.

Alternative: You transform blockdev_init()'s format=help into an error
(or construct a new error in drive_new() if blockdev_init() returned
NULL but no error).

Max

>  
>      default_drive(default_cdrom, snapshot, machine_class->block_default_type, 2,
>                    CDROM_OPTS);
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  parent reply	other threads:[~2018-10-08 21:28 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-08 17:30 [Qemu-devel] [PATCH 00/31] Replace some unwise uses of error_report() & friends Markus Armbruster
2018-10-08 17:30 ` [Qemu-devel] [PATCH 01/31] Use error_fatal to simplify obvious fatal errors (again) Markus Armbruster
2018-10-08 20:32   ` Eric Blake
2018-10-11 17:25     ` Markus Armbruster
2018-10-08 22:25   ` David Gibson
2018-10-08 17:30 ` [Qemu-devel] [PATCH 02/31] block: Use warn_report() & friends to report warnings Markus Armbruster
2018-10-08 20:35   ` Eric Blake
2018-10-08 17:30 ` [Qemu-devel] [PATCH 03/31] cpus hw target: " Markus Armbruster
2018-10-08 22:25   ` David Gibson
2018-10-09  9:56   ` Alex Bennée
2018-10-08 17:30 ` [Qemu-devel] [PATCH 04/31] vfio: " Markus Armbruster
2018-10-08 19:04   ` Alex Williamson
2018-10-08 17:30 ` [Qemu-devel] [PATCH 05/31] vfio: Clean up error reporting after previous commit Markus Armbruster
2018-10-08 19:04   ` Alex Williamson
2018-10-08 17:31 ` [Qemu-devel] [PATCH 06/31] char: Use error_printf() to print help and such Markus Armbruster
2018-10-09  6:09   ` Philippe Mathieu-Daudé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 07/31] 9pfs: Fix CLI parsing crash on error Markus Armbruster
2018-10-09  7:38   ` Greg Kurz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 08/31] pc: Fix machine property nvdimm-persistence error handling Markus Armbruster
2018-10-09  9:15   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 09/31] ioapic: Fix error handling in realize() Markus Armbruster
2018-10-09  3:24   ` Peter Xu
2018-10-09  9:18   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 10/31] smbios: Clean up error handling in smbios_add() Markus Armbruster
2018-10-09  9:25   ` Marc-André Lureau
2018-10-09 17:02   ` Paolo Bonzini
2018-10-08 17:31 ` [Qemu-devel] [PATCH 11/31] migration: Fix !replay_can_snapshot() error handling Markus Armbruster
2018-10-09  9:27   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 12/31] l2tpv3: Improve -netdev/netdev_add/-net/... error reporting Markus Armbruster
2018-10-09  9:32   ` Marc-André Lureau
2018-10-11 17:35     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 13/31] net/socket: Fix invalid socket type error handling Markus Armbruster
2018-10-09  9:47   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 14/31] numa: Fix QMP command set-numa-node " Markus Armbruster
2018-10-08 18:03   ` Eduardo Habkost
2018-10-11 17:38     ` Markus Armbruster
2018-10-12 14:35   ` Igor Mammedov
2018-10-13 16:33     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 15/31] xen/pt: Fix incomplete conversion to realize() Markus Armbruster
2018-10-10 13:31   ` Anthony PERARD
2018-10-08 17:31 ` [Qemu-devel] [PATCH 16/31] seccomp: Clean up error reporting in parse_sandbox() Markus Armbruster
2018-10-09  9:53   ` Marc-André Lureau
2018-10-11 17:40     ` Markus Armbruster
2018-10-10 12:39   ` Eduardo Otubo
2018-10-08 17:31 ` [Qemu-devel] [PATCH 17/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
2018-10-09 10:11   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 18/31] qom: Clean up error reporting in user_creatable_add_opts_foreach() Markus Armbruster
2018-10-08 20:43   ` Eric Blake
2018-10-09 11:11   ` Marc-André Lureau
2018-10-09 13:25   ` Daniel P. Berrangé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 19/31] vl: Clean up error reporting in parse_add_fd() Markus Armbruster
2018-10-09  6:07   ` Philippe Mathieu-Daudé
2018-10-09 11:13   ` Marc-André Lureau
2018-10-11 17:43     ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 20/31] vl: Clean up error reporting in machine_set_property() Markus Armbruster
2018-10-09  6:02   ` Philippe Mathieu-Daudé
2018-10-09 11:18   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 21/31] vl: Clean up error reporting in mon_init_func() Markus Armbruster
2018-10-09  6:02   ` Philippe Mathieu-Daudé
2018-10-09 11:21   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 22/31] vl: Clean up error reporting in parse_fw_cfg() Markus Armbruster
2018-10-09 11:25   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 23/31] vl: Clean up error reporting in device_init_func() Markus Armbruster
2018-10-09  6:05   ` Philippe Mathieu-Daudé
2018-10-08 17:31 ` [Qemu-devel] [PATCH 24/31] vl: Clean up error reporting in vnc_init_func() Markus Armbruster
2018-10-09 11:35   ` Marc-André Lureau
2018-10-11 17:48   ` Markus Armbruster
2018-10-08 17:31 ` [Qemu-devel] [PATCH 25/31] numa: Clean up error reporting in parse_numa() Markus Armbruster
2018-10-08 18:01   ` Eduardo Habkost
2018-10-08 17:31 ` [Qemu-devel] [PATCH 26/31] tpm: Clean up error reporting in tpm_init_tpmdev() Markus Armbruster
2018-10-09 10:57   ` Philippe Mathieu-Daudé
2018-10-09 11:38   ` Marc-André Lureau
2018-10-10 19:00   ` Stefan Berger
2018-10-08 17:31 ` [Qemu-devel] [PATCH 27/31] spice: Clean up error reporting in add_channel() Markus Armbruster
2018-10-09 11:46   ` Marc-André Lureau
2018-10-08 17:31 ` [Qemu-devel] [PATCH 28/31] fsdev: Clean up error reporting in qemu_fsdev_add() Markus Armbruster
2018-10-08 20:46   ` Eric Blake
2018-10-11 17:51     ` Markus Armbruster
2018-10-09  7:45   ` Greg Kurz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 29/31] vl: Assert drive_new() does not fail in default_drive() Markus Armbruster
2018-10-08 20:48   ` Eric Blake
2018-10-08 21:08   ` Max Reitz
2018-10-08 17:31 ` [Qemu-devel] [PATCH 30/31] blockdev: Convert drive_new() to Error Markus Armbruster
2018-10-08 20:48   ` Eric Blake
2018-10-08 21:22   ` Max Reitz [this message]
2018-10-12  5:44     ` Markus Armbruster
2018-10-12 12:28       ` Max Reitz
2018-10-12 14:50         ` Kevin Wolf
2018-10-08 17:31 ` [Qemu-devel] [PATCH 31/31] vl: Simplify call of parse_name() Markus Armbruster
2018-10-09  6:06   ` Philippe Mathieu-Daudé

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=a93edd67-8c1a-bb2d-7b52-db46b1e2abbd@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --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).