Unfortunately load_vmstate has a return code (int) and this code is checked in the other places. Thus we could not just rename it to qmp_loadvm as returns void.
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> --- migration/savevm.c | 12 ++++++++++++ monitor.c | 12 ++++++------ qapi-schema.json | 13 +++++++++++++ qmp-commands.hx | 23 +++++++++++++++++++++++ 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index 7846437..07b0bf4 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2103,6 +2103,18 @@ int load_vmstate(const char *name, Error **errp) return 0; } +void qmp_loadvm(const char *name, Error **errp) +{ + int saved_vm_running = runstate_is_running(); + vm_stop(RUN_STATE_RESTORE_VM); + + load_vmstate(name, errp); + + if (saved_vm_running) { + vm_start(); + } +} + void qmp_delvm(const char *name, Error **errp) { BlockDriverState *bs; diff --git a/monitor.c b/monitor.c index 3857724..aba2c62 100644 --- a/monitor.c +++ b/monitor.c @@ -1737,18 +1737,18 @@ void qmp_closefd(const char *fdname, Error **errp) 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 (name == NULL) { + monitor_printf(mon, "Snapshot name is not set for hmp_loadvm"); + return; + } - if (load_vmstate(name, &local_err) < 0) { + qmp_loadvm(name, &local_err); + if (local_err != NULL) { error_report_err(local_err); } - if (saved_vm_running) { - vm_start(); - } } int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp) diff --git a/qapi-schema.json b/qapi-schema.json index 18c9a6c..9747df8 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3997,3 +3997,16 @@ # Since 2.6 ## { 'command': 'delvm', 'data': {'name': 'str'} } + +## +# @loadvm +# +# Load a VM snapshot +# +# @name: identifier of a snapshot to be loaded +# +# Returns: Nothing on success +# +# Since 2.6 +## +{ 'command': 'loadvm', 'data': {'name': 'str'} } diff --git a/qmp-commands.hx b/qmp-commands.hx index a630e8a..4dedb62 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -4787,3 +4787,26 @@ EQMP .args_type = "name:s", .mhandler.cmd_new = qmp_marshal_delvm, }, + +SQMP +loadvm +------------------ + +Load a VM snapshot + +Arguments: + +- "name": snapshot name + +Example: + +-> { "execute": "loadvm", "arguments": { "name": "snapshot1" } } +<- { "return": {} } + +EQMP + + { + .name = "loadvm", + .args_type = "name:s", + .mhandler.cmd_new = qmp_marshal_loadvm, + }, -- 2.5.0