From: "Denis V. Lunev" <den@openvz.org>
Cc: Kevin Wolf <kwolf@redhat.com>,
Juan Quintela <quintela@redhat.com>,
qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
Amit Shah <amit.shah@redhat.com>,
"Denis V. Lunev" <den@openvz.org>
Subject: [Qemu-devel] [PATCH 7/8] migration, qmp: add optional argument to specify BDS to save VM state to
Date: Thu, 14 Jan 2016 14:29:00 +0300 [thread overview]
Message-ID: <1452770941-21582-8-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1452770941-21582-1-git-send-email-den@openvz.org>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Juan Quintela <quintela@redhat.com>
CC: Amit Shah <amit.shah@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>
CC: Eric Blake <eblake@redhat.com>
---
block/snapshot.c | 40 ++++++++++++++++++++++++++++++++++++++--
hmp.c | 2 +-
include/block/snapshot.h | 2 +-
migration/savevm.c | 11 ++++++-----
qapi-schema.json | 3 ++-
qmp-commands.hx | 6 ++++--
6 files changed, 52 insertions(+), 12 deletions(-)
diff --git a/block/snapshot.c b/block/snapshot.c
index 77affbc..237a015 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -25,6 +25,7 @@
#include "block/snapshot.h"
#include "block/block_int.h"
#include "qapi/qmp/qerror.h"
+#include "sysemu/block-backend.h"
QemuOptsList internal_snapshot_opts = {
.name = "snapshot",
@@ -475,18 +476,53 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
return err;
}
-BlockDriverState *bdrv_all_find_vmstate_bs(void)
+
+BlockDriverState *bdrv_all_find_vmstate_bs(const char *device, Error **errp)
{
bool not_found = true;
BlockDriverState *bs = NULL;
+ AioContext *ctx;
+
+ if (device != NULL) {
+ BlockBackend *blk = blk_by_name(device);
+ bool can_snapshot;
+
+ if (blk == NULL) {
+ error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
+ "Device '%s' not found", device);
+ return NULL;
+ }
+ bs = blk_bs(blk);
+ if (bs == NULL) {
+ error_setg(errp, "Device '%s' does not have block driver attached",
+ device);
+ return NULL;
+ }
+
+ ctx = bdrv_get_aio_context(bs);
+
+ aio_context_acquire(ctx);
+ can_snapshot = bdrv_can_snapshot(bs);
+ aio_context_release(ctx);
+
+ if (!can_snapshot) {
+ error_setg(errp, "Device '%s' does not support snapshots", device);
+ return NULL;
+ }
+ return bs;
+ }
while (not_found && (bs = bdrv_next(bs))) {
- AioContext *ctx = bdrv_get_aio_context(bs);
+ ctx = bdrv_get_aio_context(bs);
aio_context_acquire(ctx);
not_found = !bdrv_can_snapshot(bs);
aio_context_release(ctx);
}
+
+ if (bs == NULL) {
+ error_setg(errp, "No block device can accept snapshots");
+ }
return bs;
}
diff --git a/hmp.c b/hmp.c
index f65bbe7..2c6a9a0 100644
--- a/hmp.c
+++ b/hmp.c
@@ -2405,7 +2405,7 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
name = name_buf;
}
- qmp_savevm(name, &local_err);
+ qmp_savevm(name, false, NULL, &local_err);
if (local_err != NULL) {
error_report_err(local_err);
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index a8506e9..a2caca9 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -91,7 +91,7 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
uint64_t vm_state_size,
BlockDriverState **first_bad_bs);
-BlockDriverState *bdrv_all_find_vmstate_bs(void);
+BlockDriverState *bdrv_all_find_vmstate_bs(const char *device, Error **errp);
BlockDriverState *bdrv_all_validate_snapshot(const char *name, Error **errp);
#endif
diff --git a/migration/savevm.c b/migration/savevm.c
index fed8664..16ff92a 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1905,7 +1905,8 @@ int qemu_loadvm_state(QEMUFile *f)
return ret;
}
-void qmp_savevm(const char *name, Error **errp)
+void qmp_savevm(const char *name, bool has_device, const char *device,
+ Error **errp)
{
BlockDriverState *bs, *bs1;
QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
@@ -1932,9 +1933,8 @@ void qmp_savevm(const char *name, Error **errp)
return;
}
- bs = bdrv_all_find_vmstate_bs();
+ bs = bdrv_all_find_vmstate_bs(has_device ? device : NULL, errp);
if (bs == NULL) {
- error_setg(errp, "No block device can accept snapshots");
return;
}
aio_context = bdrv_get_aio_context(bs);
@@ -2097,10 +2097,11 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
int total;
int *available_snapshots;
AioContext *aio_context;
+ Error *local_err = NULL;
- bs = bdrv_all_find_vmstate_bs();
+ bs = bdrv_all_find_vmstate_bs(NULL, &local_err);
if (!bs) {
- monitor_printf(mon, "No available block device supports snapshots\n");
+ error_report_err(local_err);
return;
}
aio_context = bdrv_get_aio_context(bs);
diff --git a/qapi-schema.json b/qapi-schema.json
index 7d48948..cd6d97f 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -4061,12 +4061,13 @@
# Save a VM snapshot. Old snapshot with the same name will be deleted if exists.
#
# @name: identifier of a snapshot to be created
+# @device: #optional device name to save VM state to
#
# Returns: Nothing on success
#
# Since 2.6
##
-{ 'command': 'savevm', 'data': {'name': 'str'} }
+{ 'command': 'savevm', 'data': {'name': 'str', '*device': 'str'} }
##
# @delvm
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 9cd1bfe..9133f2c 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -4807,17 +4807,19 @@ Save a VM snapshot. Old snapshot with the same name will be deleted if exists.
Arguments:
- "name": snapshot name
+- "device": block device name
Example:
--> { "execute": "savevm", "arguments": { "name": "snapshot1" } }
+-> { "execute": "savevm",
+ "arguments": { "name": "snapshot1", "device": "ide1-hd0" } }
<- { "return": {} }
EQMP
{
.name = "savevm",
- .args_type = "name:s",
+ .args_type = "name:s,device:s?",
.mhandler.cmd_new = qmp_marshal_savevm,
},
--
2.5.0
next prev parent reply other threads:[~2016-01-14 11:29 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-14 11:28 [Qemu-devel] [PATCH v5 0/8] QMP wrappers for VM snapshot operations Denis V. Lunev
2016-01-14 11:28 ` [Qemu-devel] [PATCH 1/8] migration: split hmp_savevm to migrate_savevm and hmp_savevm wrapper Denis V. Lunev
2016-01-18 15:47 ` Markus Armbruster
2016-01-18 16:00 ` Denis V. Lunev
2016-01-14 11:28 ` [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command Denis V. Lunev
2016-01-18 15:58 ` Markus Armbruster
2016-01-18 16:10 ` Denis V. Lunev
2016-01-19 18:11 ` Markus Armbruster
2016-01-22 8:01 ` Denis V. Lunev
2016-01-22 15:31 ` Markus Armbruster
2016-01-22 16:20 ` Denis V. Lunev
2016-01-26 12:56 ` Peter Krempa
2016-01-26 12:39 ` Peter Krempa
2016-01-14 11:28 ` [Qemu-devel] [PATCH 3/8] qmp: create qmp_delvm command Denis V. Lunev
2016-01-14 11:28 ` [Qemu-devel] [PATCH 4/8] migration: improve error reporting for load_vmstate Denis V. Lunev
2016-01-14 11:28 ` [Qemu-devel] [PATCH 5/8] qmp: create QMP implementation of loadvm command Denis V. Lunev
2016-01-14 11:28 ` [Qemu-devel] [PATCH 6/8] migration, block: better select BDS for VM state loading Denis V. Lunev
2016-05-07 10:45 ` Denis V. Lunev
2016-01-14 11:29 ` Denis V. Lunev [this message]
2016-01-14 11:29 ` [Qemu-devel] [PATCH 8/8] block: allow to skip block driver in selection of one for VM state saving Denis V. Lunev
2016-01-18 9:19 ` [Qemu-devel] [PATCH v6 " Denis V. Lunev
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=1452770941-21582-8-git-send-email-den@openvz.org \
--to=den@openvz.org \
--cc=amit.shah@redhat.com \
--cc=armbru@redhat.com \
--cc=kwolf@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).