On 12/04/2015 07:44 AM, Denis V. Lunev wrote: > The patch adds Error ** parameter to load_vmstate call and fills error > inside. The caller after that properly reports error either through > monitor or via local stderr facility during VM start. > > This helper will be useful too for qmp_loadvm implementation. > > Signed-off-by: Denis V. Lunev <d...@openvz.org> > CC: Juan Quintela <quint...@redhat.com> > CC: Amit Shah <amit.s...@redhat.com> > CC: Markus Armbruster <arm...@redhat.com> > CC: Eric Blake <ebl...@redhat.com> > --- > include/sysemu/sysemu.h | 2 +- > migration/savevm.c | 28 ++++++++++++++++------------ > monitor.c | 6 +++++- > vl.c | 4 +++- > 4 files changed, 25 insertions(+), 15 deletions(-) >
> -int load_vmstate(const char *name) > +int load_vmstate(const char *name, Error **errp) > { > BlockDriverState *bs, *bs_vm_state; > QEMUSnapshotInfo sn; > @@ -2035,20 +2035,22 @@ int load_vmstate(const char *name) > 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.", No trailing '.' > @@ -2058,10 +2060,11 @@ int load_vmstate(const char *name) > ret = bdrv_snapshot_find(bs_vm_state, &sn, name); > aio_context_release(aio_context); > if (ret < 0) { > + error_setg_errno(errp, ret, "Snapshot '%s' not found", name); You need '-ret', since error_setg_errno() expects positive errno values. [maybe, for convenience, we should teach error_setg_errno() to handle both -EINVAL and EINVAL identically - but it would need good justification and would touch a lot of the tree, so if we do it, it would be a separate series] > 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."); According to Markus' recent cleanups, error_setg() should be a single phrase, not two sentences. You'll want the second sentence to be added with error_append_hint(): https://lists.gnu.org/archive/html/qemu-devel/2015-12/msg03508.html > return -EINVAL; > } > > @@ -2070,15 +2073,16 @@ 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'", > - ret, name, bdrv_get_device_name(bs)); > + error_setg_errno(errp, ret, -ret again > + "Error while activating snapshot '%s' on '%s'", > + name, bdrv_get_device_name(bs)); but thanks for getting rid of the weird 'error -5 while...' in the message :) > @@ -2092,7 +2096,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_errno(errp, ret, "Error while loading VM state"); -ret again > +++ b/monitor.c > @@ -1739,10 +1739,14 @@ static void hmp_loadvm(Monitor *mon, const QDict > *qdict) > { > int saved_vm_running = runstate_is_running(); > const char *name = qdict_get_str(qdict, "name"); > + Error *local_err = NULL; > > vm_stop(RUN_STATE_RESTORE_VM); > > - if (load_vmstate(name) == 0 && saved_vm_running) { > + if (load_vmstate(name, &local_err) < 0) { > + error_report_err(local_err); > + } > + if (saved_vm_running) { > vm_start(); Logic bug. You blindly fall through, and could end up attempting vm_start() even after an error, where previously it was not possible. You probably meant '} else if (saved_vm_running) {'. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature