On Tue, Aug 5, 2025 at 10:29 PM Arun Menon <armenon@redhat.com> wrote:
> This is an incremental step in converting vmstate loading
> code to report error via Error objects instead of directly
> printing it to console/monitor.
> It is ensured that qemu_loadvm_section_part_end() must report an error
> in errp, in case of failure.
>
> Signed-off-by: Arun Menon <armenon@redhat.com>
>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> migration/savevm.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/migration/savevm.c b/migration/savevm.c
> index
> e337e3c61e7627f09b853bf5e9b845c38cb5f082..1b93df7894dd332aea25da91e24d02fa16e73363
> 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -2804,8 +2804,9 @@ qemu_loadvm_section_start_full(QEMUFile *f, uint8_t
> type, Error **errp)
> }
>
> static int
> -qemu_loadvm_section_part_end(QEMUFile *f, uint8_t type)
> +qemu_loadvm_section_part_end(QEMUFile *f, uint8_t type, Error **errp)
> {
> + ERRP_GUARD();
> bool trace_downtime = (type == QEMU_VM_SECTION_END);
> int64_t start_ts, end_ts;
> uint32_t section_id;
> @@ -2816,8 +2817,7 @@ qemu_loadvm_section_part_end(QEMUFile *f, uint8_t
> type)
>
> ret = qemu_file_get_error(f);
> if (ret) {
> - error_report("%s: Failed to read section ID: %d",
> - __func__, ret);
> + error_setg(errp, "Failed to read section ID: %d", ret);
> return ret;
> }
>
> @@ -2828,7 +2828,7 @@ qemu_loadvm_section_part_end(QEMUFile *f, uint8_t
> type)
> }
> }
> if (se == NULL) {
> - error_report("Unknown savevm section %d", section_id);
> + error_setg(errp, "Unknown savevm section %d", section_id);
> return -EINVAL;
> }
>
> @@ -2836,10 +2836,10 @@ qemu_loadvm_section_part_end(QEMUFile *f, uint8_t
> type)
> start_ts = qemu_clock_get_us(QEMU_CLOCK_REALTIME);
> }
>
> - ret = vmstate_load(f, se, NULL);
> + ret = vmstate_load(f, se, errp);
> if (ret < 0) {
> - error_report("error while loading state section id %d(%s)",
> - section_id, se->idstr);
> + error_prepend(errp, "error while loading state section id %d(%s):
> ",
> + section_id, se->idstr);
> return ret;
> }
>
> @@ -2850,6 +2850,8 @@ qemu_loadvm_section_part_end(QEMUFile *f, uint8_t
> type)
> }
>
> if (!check_section_footer(f, se)) {
> + error_setg(errp, "Check section footer error, section_id: %d",
> + section_id);
> return -EINVAL;
> }
>
> @@ -3108,7 +3110,7 @@ retry:
> break;
> case QEMU_VM_SECTION_PART:
> case QEMU_VM_SECTION_END:
> - ret = qemu_loadvm_section_part_end(f, section_type);
> + ret = qemu_loadvm_section_part_end(f, section_type, errp);
> if (ret < 0) {
> goto out;
> }
> @@ -3132,9 +3134,6 @@ retry:
>
> out:
> if (ret < 0) {
> - if (*errp == NULL) {
> - error_setg(errp, "Loading VM state failed: %d", ret);
> - }
> qemu_file_set_error(f, ret);
>
> /* Cancel bitmaps incoming regardless of recovery */
>
> --
> 2.50.1
>
>