Simplify vmstate_load_state() which is rather big, and simplify further refactoring.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- migration/vmstate.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/migration/vmstate.c b/migration/vmstate.c index 68d5c37992..7d776ce27a 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -161,6 +161,27 @@ static bool vmstate_pre_load(const VMStateDescription *vmsd, void *opaque, return true; } +static bool vmstate_load_field(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, Error **errp) +{ + if (field->flags & VMS_STRUCT) { + return vmstate_load_state(f, field->vmsd, pv, field->vmsd->version_id, + errp) >= 0; + } else if (field->flags & VMS_VSTRUCT) { + return vmstate_load_state(f, field->vmsd, pv, field->struct_version_id, + errp) >= 0; + } + + if (field->info->get(f, pv, size, field) < 0) { + error_setg(errp, + "Failed to load element of type %s for %s", + field->info->name, field->name); + return false; + } + + return true; +} + int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, void *opaque, int version_id, Error **errp) { @@ -223,24 +244,8 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd, inner_field = field; } - if (inner_field->flags & VMS_STRUCT) { - ret = vmstate_load_state(f, inner_field->vmsd, curr_elem, - inner_field->vmsd->version_id, - errp); - } else if (inner_field->flags & VMS_VSTRUCT) { - ret = vmstate_load_state(f, inner_field->vmsd, curr_elem, - inner_field->struct_version_id, - errp); - } else { - ret = inner_field->info->get(f, curr_elem, size, - inner_field); - if (ret < 0) { - error_setg(errp, - "Failed to load element of type %s for %s: " - "%d", inner_field->info->name, - inner_field->name, ret); - } - } + ret = vmstate_load_field(f, curr_elem, size, inner_field, + errp) ? 0 : -EINVAL; /* If we used a fake temp field.. free it now */ if (inner_field != field) { -- 2.52.0
