@samitouri / QOSamiQemu / commits / aed0c8ca9c

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) {