From: Markus Armbruster <armbru@redhat.com>
To: Maxim Levitsky <mlevitsk@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>,
qemu-devel@nongnu.org, qemu-block@nongnu.org,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [PATCH 9/9] monitor/hmp: Prefer to use hmp_handle_error for error reporting in block hmp commands
Date: Wed, 27 Nov 2019 09:38:08 +0100 [thread overview]
Message-ID: <87tv6piuj3.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20191120185850.18986-10-mlevitsk@redhat.com> (Maxim Levitsky's message of "Wed, 20 Nov 2019 20:58:50 +0200")
Title is too long. blockdev-hmp-cmds.c will become
block/monitor/block-hmp-cmds.c in v2. With this in mind, suggest
block/monitor: Prefer to use hmp_handle_error() to report HMP errors
Maxim Levitsky <mlevitsk@redhat.com> writes:
> This way they all will be prefixed with 'Error:' which some parsers
> (e.g libvirt need)
Sadly, "all" is far from true. Consider
void hmp_drive_add(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
DriveInfo *dinfo = NULL;
QemuOpts *opts;
MachineClass *mc;
const char *optstr = qdict_get_str(qdict, "opts");
bool node = qdict_get_try_bool(qdict, "node", false);
if (node) {
hmp_drive_add_node(mon, optstr);
return;
}
opts = drive_def(optstr);
if (!opts)
return;
hmp_drive_add_node() uses error_report() and error_report_err(). Easy
enough to fix if you move the function here, as I suggested in my review
of PATCH 8.
drive_def() is a wrapper around qemu_opts_parse_noisily(), which uses
error_report_err(). You can't change qemu_opts_parse_noisily() to use
hmp_handle_error(). You'd have to convert drive_def() to Error, which
involves switching it to qemu_opts_parse() + qemu_opts_print_help().
These are just the first two error paths in this file. There's much
more. Truly routing all HMP errors through hmp_handle_error() takes a
*massive* Error conversion effort, with a high risk of missing Error
conversions, followed by a never-ending risk of non-Error stuff creeping
in.
There must be an easier way.
Consider vreport():
switch (type) {
case REPORT_TYPE_ERROR:
break;
case REPORT_TYPE_WARNING:
error_printf("warning: ");
break;
case REPORT_TYPE_INFO:
error_printf("info: ");
break;
}
Adding the prefix here (either unconditionally, or if cur_mon) covers
all HMP errors reported with error_report() & friends in one blow.
That leaves the ones that are still reported with monitor_printf().
Converting those to error_report() looks far more tractable to me.
> Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
> ---
> blockdev-hmp-cmds.c | 35 +++++++++++++++++++++--------------
> 1 file changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/blockdev-hmp-cmds.c b/blockdev-hmp-cmds.c
> index c943dccd03..197994716f 100644
> --- a/blockdev-hmp-cmds.c
> +++ b/blockdev-hmp-cmds.c
> @@ -59,7 +59,6 @@ void hmp_drive_add(Monitor *mon, const QDict *qdict)
> mc = MACHINE_GET_CLASS(current_machine);
> dinfo = drive_new(opts, mc->block_default_type, &err);
> if (err) {
> - error_report_err(err);
> qemu_opts_del(opts);
> goto err;
> }
> @@ -73,7 +72,7 @@ void hmp_drive_add(Monitor *mon, const QDict *qdict)
> monitor_printf(mon, "OK\n");
> break;
> default:
> - monitor_printf(mon, "Can't hot-add drive to type %d\n", dinfo->type);
> + error_setg(&err, "Can't hot-add drive to type %d", dinfo->type);
> goto err;
> }
> return;
> @@ -84,6 +83,7 @@ err:
> monitor_remove_blk(blk);
> blk_unref(blk);
> }
> + hmp_handle_error(mon, &err);
> }
>
> void hmp_drive_del(Monitor *mon, const QDict *qdict)
> @@ -105,14 +105,14 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
>
> blk = blk_by_name(id);
> if (!blk) {
> - error_report("Device '%s' not found", id);
> - return;
> + error_setg(&local_err, "Device '%s' not found", id);
> + goto err;
Having to create Error objects just so we can use hmp_handle_error() is
awkward. Tolerable if using hmp_handle_error() improves matters. I'm
not sure it does.
> }
>
> if (!blk_legacy_dinfo(blk)) {
> - error_report("Deleting device added with blockdev-add"
> - " is not supported");
> - return;
> + error_setg(&local_err,
> + "Deleting device added with blockdev-add is not supported");
> + goto err;
> }
>
> aio_context = blk_get_aio_context(blk);
> @@ -121,9 +121,8 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
> bs = blk_bs(blk);
> if (bs) {
> if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
> - error_report_err(local_err);
> aio_context_release(aio_context);
> - return;
> + goto err;
> }
>
> blk_remove_bs(blk);
> @@ -144,12 +143,15 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
> }
>
> aio_context_release(aio_context);
> +err:
> + hmp_handle_error(mon, &local_err);
> }
>
> void hmp_commit(Monitor *mon, const QDict *qdict)
> {
> const char *device = qdict_get_str(qdict, "device");
> BlockBackend *blk;
> + Error *local_err = NULL;
> int ret;
>
> if (!strcmp(device, "all")) {
> @@ -160,12 +162,12 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
>
> blk = blk_by_name(device);
> if (!blk) {
> - error_report("Device '%s' not found", device);
> - return;
> + error_setg(&local_err, "Device '%s' not found", device);
> + goto err;
> }
> if (!blk_is_available(blk)) {
> - error_report("Device '%s' has no medium", device);
> - return;
> + error_setg(&local_err, "Device '%s' has no medium", device);
> + goto err;
> }
>
> bs = blk_bs(blk);
> @@ -177,8 +179,13 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
> aio_context_release(aio_context);
> }
> if (ret < 0) {
> - error_report("'commit' error for '%s': %s", device, strerror(-ret));
> + error_setg(&local_err,
> + "'commit' error for '%s': %s", device, strerror(-ret));
> + goto err;
> }
> + return;
> +err:
> + hmp_handle_error(mon, &local_err);
> }
>
> void hmp_drive_mirror(Monitor *mon, const QDict *qdict)
next prev parent reply other threads:[~2019-11-27 8:47 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-20 18:58 [PATCH 0/9] RFC: [for 5.0]: HMP monitor handlers cleanups Maxim Levitsky
2019-11-20 18:58 ` [PATCH 1/9] monitor: uninline add_init_drive Maxim Levitsky
2019-11-27 7:13 ` Markus Armbruster
2020-01-27 11:03 ` Maxim Levitsky
2019-11-20 18:58 ` [PATCH 2/9] monitor: rename device-hotplug.c to blockdev-hmp-cmds.c Maxim Levitsky
2019-11-20 18:58 ` [PATCH 3/9] monitor: move hmp_drive_del and hmp_commit " Maxim Levitsky
2019-11-27 7:29 ` Markus Armbruster
2020-01-27 11:03 ` Maxim Levitsky
2019-11-27 7:50 ` Markus Armbruster
2020-01-27 11:03 ` Maxim Levitsky
2019-11-20 18:58 ` [PATCH 4/9] monitor: move hmp_drive_mirror and hmp_drive_backup " Maxim Levitsky
2019-11-27 7:22 ` Markus Armbruster
2020-01-27 11:04 ` Maxim Levitsky
2019-11-20 18:58 ` [PATCH 5/9] monitor: move hmp_block_job* to blockdev-hmp-cmd.c Maxim Levitsky
2019-11-27 7:24 ` Markus Armbruster
2020-01-27 11:03 ` Maxim Levitsky
2019-11-20 18:58 ` [PATCH 6/9] monitor: move hmp_snapshot_* to blockdev-hmp-cmds.c Maxim Levitsky
2019-11-20 18:58 ` [PATCH 7/9] monitor: move remaining hmp_block* functions " Maxim Levitsky
2019-11-20 18:58 ` [PATCH 8/9] monitor: move hmp_info_block* " Maxim Levitsky
2019-11-27 8:08 ` Markus Armbruster
2020-01-27 11:05 ` Maxim Levitsky
2020-01-27 13:33 ` Markus Armbruster
2020-01-27 13:54 ` Maxim Levitsky
2020-01-27 14:07 ` Kevin Wolf
2019-11-20 18:58 ` [PATCH 9/9] monitor/hmp: Prefer to use hmp_handle_error for error reporting in block hmp commands Maxim Levitsky
2019-11-27 8:38 ` Markus Armbruster [this message]
2020-01-27 11:04 ` Maxim Levitsky
2020-01-27 13:44 ` Markus Armbruster
2020-01-27 13:53 ` Maxim Levitsky
2020-01-28 19:35 ` Dr. David Alan Gilbert
2019-11-22 10:15 ` [PATCH 0/9] RFC: [for 5.0]: HMP monitor handlers cleanups Dr. David Alan Gilbert
2019-11-22 10:27 ` Kevin Wolf
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=87tv6piuj3.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=kwolf@redhat.com \
--cc=mlevitsk@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.