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>
/**
* 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.
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;
/* 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;
+ }
}
}
{
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);
}
*/
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. */
}
}
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);