From nobody Sat Apr 27 22:58:48 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15269724683951015.2429732202821; Tue, 22 May 2018 00:01:08 -0700 (PDT) Received: from localhost ([::1]:53944 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fL1IB-000094-60 for importer@patchew.org; Tue, 22 May 2018 03:01:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44763) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fL1H6-000876-45 for qemu-devel@nongnu.org; Tue, 22 May 2018 03:00:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fL1H2-0008JT-4w for qemu-devel@nongnu.org; Tue, 22 May 2018 03:00:00 -0400 Received: from forward105p.mail.yandex.net ([77.88.28.108]:36747) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fL1H1-0008Fx-Kw for qemu-devel@nongnu.org; Tue, 22 May 2018 02:59:56 -0400 Received: from mxback13j.mail.yandex.net (mxback13j.mail.yandex.net [IPv6:2a02:6b8:0:1619::88]) by forward105p.mail.yandex.net (Yandex) with ESMTP id CF8DB408214A for ; Tue, 22 May 2018 09:59:51 +0300 (MSK) Received: from smtp2o.mail.yandex.net (smtp2o.mail.yandex.net [2a02:6b8:0:1a2d::26]) by mxback13j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id p9WwGi6kgH-xoEeLfnH; Tue, 22 May 2018 09:59:51 +0300 Received: by smtp2o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id 3qbJCDXpiP-xnTOxYO7; Tue, 22 May 2018 09:59:50 +0300 (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=void.so; s=mail; t=1526972391; bh=JZLXn/7Q/NLDp5AMlgvRYugs9JyISuPAcGxtDD0eOGI=; h=Date:From:To:Subject:Message-ID; b=aL4cUjYMMZMZb2MhcZnJAc17b5avfUlzos+eMZzTRo6SnjOqyAqGB3+d+LSW+c4DR xLRqWeXsz8ZGy2dLl52VQZsBupRjj/lD+GoHkjTUlNCR7+fEPOmvZXqZcvMA+BF2Gi e5RVKQICFNN8yudgG/YiinA3YDHhnDQzcYWR7ddM= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=void.so; s=mail; t=1526972390; bh=JZLXn/7Q/NLDp5AMlgvRYugs9JyISuPAcGxtDD0eOGI=; h=Date:From:To:Subject:Message-ID; b=pGlqQxwNl8wr37tvArpn5mMt2S4m//lQGNzyaUcc8PApaHA+vduQF5L5nk9N1hW1R fKcz6zPRxW+DCEQj7M41iq8i4fsIHYJf1U0V4qLUUvTSSSmlxU8UNT8AFOP+JTgZ0o 0xP8gVtztNkO2m1EKUQPmpqvUStTUGo/vfHx6F24= Authentication-Results: smtp2o.mail.yandex.net; dkim=pass header.i=@void.so Date: Tue, 22 May 2018 09:59:24 +0300 From: Pavel Balaev To: qemu-devel@nongnu.org Message-ID: <20180522065922.GA3462@rnd> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.9.5 (2018-04-13) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 77.88.28.108 Subject: [Qemu-devel] [PATCH] Add save/load/del[vm] QMP api X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hello, Now savevm, loadvm and delvm commands only allowed from hmp monitor. This patch adds ability to send them via QMP api.=20 Signed-off-by: Pavel Balaev --- hmp.c | 22 +++++++++------------- migration/savevm.c | 27 +++++++++++++++++++++++++++ qapi/misc.json | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 90 insertions(+), 13 deletions(-) diff --git a/hmp.c b/hmp.c index ef93f4878b..7ae5852c77 100644 --- a/hmp.c +++ b/hmp.c @@ -1313,37 +1313,33 @@ void hmp_snapshot_delete_blkdev_internal(Monitor *m= on, const QDict *qdict) =20 void hmp_loadvm(Monitor *mon, const QDict *qdict) { - int saved_vm_running =3D runstate_is_running(); const char *name =3D qdict_get_str(qdict, "name"); Error *err =3D NULL; =20 - vm_stop(RUN_STATE_RESTORE_VM); - - if (load_snapshot(name, &err) =3D=3D 0 && saved_vm_running) { - vm_start(); - } + qmp_loadvm(name, &err); hmp_handle_error(mon, &err); } =20 void hmp_savevm(Monitor *mon, const QDict *qdict) { Error *err =3D NULL; + bool has_name =3D TRUE; + const char *name =3D qdict_get_try_str(qdict, "name"); =20 - save_snapshot(qdict_get_try_str(qdict, "name"), &err); + if (name =3D=3D NULL) { + has_name =3D FALSE; + } + + qmp_savevm(has_name, name, &err); hmp_handle_error(mon, &err); } =20 void hmp_delvm(Monitor *mon, const QDict *qdict) { - BlockDriverState *bs; Error *err =3D NULL; const char *name =3D qdict_get_str(qdict, "name"); =20 - if (bdrv_all_delete_snapshot(name, &bs, &err) < 0) { - error_reportf_err(err, - "Error while deleting snapshot on device '%s': ", - bdrv_get_device_name(bs)); - } + qmp_delvm(name, &err); } =20 void hmp_info_snapshots(Monitor *mon, const QDict *qdict) diff --git a/migration/savevm.c b/migration/savevm.c index 4251125831..3c830ca5a4 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2515,6 +2515,33 @@ int save_snapshot(const char *name, Error **errp) return ret; } =20 +void qmp_savevm(bool has_name, const char *name, Error **errp) +{ + save_snapshot(has_name ? name : NULL, errp); +} + +void qmp_loadvm(const char *name, Error **errp) +{ + int saved_vm_running =3D runstate_is_running(); + + vm_stop(RUN_STATE_RESTORE_VM); + + if (load_snapshot(name, errp) =3D=3D 0 && saved_vm_running) { + vm_start(); + } +} + +void qmp_delvm(const char *name, Error **errp) +{ + BlockDriverState *bs; + + if (bdrv_all_delete_snapshot(name, &bs, errp) < 0) { + error_reportf_err(*errp, + "Error while deleting snapshot on device '%s': ", + bdrv_get_device_name(bs)); + } +} + void qmp_xen_save_devices_state(const char *filename, bool has_live, bool = live, Error **errp) { diff --git a/qapi/misc.json b/qapi/misc.json index f5988cc0b5..cca7df0202 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -3097,6 +3097,60 @@ { 'enum': 'ReplayMode', 'data': [ 'none', 'record', 'play' ] } =20 +## +# @savevm: +# +# Save a VM snapshot. Without a name new snapshot is created. +# +# @name: identifier of a snapshot to be saved +# +# Returns: Nothing on success +# +# Since: 2.12 +# +# Example: +# +# -> { "execute": "savevm", "arguments": { "name": "snapshot1" } } +# <- { "return": {} } +## +{ 'command': 'savevm', 'data': {'*name': 'str'} } + +## +# @loadvm: +# +# Load a VM snapshot. +# +# @name: identifier of a snapshot to be loaded +# +# Returns: Nothing on success +# +# Since: 2.12 +# +# Example: +# +# -> { "execute": "loadvm", "arguments": { "name": "snapshot1" } } +# <- { "return": {} } +## +{ 'command': 'loadvm', 'data': {'name': 'str'} } + +## +# @delvm: +# +# Delete a VM snapshot. +# +# @name: identifier of a snapshot to be deleted +# +# Returns: Nothing on success +# +# Since: 2.12 +# +# Example: +# +# -> { "execute": "delvm", "arguments": { "name": "snapshot1" } } +# <- { "return": {} } +## +{ 'command': 'delvm', 'data': {'name': 'str'} } + ## # @xen-load-devices-state: # --=20 2.16.1