Skip to content

Commit

Permalink
migration: control whether snapshots are ovewritten
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
berrange authored and dagrh committed Feb 8, 2021
1 parent 3d3e9b1 commit f781f84
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 7 deletions.
3 changes: 2 additions & 1 deletion include/migration/snapshot.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
19 changes: 16 additions & 3 deletions migration/savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion monitor/hmp-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 1 addition & 1 deletion replay/replay-debugging.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
}
}
Expand Down
2 changes: 1 addition & 1 deletion replay/replay-snapshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f781f84

Please sign in to comment.