[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 07/11] migration: control whether snapshots are ovewritten
From: |
Daniel P . Berrangé |
Subject: |
[PATCH v7 07/11] migration: control whether snapshots are ovewritten |
Date: |
Wed, 21 Oct 2020 17:27:00 +0100 |
The traditional HMP "savevm" command will overwrite an existing snapshot
if it already exists with the requested name. This new flag allows this
to be controlled allowing for safer behaviour with a future QMP command.
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
include/migration/snapshot.h | 3 ++-
migration/savevm.c | 19 ++++++++++++++++---
monitor/hmp-cmds.c | 2 +-
replay/replay-debugging.c | 2 +-
replay/replay-snapshot.c | 2 +-
5 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h
index d7d210820c..d8c22d343c 100644
--- a/include/migration/snapshot.h
+++ b/include/migration/snapshot.h
@@ -18,11 +18,12 @@
/**
* save_snapshot: Save an internal snapshot.
* @name: name of internal snapshot
+ * @overwrite: replace existing snapshot with @name
* @errp: pointer to error object
* On success, return %true.
* On failure, store an error through @errp and return %false.
*/
-bool save_snapshot(const char *name, Error **errp);
+bool save_snapshot(const char *name, bool overwrite, Error **errp);
/**
* load_snapshot: Load an internal snapshot.
diff --git a/migration/savevm.c b/migration/savevm.c
index d20244d898..4f194e95cc 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2658,7 +2658,7 @@ int qemu_load_device_state(QEMUFile *f)
return 0;
}
-bool save_snapshot(const char *name, Error **errp)
+bool save_snapshot(const char *name, bool overwrite, Error **errp)
{
BlockDriverState *bs;
QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
@@ -2686,8 +2686,21 @@ bool save_snapshot(const char *name, Error **errp)
/* Delete old snapshots of the same name */
if (name) {
- if (bdrv_all_delete_snapshot(name, false, NULL, errp) < 0) {
- return false;
+ if (overwrite) {
+ if (bdrv_all_delete_snapshot(name, false, NULL, errp) < 0) {
+ return false;
+ }
+ } else {
+ ret2 = bdrv_all_has_snapshot(name, false, NULL, errp);
+ if (ret2 < 0) {
+ return false;
+ }
+ if (ret2 == 1) {
+ error_setg(errp,
+ "Snapshot '%s' already exists in one or more
devices",
+ name);
+ return false;
+ }
}
}
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index 8fef194d80..d92398e1c8 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1133,7 +1133,7 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
- save_snapshot(qdict_get_try_str(qdict, "name"), &err);
+ save_snapshot(qdict_get_try_str(qdict, "name"), true, &err);
hmp_handle_error(mon, err);
}
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
index 0082da52f6..2d21711fc2 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -331,7 +331,7 @@ void replay_gdb_attached(void)
*/
if (replay_mode == REPLAY_MODE_PLAY
&& !replay_snapshot) {
- if (!save_snapshot("start_debugging", NULL)) {
+ if (!save_snapshot("start_debugging", true, NULL)) {
/* Can't create the snapshot. Continue conventional debugging. */
}
}
diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c
index b289365937..31c5a8702b 100644
--- a/replay/replay-snapshot.c
+++ b/replay/replay-snapshot.c
@@ -77,7 +77,7 @@ void replay_vmstate_init(void)
if (replay_snapshot) {
if (replay_mode == REPLAY_MODE_RECORD) {
- if (!save_snapshot(replay_snapshot, &err)) {
+ if (!save_snapshot(replay_snapshot, true, &err)) {
error_report_err(err);
error_report("Could not create snapshot for icount record");
exit(1);
--
2.26.2
- [PATCH v7 00/11] migration: bring improved savevm/loadvm/delvm to QMP, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 01/11] block: push error reporting into bdrv_all_*_snapshot functions, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 02/11] migration: Make save_snapshot() return bool, not 0/-1, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 03/11] migration: stop returning errno from load_snapshot(), Daniel P . Berrangé, 2020/10/21
- [PATCH v7 04/11] block: add ability to specify list of blockdevs during snapshot, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 05/11] block: allow specifying name of block device for vmstate storage, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 06/11] block: rename and alter bdrv_all_find_snapshot semantics, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 07/11] migration: control whether snapshots are ovewritten,
Daniel P . Berrangé <=
- [PATCH v7 08/11] migration: wire up support for snapshot device selection, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 09/11] migration: introduce a delete_snapshot wrapper, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 10/11] iotests: add support for capturing and matching QMP events, Daniel P . Berrangé, 2020/10/21
- [PATCH v7 11/11] migration: introduce snapshot-{save, load, delete} QMP commands, Daniel P . Berrangé, 2020/10/21