*/
qemu_savevm_send_postcopy_listen(fb);
- ret = qemu_savevm_state_non_iterable(fb);
+ ret = qemu_savevm_state_non_iterable(fb, errp);
if (ret) {
- error_setg(errp, "Postcopy save non-iterable device states failed");
+ error_prepend(errp, "Postcopy save non-iterable states failed: ");
goto fail_closefb;
}
goto fail_with_bql;
}
- if (qemu_savevm_state_non_iterable(fb)) {
- error_setg(&local_err, "Failed to save non-iterable devices");
+ if (qemu_savevm_state_non_iterable(fb, &local_err)) {
+ error_prepend(&local_err, "Failed to save non-iterable devices ");
goto fail_with_bql;
}
qemu_savevm_state_vm_desc(s, f);
}
-int qemu_savevm_state_non_iterable(QEMUFile *f)
+int qemu_savevm_state_non_iterable(QEMUFile *f, Error **errp)
{
MigrationState *ms = migrate_get_current();
int64_t start_ts_each, end_ts_each;
JSONWriter *vmdesc = ms->vmdesc;
SaveStateEntry *se;
- Error *local_err = NULL;
int ret;
/* Making sure cpu states are synchronized before saving non-iterable */
start_ts_each = qemu_clock_get_us(QEMU_CLOCK_REALTIME);
- ret = vmstate_save(f, se, vmdesc, &local_err);
+ ret = vmstate_save(f, se, vmdesc, errp);
if (ret) {
- migrate_error_propagate(ms, error_copy(local_err));
- error_report_err(local_err);
return ret;
}
int qemu_savevm_state_complete_precopy(MigrationState *s)
{
QEMUFile *f = s->to_dst_file;
+ Error *local_err = NULL;
int ret;
ret = qemu_savevm_state_complete_precopy_iterable(f, false);
return ret;
}
- ret = qemu_savevm_state_non_iterable(f);
+ /* TODO: pass error upper */
+ ret = qemu_savevm_state_non_iterable(f, &local_err);
if (ret) {
+ migrate_error_propagate(s, error_copy(local_err));
+ error_report_err(local_err);
return ret;
}
Error **errp);
int qemu_load_device_state(QEMUFile *f, Error **errp);
int qemu_loadvm_approve_switchover(void);
-int qemu_savevm_state_non_iterable(QEMUFile *f);
+int qemu_savevm_state_non_iterable(QEMUFile *f, Error **errp);
int qemu_savevm_state_non_iterable_early(QEMUFile *f,
JSONWriter *vmdesc,
Error **errp);