return se->ops && se->ops->save_setup;
}
-int qemu_save_device_state(QEMUFile *f)
+int qemu_save_device_state(QEMUFile *f, Error **errp)
{
- Error *local_err = NULL;
- SaveStateEntry *se;
-
- cpu_synchronize_all_states();
+ int ret;
- QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
- int ret;
+ /* Both COLO and Xen never use vmdesc, hence NULL. */
+ ret = qemu_savevm_state_non_iterable_early(f, NULL, errp);
+ if (ret) {
+ return ret;
+ }
- ret = vmstate_save(f, se, NULL, &local_err);
- if (ret) {
- error_report_err(local_err);
- return ret;
- }
+ ret = qemu_savevm_state_non_iterable(f, errp);
+ if (ret) {
+ return ret;
}
qemu_savevm_state_end(f);
- return qemu_file_get_error(f);
+ return 0;
}
static SaveStateEntry *find_se(const char *idstr, uint32_t instance_id)
f = qemu_file_new_output(QIO_CHANNEL(ioc));
object_unref(OBJECT(ioc));
qemu_savevm_send_header(f);
- ret = qemu_save_device_state(f);
+ ret = qemu_save_device_state(f, errp);
if (ret < 0 || qemu_fclose(f) < 0) {
- error_setg(errp, "saving Xen device state failed");
+ if (*errp == NULL) {
+ error_setg(errp, "saving Xen device state failed");
+ }
} else {
/* libxl calls the QMP command "stop" before calling
* "xen-save-devices-state" and in case of migration failure, libxl
uint64_t *start_list,
uint64_t *length_list);
void qemu_savevm_send_colo_enable(QEMUFile *f);
-int qemu_save_device_state(QEMUFile *f);
-
+int qemu_save_device_state(QEMUFile *f, Error **errp);
int qemu_loadvm_state(QEMUFile *f, Error **errp);
void qemu_loadvm_state_cleanup(MigrationIncomingState *mis);
int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis,