diff options
author | Daniel P. Berrangé <berrange@redhat.com> | 2021-02-04 12:48:30 +0000 |
---|---|---|
committer | Dr. David Alan Gilbert <dgilbert@redhat.com> | 2021-02-08 11:19:51 +0000 |
commit | f1a9fcdd0197ed5ecfee187f8834e7b609d596a6 (patch) | |
tree | af7050ecb39c04c7d7af0abe19c49d6610fa5d0a /migration | |
parent | f781f84189e3e325da0b0c6a241b77d54b7ea26c (diff) |
migration: wire up support for snapshot device selection
Modify load_snapshot/save_snapshot to accept the device list and vmstate
node name parameters previously added to the block layer.
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20210204124834.774401-9-berrange@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration')
-rw-r--r-- | migration/savevm.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/migration/savevm.c b/migration/savevm.c index 0ae8e4798c..0b27a8c55a 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -43,6 +43,8 @@ #include "qapi/error.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qmp/json-writer.h" +#include "qapi/clone-visitor.h" +#include "qapi/qapi-builtin-visit.h" #include "qapi/qmp/qerror.h" #include "qemu/error-report.h" #include "sysemu/cpus.h" @@ -2764,7 +2766,8 @@ int qemu_load_device_state(QEMUFile *f) return 0; } -bool save_snapshot(const char *name, bool overwrite, Error **errp) +bool save_snapshot(const char *name, bool overwrite, const char *vmstate, + bool has_devices, strList *devices, Error **errp) { BlockDriverState *bs; QEMUSnapshotInfo sn1, *sn = &sn1; @@ -2786,18 +2789,19 @@ bool save_snapshot(const char *name, bool overwrite, Error **errp) return false; } - if (!bdrv_all_can_snapshot(false, NULL, errp)) { + if (!bdrv_all_can_snapshot(has_devices, devices, errp)) { return false; } /* Delete old snapshots of the same name */ if (name) { if (overwrite) { - if (bdrv_all_delete_snapshot(name, false, NULL, errp) < 0) { + if (bdrv_all_delete_snapshot(name, has_devices, + devices, errp) < 0) { return false; } } else { - ret2 = bdrv_all_has_snapshot(name, false, NULL, errp); + ret2 = bdrv_all_has_snapshot(name, has_devices, devices, errp); if (ret2 < 0) { return false; } @@ -2810,7 +2814,7 @@ bool save_snapshot(const char *name, bool overwrite, Error **errp) } } - bs = bdrv_all_find_vmstate_bs(NULL, false, NULL, errp); + bs = bdrv_all_find_vmstate_bs(vmstate, has_devices, devices, errp); if (bs == NULL) { return false; } @@ -2875,9 +2879,10 @@ bool save_snapshot(const char *name, bool overwrite, Error **errp) aio_context_release(aio_context); aio_context = NULL; - ret = bdrv_all_create_snapshot(sn, bs, vm_state_size, false, NULL, errp); + ret = bdrv_all_create_snapshot(sn, bs, vm_state_size, + has_devices, devices, errp); if (ret < 0) { - bdrv_all_delete_snapshot(sn->name, false, NULL, NULL); + bdrv_all_delete_snapshot(sn->name, has_devices, devices, NULL); goto the_end; } @@ -2978,7 +2983,8 @@ void qmp_xen_load_devices_state(const char *filename, Error **errp) migration_incoming_state_destroy(); } -bool load_snapshot(const char *name, Error **errp) +bool load_snapshot(const char *name, const char *vmstate, + bool has_devices, strList *devices, Error **errp) { BlockDriverState *bs_vm_state; QEMUSnapshotInfo sn; @@ -2987,10 +2993,10 @@ bool load_snapshot(const char *name, Error **errp) AioContext *aio_context; MigrationIncomingState *mis = migration_incoming_get_current(); - if (!bdrv_all_can_snapshot(false, NULL, errp)) { + if (!bdrv_all_can_snapshot(has_devices, devices, errp)) { return false; } - ret = bdrv_all_has_snapshot(name, false, NULL, errp); + ret = bdrv_all_has_snapshot(name, has_devices, devices, errp); if (ret < 0) { return false; } @@ -3000,7 +3006,7 @@ bool load_snapshot(const char *name, Error **errp) return false; } - bs_vm_state = bdrv_all_find_vmstate_bs(NULL, false, NULL, errp); + bs_vm_state = bdrv_all_find_vmstate_bs(vmstate, has_devices, devices, errp); if (!bs_vm_state) { return false; } @@ -3027,7 +3033,7 @@ bool load_snapshot(const char *name, Error **errp) /* Flush all IO requests so they don't interfere with the new state. */ bdrv_drain_all_begin(); - ret = bdrv_all_goto_snapshot(name, false, NULL, errp); + ret = bdrv_all_goto_snapshot(name, has_devices, devices, errp); if (ret < 0) { goto err_drain; } |