From: Vladimir Sementsov-Ogievskiy Date: Wed, 4 Mar 2026 21:22:56 +0000 (+0300) Subject: migration: VMStateInfo: introduce new handlers with errp X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ebdc4e5cb45c3cb988194206beb44ffa6fafb2f;p=thirdparty%2Fqemu.git migration: VMStateInfo: introduce new handlers with errp Add new APIs with errp, to allow handlers report good error messages. We'll convert existing handlers soon. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Peter Xu Link: https://lore.kernel.org/qemu-devel/20260304212303.667141-13-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas --- diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 9d42cf7a64d..65683d8d878 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -32,12 +32,16 @@ typedef struct VMStateInfo VMStateInfo; typedef struct VMStateField VMStateField; -/* VMStateInfo allows customized migration of objects that don't fit in +/* + * VMStateInfo allows customized migration of objects that don't fit in * any category in VMStateFlags. Additional information is always passed - * into get and put in terms of field and vmdesc parameters. However + * into load and save in terms of field and vmdesc parameters. However * these two parameters should only be used in cases when customized * handling is needed, such as QTAILQ. For primitive data types such as - * integer, field and vmdesc parameters should be ignored inside get/put. + * integer, field and vmdesc parameters should be ignored inside load/save. + * + * @get and @put are deprecated copies of @load and @save. For new interfaces + * use @load and @save. */ struct VMStateInfo { const char *name; @@ -46,6 +50,13 @@ struct VMStateInfo { int coroutine_mixed_fn (*put)(QEMUFile *f, void *pv, size_t size, const VMStateField *field, JSONWriter *vmdesc); + bool coroutine_mixed_fn (*load)(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, + Error **errp); + bool coroutine_mixed_fn (*save)(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, + JSONWriter *vmdesc, + Error **errp); }; enum VMStateFlags { diff --git a/migration/vmstate.c b/migration/vmstate.c index 8825aa3b1f1..f16626d7d11 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -170,6 +170,8 @@ static bool vmstate_load_field(QEMUFile *f, void *pv, size_t size, } else if (field->flags & VMS_VSTRUCT) { return vmstate_load_state(f, field->vmsd, pv, field->struct_version_id, errp) >= 0; + } else if (field->info->load) { + return field->info->load(f, pv, size, field, errp); } if (field->info->get(f, pv, size, field) < 0) { @@ -495,6 +497,8 @@ static bool vmstate_save_field(QEMUFile *f, void *pv, size_t size, return vmstate_save_state_v(f, field->vmsd, pv, vmdesc, field->struct_version_id, errp) >= 0; + } else if (field->info->save) { + return field->info->save(f, pv, size, field, vmdesc, errp); } if (field->info->put(f, pv, size, field, vmdesc) < 0) {