[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v11 07/12] migration: control whether snapshots are ovewritten
From: |
Daniel P . Berrangé |
Subject: |
[PATCH v11 07/12] migration: control whether snapshots are ovewritten |
Date: |
Thu, 4 Feb 2021 12:48:29 +0000 |
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 5cd3408dfe..a98f65c165 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2729,7 +2729,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;
@@ -2757,8 +2757,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 d382918b23..8a3387b72e 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1140,7 +1140,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 098ef8e0f5..0ae6785b3b 100644
--- a/replay/replay-debugging.c
+++ b/replay/replay-debugging.c
@@ -327,7 +327,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.29.2
- [PATCH v11 00/12] migration: bring improved savevm/loadvm/delvm to QMP, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 01/12] block: push error reporting into bdrv_all_*_snapshot functions, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 02/12] migration: Make save_snapshot() return bool, not 0/-1, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 03/12] migration: stop returning errno from load_snapshot(), Daniel P . Berrangé, 2021/02/04
- [PATCH v11 04/12] block: add ability to specify list of blockdevs during snapshot, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 05/12] block: allow specifying name of block device for vmstate storage, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 06/12] block: rename and alter bdrv_all_find_snapshot semantics, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 07/12] migration: control whether snapshots are ovewritten,
Daniel P . Berrangé <=
- [PATCH v11 09/12] migration: introduce a delete_snapshot wrapper, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 08/12] migration: wire up support for snapshot device selection, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 10/12] iotests: add support for capturing and matching QMP events, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 11/12] iotests: fix loading of common.config from tests/ subdir, Daniel P . Berrangé, 2021/02/04
- [PATCH v11 12/12] migration: introduce snapshot-{save, load, delete} QMP commands, Daniel P . Berrangé, 2021/02/04
- Re: [PATCH v11 12/12] migration: introduce snapshot-{save, load, delete} QMP commands, Dr. David Alan Gilbert, 2021/02/04
- Re: [PATCH v11 12/12] migration: introduce snapshot-{save,load,delete} QMP commands, Eric Blake, 2021/02/04
- Re: [PATCH v11 12/12] migration: introduce snapshot-{save,load,delete} QMP commands, John Snow, 2021/02/16
- Re: [PATCH v11 00/12] migration: bring improved savevm/loadvm/delvm to QMP, Dr. David Alan Gilbert, 2021/02/04