@samitouri / QOSamiQemu / commits / 0ebdc4e5cb

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 <vsementsov@yandex-team.ru> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/qemu-devel/20260304212303.667141-13-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>

Vladimir Sementsov-Ogievskiy committed Mar 5, 2026 at 00:22 UTC 0ebdc4e5cb45c3cb988194206beb44ffa6fafb2f
2 files changed +18 -3
include/migration/vmstate.h
+14 -3
@@ -32,12 +32,16 @@
32 typedef struct VMStateInfo VMStateInfo;
33 typedef struct VMStateField VMStateField;
34
35 -/* VMStateInfo allows customized migration of objects that don't fit in
35 +/*
36 + * VMStateInfo allows customized migration of objects that don't fit in
37 * any category in VMStateFlags. Additional information is always passed
37 - * into get and put in terms of field and vmdesc parameters. However
38 + * into load and save in terms of field and vmdesc parameters. However
39 * these two parameters should only be used in cases when customized
40 * handling is needed, such as QTAILQ. For primitive data types such as
40 - * integer, field and vmdesc parameters should be ignored inside get/put.
41 + * integer, field and vmdesc parameters should be ignored inside load/save.
42 + *
43 + * @get and @put are deprecated copies of @load and @save. For new interfaces
44 + * use @load and @save.
45 */
46 struct VMStateInfo {
47 const char *name;
@@ -46,6 +50,13 @@ struct VMStateInfo {
50 int coroutine_mixed_fn (*put)(QEMUFile *f, void *pv, size_t size,
51 const VMStateField *field,
52 JSONWriter *vmdesc);
53 + bool coroutine_mixed_fn (*load)(QEMUFile *f, void *pv, size_t size,
54 + const VMStateField *field,
55 + Error **errp);
56 + bool coroutine_mixed_fn (*save)(QEMUFile *f, void *pv, size_t size,
57 + const VMStateField *field,
58 + JSONWriter *vmdesc,
59 + Error **errp);
60 };
61
62 enum VMStateFlags {
migration/vmstate.c
+4
@@ -170,6 +170,8 @@ static bool vmstate_load_field(QEMUFile *f, void *pv, size_t size,
170 } else if (field->flags & VMS_VSTRUCT) {
171 return vmstate_load_state(f, field->vmsd, pv, field->struct_version_id,
172 errp) >= 0;
173 + } else if (field->info->load) {
174 + return field->info->load(f, pv, size, field, errp);
175 }
176
177 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,
497 return vmstate_save_state_v(f, field->vmsd, pv, vmdesc,
498 field->struct_version_id,
499 errp) >= 0;
500 + } else if (field->info->save) {
501 + return field->info->save(f, pv, size, field, vmdesc, errp);
502 }
503
504 if (field->info->put(f, pv, size, field, vmdesc) < 0) {