From 8c3843638cbab2da66d3e9e662c03271d3a9490e Mon Sep 17 00:00:00 2001 From: Vladimir Sementsov-Ogievskiy Date: Tue, 28 Oct 2025 20:09:26 +0300 Subject: [PATCH] migration: vmsd errp handlers: return bool No code actually depend on specific errno values returned by vmstate_load_state. The only use of it is to check for success, and sometimes inject numeric error values into error messages in migration code. The latter is not a stopper for gradual conversion to "errp + bool return value" APIs. Big analysis of vmstate_load_state() callers, showing that specific errno values are not actually used, is done by Peter here: https://lore.kernel.org/qemu-devel/aQDdRn8t0B8oE3gf@x1.local/ Converting of vmstate_load_state() itself will follow in another series. Signed-off-by: Vladimir Sementsov-Ogievskiy Link: https://lore.kernel.org/r/20251028170926.77219-2-vsementsov@yandex-team.ru Signed-off-by: Peter Xu --- backends/tpm/tpm_emulator.c | 10 ++++------ docs/devel/migration/main.rst | 6 +++--- include/migration/vmstate.h | 6 +++--- migration/vmstate.c | 11 +++++------ 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/backends/tpm/tpm_emulator.c b/backends/tpm/tpm_emulator.c index da9c1056ed..f10b9074fb 100644 --- a/backends/tpm/tpm_emulator.c +++ b/backends/tpm/tpm_emulator.c @@ -962,24 +962,22 @@ static void tpm_emulator_vm_state_change(void *opaque, bool running, /* * Load the TPM state blobs into the TPM. - * - * Returns negative errno codes in case of error. */ -static int tpm_emulator_post_load(void *opaque, int version_id, Error **errp) +static bool tpm_emulator_post_load(void *opaque, int version_id, Error **errp) { TPMBackend *tb = opaque; int ret; ret = tpm_emulator_set_state_blobs(tb, errp); if (ret < 0) { - return ret; + return false; } if (tpm_emulator_startup_tpm_resume(tb, 0, true, errp) < 0) { - return -EIO; + return false; } - return 0; + return true; } static const VMStateDescription vmstate_tpm_emulator = { diff --git a/docs/devel/migration/main.rst b/docs/devel/migration/main.rst index 1afe7b9689..234d280249 100644 --- a/docs/devel/migration/main.rst +++ b/docs/devel/migration/main.rst @@ -446,15 +446,15 @@ The functions to do that are inside a vmstate definition, and are called: Following are the errp variants of these functions. -- ``int (*pre_load_errp)(void *opaque, Error **errp);`` +- ``bool (*pre_load_errp)(void *opaque, Error **errp);`` This function is called before we load the state of one device. -- ``int (*post_load_errp)(void *opaque, int version_id, Error **errp);`` +- ``bool (*post_load_errp)(void *opaque, int version_id, Error **errp);`` This function is called after we load the state of one device. -- ``int (*pre_save_errp)(void *opaque, Error **errp);`` +- ``bool (*pre_save_errp)(void *opaque, Error **errp);`` This function is called before we save the state of one device. diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 09f1eefcfb..df57e6550a 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -218,11 +218,11 @@ struct VMStateDescription { int minimum_version_id; MigrationPriority priority; int (*pre_load)(void *opaque); - int (*pre_load_errp)(void *opaque, Error **errp); + bool (*pre_load_errp)(void *opaque, Error **errp); int (*post_load)(void *opaque, int version_id); - int (*post_load_errp)(void *opaque, int version_id, Error **errp); + bool (*post_load_errp)(void *opaque, int version_id, Error **errp); int (*pre_save)(void *opaque); - int (*pre_save_errp)(void *opaque, Error **errp); + bool (*pre_save_errp)(void *opaque, Error **errp); int (*post_save)(void *opaque); bool (*needed)(void *opaque); bool (*dev_unplug_pending)(void *opaque); diff --git a/migration/vmstate.c b/migration/vmstate.c index 677e56c84a..4d28364f7b 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -154,13 +154,12 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, return -EINVAL; } if (vmsd->pre_load_errp) { - ret = vmsd->pre_load_errp(opaque, errp); - if (ret < 0) { + if (!vmsd->pre_load_errp(opaque, errp)) { error_prepend(errp, "pre load hook failed for: '%s', " "version_id: %d, minimum version_id: %d: ", vmsd->name, vmsd->version_id, vmsd->minimum_version_id); - return ret; + return -EINVAL; } } else if (vmsd->pre_load) { ret = vmsd->pre_load(opaque); @@ -256,11 +255,11 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, return ret; } if (vmsd->post_load_errp) { - ret = vmsd->post_load_errp(opaque, version_id, errp); - if (ret < 0) { + if (!vmsd->post_load_errp(opaque, version_id, errp)) { error_prepend(errp, "post load hook failed for: %s, version_id: " "%d, minimum_version: %d: ", vmsd->name, vmsd->version_id, vmsd->minimum_version_id); + ret = -EINVAL; } } else if (vmsd->post_load) { ret = vmsd->post_load(opaque, version_id); @@ -438,7 +437,7 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd, trace_vmstate_save_state_top(vmsd->name); if (vmsd->pre_save_errp) { - ret = vmsd->pre_save_errp(opaque, errp); + ret = vmsd->pre_save_errp(opaque, errp) ? 0 : -EINVAL; trace_vmstate_save_state_pre_save_res(vmsd->name, ret); if (ret < 0) { error_prepend(errp, "pre-save for %s failed: ", vmsd->name); -- 2.47.3