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 --]
next prev 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).