migration: use qemu_file_set_error to pass error codes back to qemu_savevm_state

Reviewed-by: Orit Wasserman <owasserm@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
Paolo Bonzini 2013-02-22 17:36:13 +01:00 committed by Juan Quintela
parent 93bf21044c
commit 47c8c17af8
2 changed files with 21 additions and 29 deletions

View File

@ -73,10 +73,10 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict);
void qemu_announce_self(void); void qemu_announce_self(void);
bool qemu_savevm_state_blocked(Error **errp); bool qemu_savevm_state_blocked(Error **errp);
int qemu_savevm_state_begin(QEMUFile *f, void qemu_savevm_state_begin(QEMUFile *f,
const MigrationParams *params); const MigrationParams *params);
int qemu_savevm_state_iterate(QEMUFile *f); int qemu_savevm_state_iterate(QEMUFile *f);
int qemu_savevm_state_complete(QEMUFile *f); void qemu_savevm_state_complete(QEMUFile *f);
void qemu_savevm_state_cancel(void); void qemu_savevm_state_cancel(void);
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size); uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
int qemu_loadvm_state(QEMUFile *f); int qemu_loadvm_state(QEMUFile *f);

View File

@ -1579,7 +1579,7 @@ bool qemu_savevm_state_blocked(Error **errp)
return false; return false;
} }
int qemu_savevm_state_begin(QEMUFile *f, void qemu_savevm_state_begin(QEMUFile *f,
const MigrationParams *params) const MigrationParams *params)
{ {
SaveStateEntry *se; SaveStateEntry *se;
@ -1620,11 +1620,10 @@ int qemu_savevm_state_begin(QEMUFile *f,
ret = se->ops->save_live_setup(f, se->opaque); ret = se->ops->save_live_setup(f, se->opaque);
if (ret < 0) { if (ret < 0) {
return ret; qemu_file_set_error(f, ret);
break;
} }
} }
ret = qemu_file_get_error(f);
return ret;
} }
/* /*
@ -1658,6 +1657,9 @@ int qemu_savevm_state_iterate(QEMUFile *f)
ret = se->ops->save_live_iterate(f, se->opaque); ret = se->ops->save_live_iterate(f, se->opaque);
trace_savevm_section_end(se->section_id); trace_savevm_section_end(se->section_id);
if (ret < 0) {
qemu_file_set_error(f, ret);
}
if (ret <= 0) { if (ret <= 0) {
/* Do not proceed to the next vmstate before this one reported /* Do not proceed to the next vmstate before this one reported
completion of the current stage. This serializes the migration completion of the current stage. This serializes the migration
@ -1666,14 +1668,10 @@ int qemu_savevm_state_iterate(QEMUFile *f)
break; break;
} }
} }
if (ret != 0) {
return ret;
}
ret = qemu_file_get_error(f);
return ret; return ret;
} }
int qemu_savevm_state_complete(QEMUFile *f) void qemu_savevm_state_complete(QEMUFile *f)
{ {
SaveStateEntry *se; SaveStateEntry *se;
int ret; int ret;
@ -1697,7 +1695,8 @@ int qemu_savevm_state_complete(QEMUFile *f)
ret = se->ops->save_live_complete(f, se->opaque); ret = se->ops->save_live_complete(f, se->opaque);
trace_savevm_section_end(se->section_id); trace_savevm_section_end(se->section_id);
if (ret < 0) { if (ret < 0) {
return ret; qemu_file_set_error(f, ret);
return;
} }
} }
@ -1725,8 +1724,6 @@ int qemu_savevm_state_complete(QEMUFile *f)
} }
qemu_put_byte(f, QEMU_VM_EOF); qemu_put_byte(f, QEMU_VM_EOF);
return qemu_file_get_error(f);
} }
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size) uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
@ -1771,26 +1768,21 @@ static int qemu_savevm_state(QEMUFile *f)
return -EINVAL; return -EINVAL;
} }
ret = qemu_savevm_state_begin(f, &params); qemu_savevm_state_begin(f, &params);
if (ret < 0) while (qemu_file_get_error(f) == 0) {
goto out; if (qemu_savevm_state_iterate(f) > 0) {
break;
}
}
do { ret = qemu_file_get_error(f);
ret = qemu_savevm_state_iterate(f);
if (ret < 0)
goto out;
} while (ret == 0);
ret = qemu_savevm_state_complete(f);
out:
if (ret == 0) { if (ret == 0) {
qemu_savevm_state_complete(f);
ret = qemu_file_get_error(f); ret = qemu_file_get_error(f);
} }
if (ret != 0) { if (ret != 0) {
qemu_savevm_state_cancel(); qemu_savevm_state_cancel();
} }
return ret; return ret;
} }