[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 22/27] migration: control whether snapshots are ovewritten
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PULL 22/27] migration: control whether snapshots are ovewritten |
Date: |
Thu, 4 Feb 2021 16:39:54 +0000 |
From: Daniel P. Berrangé <berrange@redhat.com>
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>
Message-Id: <20210204124834.774401-8-berrange@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@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 a2a842d067..0ae8e4798c 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2764,7 +2764,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;
@@ -2792,8 +2792,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 f795261f77..1fff33f14a 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1149,7 +1149,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
- [PULL 11/27] migration: Clean up signed vs. unsigned XBZRLE cache-size, (continued)
- [PULL 11/27] migration: Clean up signed vs. unsigned XBZRLE cache-size, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 12/27] migration: Fix cache_init()'s "Failed to allocate" error messages, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 13/27] migration: Fix a few absurdly defective error messages, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 14/27] migration: Add blocker information, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 15/27] migration: Display the migration blockers, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 16/27] block: push error reporting into bdrv_all_*_snapshot functions, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 17/27] migration: Make save_snapshot() return bool, not 0/-1, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 18/27] migration: stop returning errno from load_snapshot(), Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 19/27] block: add ability to specify list of blockdevs during snapshot, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 20/27] block: allow specifying name of block device for vmstate storage, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 22/27] migration: control whether snapshots are ovewritten,
Dr. David Alan Gilbert (git) <=
- [PULL 23/27] migration: wire up support for snapshot device selection, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 21/27] block: rename and alter bdrv_all_find_snapshot semantics, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 25/27] iotests: add support for capturing and matching QMP events, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 26/27] iotests: fix loading of common.config from tests/ subdir, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 24/27] migration: introduce a delete_snapshot wrapper, Dr. David Alan Gilbert (git), 2021/02/04
- [PULL 27/27] migration: introduce snapshot-{save, load, delete} QMP commands, Dr. David Alan Gilbert (git), 2021/02/04
- Re: [PULL 00/27] migration queue, Peter Maydell, 2021/02/04
- [PULL 00/27] migration queue, Dr. David Alan Gilbert (git), 2021/02/08