This is an incremental step in converting vmstate loading code to report via Error objects instead of printing directly to the console/monitor.
Signed-off-by: Daniel P. Berrangé <berra...@redhat.com> --- migration/savevm.c | 87 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 23 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index 350d5a315a..450c36994f 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2223,34 +2223,37 @@ static int loadvm_process_enable_colo(MigrationIncomingState *mis) * Process an incoming 'QEMU_VM_COMMAND' * 0 just a normal return * LOADVM_QUIT All good, but exit the loop - * <0 Error + * -1 Error */ -static int loadvm_process_command(QEMUFile *f) +static int loadvm_process_command(QEMUFile *f, Error **errp) { MigrationIncomingState *mis = migration_incoming_get_current(); uint16_t cmd; uint16_t len; uint32_t tmp32; + int ret; cmd = qemu_get_be16(f); len = qemu_get_be16(f); /* Check validity before continue processing of cmds */ if (qemu_file_get_error(f)) { - return qemu_file_get_error(f); + error_setg(errp, "device state stream has error: %d", + qemu_file_get_error(f)); + return -1; } trace_loadvm_process_command(cmd, len); if (cmd >= MIG_CMD_MAX || cmd == MIG_CMD_INVALID) { - error_report("MIG_CMD 0x%x unknown (len 0x%x)", cmd, len); - return -EINVAL; + error_setg(errp, "MIG_CMD 0x%x unknown (len 0x%x)", cmd, len); + return -1; } if (mig_cmd_args[cmd].len != -1 && mig_cmd_args[cmd].len != len) { - error_report("%s received with bad length - expecting %zu, got %d", - mig_cmd_args[cmd].name, - (size_t)mig_cmd_args[cmd].len, len); - return -ERANGE; + error_setg(errp, "%s received with bad length - expecting %zu, got %d", + mig_cmd_args[cmd].name, + (size_t)mig_cmd_args[cmd].len, len); + return -1; } switch (cmd) { @@ -2262,7 +2265,7 @@ static int loadvm_process_command(QEMUFile *f) } mis->to_src_file = qemu_file_get_return_path(f); if (!mis->to_src_file) { - error_report("CMD_OPEN_RETURN_PATH failed"); + error_setg(errp, "CMD_OPEN_RETURN_PATH failed"); return -1; } break; @@ -2271,36 +2274,76 @@ static int loadvm_process_command(QEMUFile *f) tmp32 = qemu_get_be32(f); trace_loadvm_process_command_ping(tmp32); if (!mis->to_src_file) { - error_report("CMD_PING (0x%x) received with no return path", - tmp32); + error_setg(errp, "CMD_PING (0x%x) received with no return path", + tmp32); return -1; } migrate_send_rp_pong(mis, tmp32); break; case MIG_CMD_PACKAGED: - return loadvm_handle_cmd_packaged(mis); + ret = loadvm_handle_cmd_packaged(mis); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_POSTCOPY_ADVISE: - return loadvm_postcopy_handle_advise(mis, len); + ret = loadvm_postcopy_handle_advise(mis, len); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_POSTCOPY_LISTEN: - return loadvm_postcopy_handle_listen(mis); + ret = loadvm_postcopy_handle_listen(mis); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_POSTCOPY_RUN: - return loadvm_postcopy_handle_run(mis); + ret = loadvm_postcopy_handle_run(mis); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_POSTCOPY_RAM_DISCARD: - return loadvm_postcopy_ram_handle_discard(mis, len); + ret = loadvm_postcopy_ram_handle_discard(mis, len); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_POSTCOPY_RESUME: - return loadvm_postcopy_handle_resume(mis); + ret = loadvm_postcopy_handle_resume(mis); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_RECV_BITMAP: - return loadvm_handle_recv_bitmap(mis, len); + ret = loadvm_handle_recv_bitmap(mis, len); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; case MIG_CMD_ENABLE_COLO: - return loadvm_process_enable_colo(mis); + ret = loadvm_process_enable_colo(mis); + if (ret < 0) { + error_setg(errp, "Failed to load device state command: %d", ret); + return -1; + } + return ret; } return 0; @@ -2618,11 +2661,9 @@ retry: } break; case QEMU_VM_COMMAND: - ret = loadvm_process_command(f); + ret = loadvm_process_command(f, errp); trace_qemu_loadvm_state_section_command(ret); if (ret < 0) { - error_setg(errp, - "Failed to load device state command: %d", ret); goto out; } if (ret == LOADVM_QUIT) { -- 2.29.2