[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 7/8] migration, qmp: add optional argument to specif
From: |
Denis V. Lunev |
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 |
Signed-off-by: Denis V. Lunev <address@hidden>
CC: Kevin Wolf <address@hidden>
CC: Juan Quintela <address@hidden>
CC: Amit Shah <address@hidden>
CC: Markus Armbruster <address@hidden>
CC: Eric Blake <address@hidden>
---
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
- [Qemu-devel] [PATCH v6 8/8] block: allow to skip block driver in selection of one for VM state saving, (continued)
- [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Denis V. Lunev, 2016/01/14
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Markus Armbruster, 2016/01/18
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Denis V. Lunev, 2016/01/18
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Markus Armbruster, 2016/01/19
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Denis V. Lunev, 2016/01/22
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Markus Armbruster, 2016/01/22
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Denis V. Lunev, 2016/01/22
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Peter Krempa, 2016/01/26
- Re: [Qemu-devel] [PATCH 2/8] qmp: create qmp_savevm command, Peter Krempa, 2016/01/26
[Qemu-devel] [PATCH 7/8] migration, qmp: add optional argument to specify BDS to save VM state to,
Denis V. Lunev <=
[Qemu-devel] [PATCH 6/8] migration, block: better select BDS for VM state loading, Denis V. Lunev, 2016/01/14