migration: factor out vmstate_load_field() from vmstate_load_state()
Simplify vmstate_load_state() which is rather big, and simplify further refactoring. 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-10-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>
Vladimir Sementsov-Ogievskiy committed
Mar 5, 2026 at 00:22 UTC
aed0c8ca9ccf13be226d3d779b47a23eab828733
1 file changed
+23
-18
migration/vmstate.c
+23
-18
@@ -161,6 +161,27 @@ static bool vmstate_pre_load(const VMStateDescription *vmsd, void *opaque,
161
return true;
162
}
163
164
+static bool vmstate_load_field(QEMUFile *f, void *pv, size_t size,
165
+ const VMStateField *field, Error **errp)
166
+{
167
+ if (field->flags & VMS_STRUCT) {
168
+ return vmstate_load_state(f, field->vmsd, pv, field->vmsd->version_id,
169
+ errp) >= 0;
170
+ } else if (field->flags & VMS_VSTRUCT) {
171
+ return vmstate_load_state(f, field->vmsd, pv, field->struct_version_id,
172
+ errp) >= 0;
173
+ }
174
+
175
+ if (field->info->get(f, pv, size, field) < 0) {
176
+ error_setg(errp,
177
+ "Failed to load element of type %s for %s",
178
+ field->info->name, field->name);
179
+ return false;
180
+ }
181
+
182
+ return true;
183
+}
184
+
185
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
186
void *opaque, int version_id, Error **errp)
187
{
@@ -225,24 +246,8 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
246
inner_field = field;
247
}
248
228
- if (inner_field->flags & VMS_STRUCT) {
229
- ret = vmstate_load_state(f, inner_field->vmsd, curr_elem,
230
- inner_field->vmsd->version_id,
231
- errp);
232
- } else if (inner_field->flags & VMS_VSTRUCT) {
233
- ret = vmstate_load_state(f, inner_field->vmsd, curr_elem,
234
- inner_field->struct_version_id,
235
- errp);
236
- } else {
237
- ret = inner_field->info->get(f, curr_elem, size,
238
- inner_field);
239
- if (ret < 0) {
240
- error_setg(errp,
241
- "Failed to load element of type %s for %s: "
242
- "%d", inner_field->info->name,
243
- inner_field->name, ret);
244
- }
245
- }
249
+ ret = vmstate_load_field(f, curr_elem, size, inner_field,
250
+ errp) ? 0 : -EINVAL;
251
252
/* If we used a fake temp field.. free it now */
253
if (inner_field != field) {