From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48094) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4rbN-0007z3-Ck for qemu-devel@nongnu.org; Fri, 04 Dec 2015 09:44:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a4rbM-0002b3-9l for qemu-devel@nongnu.org; Fri, 04 Dec 2015 09:44:49 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:34222 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a4rbL-0002as-Rp for qemu-devel@nongnu.org; Fri, 04 Dec 2015 09:44:48 -0500 From: "Denis V. Lunev" Date: Fri, 4 Dec 2015 17:44:35 +0300 Message-Id: <1449240275-26196-6-git-send-email-den@openvz.org> In-Reply-To: <1449240275-26196-1-git-send-email-den@openvz.org> References: <1449240275-26196-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 5/5] qmp: create QMP implementation of loadvm command List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: quintela@redhat.com, qemu-devel@nongnu.org, Markus Armbruster , Amit Shah , "Denis V. Lunev" 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 CC: Juan Quintela CC: Amit Shah CC: Markus Armbruster CC: Eric Blake --- 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