migration: factor out vmstate_save_field() from vmstate_save_state()
Simplify vmstate_save_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-8-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>
Vladimir Sementsov-Ogievskiy committed
Mar 5, 2026 at 00:22 UTC
ac8547ced7fc0ecc2ff8a0312980904e78ac7df0
1 file changed
+25
-15
migration/vmstate.c
+25
-15
@@ -26,6 +26,9 @@ static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
26
Error **errp);
27
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
28
void *opaque, Error **errp);
29
+static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
30
+ void *opaque, JSONWriter *vmdesc,
31
+ int version_id, Error **errp);
32
33
/* Whether this field should exist for either save or load the VM? */
34
static bool
@@ -455,6 +458,26 @@ static bool vmstate_pre_save(const VMStateDescription *vmsd, void *opaque,
458
return true;
459
}
460
461
+static bool vmstate_save_field(QEMUFile *f, void *pv, size_t size,
462
+ const VMStateField *field,
463
+ JSONWriter *vmdesc, Error **errp)
464
+{
465
+ if (field->flags & VMS_STRUCT) {
466
+ return vmstate_save_state(f, field->vmsd, pv, vmdesc, errp) >= 0;
467
+ } else if (field->flags & VMS_VSTRUCT) {
468
+ return vmstate_save_state_v(f, field->vmsd, pv, vmdesc,
469
+ field->struct_version_id,
470
+ errp) >= 0;
471
+ }
472
+
473
+ if (field->info->put(f, pv, size, field, vmdesc) < 0) {
474
+ error_setg(errp, "put failed");
475
+ return false;
476
+ }
477
+
478
+ return true;
479
+}
480
+
481
static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
482
void *opaque, JSONWriter *vmdesc,
483
int version_id, Error **errp)
@@ -548,21 +571,8 @@ static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
571
vmsd_desc_field_start(vmsd, vmdesc_loop, inner_field,
572
i, max_elems);
573
551
- if (inner_field->flags & VMS_STRUCT) {
552
- ret = vmstate_save_state(f, inner_field->vmsd,
553
- curr_elem, vmdesc_loop, errp);
554
- } else if (inner_field->flags & VMS_VSTRUCT) {
555
- ret = vmstate_save_state_v(f, inner_field->vmsd,
556
- curr_elem, vmdesc_loop,
557
- inner_field->struct_version_id,
558
- errp);
559
- } else {
560
- ret = inner_field->info->put(f, curr_elem, size,
561
- inner_field, vmdesc_loop);
562
- if (ret < 0) {
563
- error_setg(errp, "put failed");
564
- }
565
- }
574
+ ret = vmstate_save_field(f, curr_elem, size, inner_field,
575
+ vmdesc_loop, errp) ? 0 : -EINVAL;
576
577
written_bytes = qemu_file_transferred(f) - old_offset;
578
vmsd_desc_field_end(vmsd, vmdesc_loop, inner_field,