mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-03 01:34:41 +00:00
migration: control whether snapshots are ovewritten
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>
This commit is contained in:
parent
3d3e9b1f66
commit
f781f84189
|
@ -18,11 +18,12 @@
|
||||||
/**
|
/**
|
||||||
* save_snapshot: Save an internal snapshot.
|
* save_snapshot: Save an internal snapshot.
|
||||||
* @name: name of internal snapshot
|
* @name: name of internal snapshot
|
||||||
|
* @overwrite: replace existing snapshot with @name
|
||||||
* @errp: pointer to error object
|
* @errp: pointer to error object
|
||||||
* On success, return %true.
|
* On success, return %true.
|
||||||
* On failure, store an error through @errp and return %false.
|
* 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.
|
* load_snapshot: Load an internal snapshot.
|
||||||
|
|
|
@ -2764,7 +2764,7 @@ int qemu_load_device_state(QEMUFile *f)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool save_snapshot(const char *name, Error **errp)
|
bool save_snapshot(const char *name, bool overwrite, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
QEMUSnapshotInfo sn1, *sn = &sn1;
|
QEMUSnapshotInfo sn1, *sn = &sn1;
|
||||||
|
@ -2792,8 +2792,21 @@ bool save_snapshot(const char *name, Error **errp)
|
||||||
|
|
||||||
/* Delete old snapshots of the same name */
|
/* Delete old snapshots of the same name */
|
||||||
if (name) {
|
if (name) {
|
||||||
if (bdrv_all_delete_snapshot(name, false, NULL, errp) < 0) {
|
if (overwrite) {
|
||||||
return false;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1149,7 +1149,7 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
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);
|
hmp_handle_error(mon, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -327,7 +327,7 @@ void replay_gdb_attached(void)
|
||||||
*/
|
*/
|
||||||
if (replay_mode == REPLAY_MODE_PLAY
|
if (replay_mode == REPLAY_MODE_PLAY
|
||||||
&& !replay_snapshot) {
|
&& !replay_snapshot) {
|
||||||
if (!save_snapshot("start_debugging", NULL)) {
|
if (!save_snapshot("start_debugging", true, NULL)) {
|
||||||
/* Can't create the snapshot. Continue conventional debugging. */
|
/* Can't create the snapshot. Continue conventional debugging. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ void replay_vmstate_init(void)
|
||||||
|
|
||||||
if (replay_snapshot) {
|
if (replay_snapshot) {
|
||||||
if (replay_mode == REPLAY_MODE_RECORD) {
|
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_err(err);
|
||||||
error_report("Could not create snapshot for icount record");
|
error_report("Could not create snapshot for icount record");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
Loading…
Reference in a new issue