From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: Juan Quintela <quintela@redhat.com>,
lvivier@redhat.com, qemu-devel@nongnu.org, peterx@redhat.com
Subject: Re: [Qemu-devel] [PATCH 6/6] migration: Pass Error ** argument to {save, load}_vmstate
Date: Fri, 28 Apr 2017 17:13:48 +0100 [thread overview]
Message-ID: <20170428161347.GD3276@work-vm> (raw)
In-Reply-To: <87y3uk8src.fsf@dusky.pond.sub.org>
* Markus Armbruster (armbru@redhat.com) wrote:
> "Dr. David Alan Gilbert" <dgilbert@redhat.com> writes:
>
> > * Juan Quintela (quintela@redhat.com) wrote:
> >> This way we use the "normal" way of printing errors for hmp commands.
> >>
> >> --
> >> Paolo suggestion
> >>
> >> Signed-off-by: Juan Quintela <quintela@redhat.com>
> >
> > <snip>
> >
> >> +int save_vmstate(const char *name, Error **errp)
> >> {
> >> BlockDriverState *bs, *bs1;
> >> QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
> >> @@ -2076,29 +2076,27 @@ int save_vmstate(const char *name)
> >> uint64_t vm_state_size;
> >> qemu_timeval tv;
> >> struct tm tm;
> >> - Error *local_err = NULL;
> >> AioContext *aio_context;
> >>
> >> if (!bdrv_all_can_snapshot(&bs)) {
> >> - error_report("Device '%s' is writable but does not support snapshots",
> >> - bdrv_get_device_name(bs));
> >> + error_setg(errp, "Device '%s' is writable but does not support "
> >> + "snapshots", bdrv_get_device_name(bs));
> >> return ret;
> >> }
> >>
> >> /* Delete old snapshots of the same name */
> >> if (name) {
> >> - ret = bdrv_all_delete_snapshot(name, &bs1, &local_err);
> >> + ret = bdrv_all_delete_snapshot(name, &bs1, errp);
> >> if (ret < 0) {
> >> - error_reportf_err(local_err,
> >> - "Error while deleting snapshot on device '%s': ",
> >> - bdrv_get_device_name(bs1));
> >> + error_prepend(errp, "Error while deleting snapshot on device "
> >> + "'%s': ", bdrv_get_device_name(bs1));
> >
> > I thought the rule was that you had to use a local_err and use error_propagate?
> > (I hate that rule)
>
> Quote qapi/error.h:
>
> * Receive an error and pass it on to the caller:
> * Error *err = NULL;
> * foo(arg, &err);
> * if (err) {
> * handle the error...
> * error_propagate(errp, err);
> * }
> * where Error **errp is a parameter, by convention the last one.
> *
> * Do *not* "optimize" this to
> * foo(arg, errp);
> * if (*errp) { // WRONG!
> * handle the error...
> * }
> * because errp may be NULL!
> *
> * But when all you do with the error is pass it on, please use
> * foo(arg, errp);
> * for readability.
>
> Neglects to mention you can error_prepend() and still avoid
> error_propagate(), but the comment is long enough as it is.
Ah ok, that does make life easier.
> >> return ret;
> >> }
> >> }
> >>
> >> bs = bdrv_all_find_vmstate_bs();
> >> if (bs == NULL) {
> >> - error_report("No block device can accept snapshots");
> >> + error_setg(errp, "No block device can accept snapshots");
> >> return ret;
> >> }
> >> aio_context = bdrv_get_aio_context(bs);
> >> @@ -2107,7 +2105,7 @@ int save_vmstate(const char *name)
> >>
> >> ret = global_state_store();
> >> if (ret) {
> >> - error_report("Error saving global state");
> >> + error_setg(errp, "Error saving global state");
> >> return ret;
> >> }
> >> vm_stop(RUN_STATE_SAVE_VM);
> >> @@ -2139,21 +2137,20 @@ int save_vmstate(const char *name)
> >> /* save the VM state */
> >> f = qemu_fopen_bdrv(bs, 1);
> >> if (!f) {
> >> - error_report("Could not open VM state file");
> >> + error_setg(errp, "Could not open VM state file");
> >> goto the_end;
> >> }
> >> - ret = qemu_savevm_state(f, &local_err);
> >> + ret = qemu_savevm_state(f, errp);
> >> vm_state_size = qemu_ftell(f);
> >> qemu_fclose(f);
> >> if (ret < 0) {
> >> - error_report_err(local_err);
> >> goto the_end;
> >> }
> >>
> >> ret = bdrv_all_create_snapshot(sn, bs, vm_state_size, &bs);
> >> if (ret < 0) {
> >> - error_report("Error while creating snapshot on '%s'",
> >> - bdrv_get_device_name(bs));
> >> + error_setg(errp, "Error while creating snapshot on '%s'",
> >> + bdrv_get_device_name(bs));
> >> goto the_end;
> >> }
> >>
> >> @@ -2226,7 +2223,7 @@ void qmp_xen_load_devices_state(const char *filename, Error **errp)
> >> migration_incoming_state_destroy();
> >> }
> >>
> >> -int load_vmstate(const char *name)
> >> +int load_vmstate(const char *name, Error **errp)
> >> {
> >> BlockDriverState *bs, *bs_vm_state;
> >> QEMUSnapshotInfo sn;
> >> @@ -2236,20 +2233,22 @@ int load_vmstate(const char *name)
> >> MigrationIncomingState *mis = migration_incoming_get_current();
> >>
> >> if (!bdrv_all_can_snapshot(&bs)) {
> >> - error_report("Device '%s' is writable but does not support snapshots",
> >> - bdrv_get_device_name(bs));
> >> + error_setg(errp,
> >> + "Device '%s' is writable but does not support snapshots",
> >> + bdrv_get_device_name(bs));
> >> return -ENOTSUP;
> >> }
> >> ret = bdrv_all_find_snapshot(name, &bs);
> >> if (ret < 0) {
> >> - error_report("Device '%s' does not have the requested snapshot '%s'",
> >> - bdrv_get_device_name(bs), name);
> >> + error_setg(errp,
> >> + "Device '%s' does not have the requested snapshot '%s'",
> >> + bdrv_get_device_name(bs), name);
> >> return ret;
> >> }
> >>
> >> bs_vm_state = bdrv_all_find_vmstate_bs();
> >> if (!bs_vm_state) {
> >> - error_report("No block device supports snapshots");
> >> + error_setg(errp, "No block device supports snapshots");
> >> return -ENOTSUP;
> >> }
> >> aio_context = bdrv_get_aio_context(bs_vm_state);
> >> @@ -2261,8 +2260,8 @@ int load_vmstate(const char *name)
> >> if (ret < 0) {
> >> return ret;
> >> } else if (sn.vm_state_size == 0) {
> >> - error_report("This is a disk-only snapshot. Revert to it offline "
> >> - "using qemu-img.");
> >> + error_setg(errp, "This is a disk-only snapshot. Revert to it "
> >> + " offline using qemu-img");
> >> return -EINVAL;
> >> }
> >>
> >> @@ -2271,7 +2270,7 @@ int load_vmstate(const char *name)
> >>
> >> ret = bdrv_all_goto_snapshot(name, &bs);
> >> if (ret < 0) {
> >> - error_report("Error %d while activating snapshot '%s' on '%s'",
> >> + error_setg(errp, "Error %d while activating snapshot '%s' on '%s'",
> >> ret, name, bdrv_get_device_name(bs));
> >> return ret;
> >> }
> >> @@ -2279,7 +2278,7 @@ int load_vmstate(const char *name)
> >> /* restore the VM state */
> >> f = qemu_fopen_bdrv(bs_vm_state, 0);
> >> if (!f) {
> >> - error_report("Could not open VM state file");
> >> + error_setg(errp, "Could not open VM state file");
> >> return -EINVAL;
> >> }
> >>
> >> @@ -2293,7 +2292,7 @@ int load_vmstate(const char *name)
> >>
> >> migration_incoming_state_destroy();
> >> if (ret < 0) {
> >> - error_report("Error %d while loading VM state", ret);
> >> + error_setg(errp, "Error %d while loading VM state", ret);
> >> return ret;
> >> }
> >>
> >> diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c
> >> index 8cced46..fdc4353 100644
> >> --- a/replay/replay-snapshot.c
> >> +++ b/replay/replay-snapshot.c
> >> @@ -62,14 +62,16 @@ void replay_vmstate_register(void)
> >>
> >> void replay_vmstate_init(void)
> >> {
> >> + Error *err = NULL;
> >> +
> >> if (replay_snapshot) {
> >> if (replay_mode == REPLAY_MODE_RECORD) {
> >> - if (save_vmstate(replay_snapshot) != 0) {
> >> + if (save_vmstate(replay_snapshot, &err) != 0) {
> >> error_report("Could not create snapshot for icount record");
> >> exit(1);
> >> }
> >> } else if (replay_mode == REPLAY_MODE_PLAY) {
> >> - if (load_vmstate(replay_snapshot) != 0) {
> >> + if (load_vmstate(replay_snapshot, &err) != 0) {
> >> error_report("Could not load snapshot for icount replay");
> >> exit(1);
> >> }
> >
> > How do either of the contents of the 'err' get reported - they're not
> > printed at all are they?
> > (I don't like error_abort, I'd rather see the other message as well).
>
> I guess you mean &error_fatal.
>
> Consider error_report_err().
Yes, thanks.
Dave
> >
> > Dave
> >
> >> diff --git a/vl.c b/vl.c
> >> index 0b4ed52..8b3ec2e 100644
> >> --- a/vl.c
> >> +++ b/vl.c
> >> @@ -4681,7 +4681,9 @@ int main(int argc, char **argv, char **envp)
> >> if (replay_mode != REPLAY_MODE_NONE) {
> >> replay_vmstate_init();
> >> } else if (loadvm) {
> >> - if (load_vmstate(loadvm) < 0) {
> >> + Error *local_err = NULL;
> >> + if (load_vmstate(loadvm, &local_err) < 0) {
> >> + error_report_err(local_err);
> >> autostart = 0;
> >> }
> >> }
> >> --
> >> 2.9.3
> >>
> >>
> > --
> > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2017-04-28 16:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-25 10:24 [Qemu-devel] [PATCH 0/6] Move snapshots commands to hmp Juan Quintela
2017-04-25 10:24 ` [Qemu-devel] [PATCH 1/6] monitor: Remove monitor parameter from save_vmstate Juan Quintela
2017-04-25 13:27 ` Laurent Vivier
2017-04-25 10:24 ` [Qemu-devel] [PATCH 2/6] monitor: Move hmp_loadvm from monitor.c to hmp.c Juan Quintela
2017-04-25 13:37 ` Laurent Vivier
2017-04-25 10:24 ` [Qemu-devel] [PATCH 3/6] monitor: Move hmp_savevm from savevm.c " Juan Quintela
2017-04-25 13:33 ` Laurent Vivier
2017-04-25 10:24 ` [Qemu-devel] [PATCH 4/6] monitor: Move hmp_delvm " Juan Quintela
2017-04-25 13:34 ` Laurent Vivier
2017-04-25 10:24 ` [Qemu-devel] [PATCH 5/6] monitor: Move hmp_info_snapshots " Juan Quintela
2017-04-25 14:15 ` Laurent Vivier
2017-04-25 16:48 ` Juan Quintela
2017-04-25 10:24 ` [Qemu-devel] [PATCH 6/6] migration: Pass Error ** argument to {save, load}_vmstate Juan Quintela
2017-04-25 15:21 ` Laurent Vivier
2017-04-25 17:00 ` Juan Quintela
2017-04-25 17:10 ` Laurent Vivier
2017-04-25 17:31 ` Juan Quintela
2017-04-28 14:47 ` Dr. David Alan Gilbert
2017-04-28 15:19 ` Markus Armbruster
2017-04-28 16:13 ` Dr. David Alan Gilbert [this message]
2017-04-28 15:20 ` Eric Blake
2017-04-28 15:07 ` [Qemu-devel] [PATCH 0/6] Move snapshots commands to hmp Dr. David Alan Gilbert
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=20170428161347.GD3276@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=lvivier@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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.