[RFC 22/22] migration: finally convert vmstate_save/load_state() functions

Vladimir Sementsov-Ogievskiy posted 22 patches 2 weeks, 2 days ago
[RFC 22/22] migration: finally convert vmstate_save/load_state() functions
Posted by Vladimir Sementsov-Ogievskiy 2 weeks, 2 days ago
Now they are used only to relize their wrappers
vmstate_save/load_vmsd(). So, let's do final convertion.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 include/migration/vmstate.h |  21 +-----
 migration/vmstate.c         | 141 ++++++++++++++++++------------------
 2 files changed, 74 insertions(+), 88 deletions(-)

diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
index aaeb33045e..b2fda750e3 100644
--- a/include/migration/vmstate.h
+++ b/include/migration/vmstate.h
@@ -1222,27 +1222,10 @@ extern const VMStateInfo vmstate_info_qlist;
         .flags = VMS_END, \
     }
 
-int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
+bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescription *vmsd,
                        void *opaque, int version_id, Error **errp);
-int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
+bool vmstate_save_vmsd(QEMUFile *f, const VMStateDescription *vmsd,
                        void *opaque, JSONWriter *vmdesc, Error **errp);
-int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
-                         void *opaque, JSONWriter *vmdesc,
-                         int version_id, Error **errp);
-
-static inline bool vmstate_load_vmsd(
-    QEMUFile *f, const VMStateDescription *vmsd,
-    void *opaque, int version_id, Error **errp)
-{
-    return vmstate_load_state(f, vmsd, opaque, version_id, errp) >= 0;
-}
-
-static inline bool vmstate_save_vmsd(
-    QEMUFile *f, const VMStateDescription *vmsd,
-    void *opaque, JSONWriter *vmdesc, Error **errp)
-{
-    return vmstate_save_state(f, vmsd, opaque, vmdesc, errp) >= 0;
-}
 
 bool vmstate_section_needed(const VMStateDescription *vmsd, void *opaque);
 
diff --git a/migration/vmstate.c b/migration/vmstate.c
index 2298f190de..b8fb1d0a40 100644
--- a/migration/vmstate.c
+++ b/migration/vmstate.c
@@ -131,12 +131,11 @@ static void vmstate_handle_alloc(void *ptr, const VMStateField *field,
     }
 }
 
-int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
+bool vmstate_load_vmsd(QEMUFile *f, const VMStateDescription *vmsd,
                        void *opaque, int version_id, Error **errp)
 {
     ERRP_GUARD();
     const VMStateField *field = vmsd->fields;
-    int ret = 0;
 
     trace_vmstate_load_state(vmsd->name, version_id);
     if (version_id > vmsd->version_id) {
@@ -144,14 +143,14 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
                    "for local version_id %d",
                    vmsd->name, version_id, vmsd->version_id);
         trace_vmstate_load_state_end(vmsd->name, "too new", -EINVAL);
-        return -EINVAL;
+        return false;
     }
     if  (version_id < vmsd->minimum_version_id) {
         error_setg(errp, "%s: incoming version_id %d is too old "
                    "for local minimum version_id %d",
                    vmsd->name, version_id, vmsd->minimum_version_id);
         trace_vmstate_load_state_end(vmsd->name, "too old", -EINVAL);
-        return -EINVAL;
+        return false;
     }
     if (vmsd->pre_load_errp) {
         if (!vmsd->pre_load_errp(opaque, errp)) {
@@ -159,16 +158,16 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
                           "version_id: %d, minimum version_id: %d: ",
                           vmsd->name, vmsd->version_id,
                           vmsd->minimum_version_id);
-            return -EINVAL;
+            return false;
         }
     } else if (vmsd->pre_load) {
-        ret = vmsd->pre_load(opaque);
+        int ret = vmsd->pre_load(opaque);
         if (ret) {
             error_setg(errp, "pre load hook failed for: '%s', "
                        "version_id: %d, minimum version_id: %d, ret: %d",
                        vmsd->name, vmsd->version_id, vmsd->minimum_version_id,
                        ret);
-            return ret;
+            return false;
         }
     }
     while (field->name) {
@@ -187,6 +186,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
             for (i = 0; i < n_elems; i++) {
                 void *curr_elem = first_elem + size * i;
                 const VMStateField *inner_field;
+                bool ok;
 
                 if (field->flags & VMS_ARRAY_OF_POINTER) {
                     curr_elem = *(void **)curr_elem;
@@ -204,21 +204,20 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
                 }
 
                 if (inner_field->flags & VMS_STRUCT) {
-                    ret = vmstate_load_state(f, inner_field->vmsd, curr_elem,
-                                             inner_field->vmsd->version_id,
-                                             errp);
+                    ok = vmstate_load_vmsd(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);
+                    ok = vmstate_load_vmsd(f, inner_field->vmsd, curr_elem,
+                                           inner_field->struct_version_id,
+                                           errp);
                 } else {
-                    if (!inner_field->info->load(
-                        f, curr_elem, size, inner_field, errp)) {
-                            error_prepend(
-                                errp,
-                                "Failed to load element of type %s for %s: ",
-                                inner_field->info->name, inner_field->name);
-                            ret = -EINVAL;
+                    ok = inner_field->info->load(f, curr_elem, size,
+                                                 inner_field, errp);
+                    if (!ok) {
+                        error_prepend(errp,
+                            "Failed to load element of type %s for %s: ",
+                            inner_field->info->name, inner_field->name);
                     }
                 }
 
@@ -227,24 +226,25 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
                     g_clear_pointer((gpointer *)&inner_field, g_free);
                 }
 
-                if (ret >= 0) {
-                    ret = qemu_file_get_error(f);
+                if (ok) {
+                    int ret = qemu_file_get_error(f);
                     if (ret < 0) {
+                        ok = false;
                         error_setg(errp,
                                    "Failed to load %s state: stream error: %d",
                                    vmsd->name, ret);
                     }
                 }
-                if (ret < 0) {
-                    qemu_file_set_error(f, ret);
-                    trace_vmstate_load_field_error(field->name, ret);
-                    return ret;
+                if (!ok) {
+                    qemu_file_set_error(f, -EINVAL);
+                    trace_vmstate_load_field_error(field->name, -EINVAL);
+                    return false;
                 }
             }
         } else if (field->flags & VMS_MUST_EXIST) {
             error_setg(errp, "Input validation failed: %s/%s version_id: %d",
                        vmsd->name, field->name, vmsd->version_id);
-            return -1;
+            return false;
         }
         field++;
     }
@@ -258,20 +258,24 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
             error_prepend(errp, "post load hook failed for: %s, version_id: "
                           "%d, minimum_version: %d: ", vmsd->name,
                           vmsd->version_id, vmsd->minimum_version_id);
-            ret = -EINVAL;
+            trace_vmstate_load_state_end(vmsd->name, "end", -EINVAL);
+            return false;
         }
     } else if (vmsd->post_load) {
-        ret = vmsd->post_load(opaque, version_id);
+        int ret = vmsd->post_load(opaque, version_id);
         if (ret < 0) {
             error_setg(errp,
                        "post load hook failed for: %s, version_id: %d, "
                        "minimum_version: %d, ret: %d",
                        vmsd->name, vmsd->version_id, vmsd->minimum_version_id,
                        ret);
+            trace_vmstate_load_state_end(vmsd->name, "end", -EINVAL);
+            return false;
         }
     }
-    trace_vmstate_load_state_end(vmsd->name, "end", ret);
-    return ret;
+
+    trace_vmstate_load_state_end(vmsd->name, "end", 0);
+    return true;
 }
 
 static int vmfield_name_num(const VMStateField *start,
@@ -420,34 +424,29 @@ bool vmstate_section_needed(const VMStateDescription *vmsd, void *opaque)
 }
 
 
-int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
-                       void *opaque, JSONWriter *vmdesc_id, Error **errp)
-{
-    return vmstate_save_state_v(f, vmsd, opaque, vmdesc_id, vmsd->version_id, errp);
-}
-
-int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
-                         void *opaque, JSONWriter *vmdesc, int version_id, Error **errp)
+static bool vmstate_save_vmsd_v(QEMUFile *f, const VMStateDescription *vmsd,
+                                 void *opaque, JSONWriter *vmdesc,
+                                 int version_id, Error **errp)
 {
     ERRP_GUARD();
-    int ret = 0;
+    bool ok;
     const VMStateField *field = vmsd->fields;
 
     trace_vmstate_save_state_top(vmsd->name);
 
     if (vmsd->pre_save_errp) {
-        ret = vmsd->pre_save_errp(opaque, errp) ? 0 : -EINVAL;
-        trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
-        if (ret < 0) {
+        ok = vmsd->pre_save_errp(opaque, errp);
+        trace_vmstate_save_state_pre_save_res(vmsd->name, ok);
+        if (!ok) {
             error_prepend(errp, "pre-save for %s failed: ", vmsd->name);
-            return ret;
+            return false;
         }
     } else if (vmsd->pre_save) {
-        ret = vmsd->pre_save(opaque);
+        int ret = vmsd->pre_save(opaque);
         trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
         if (ret) {
             error_setg(errp, "pre-save failed: %s", vmsd->name);
-            return ret;
+            return false;
         }
     }
 
@@ -528,16 +527,16 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
                                       i, max_elems);
 
                 if (inner_field->flags & VMS_STRUCT) {
-                    ret = vmstate_save_state(f, inner_field->vmsd,
-                                             curr_elem, vmdesc_loop, errp);
+                    ok = vmstate_save_vmsd(f, inner_field->vmsd,
+                                           curr_elem, vmdesc_loop, errp);
                 } else if (inner_field->flags & VMS_VSTRUCT) {
-                    ret = vmstate_save_state_v(f, inner_field->vmsd,
-                                               curr_elem, vmdesc_loop,
-                                               inner_field->struct_version_id,
-                                               errp);
-                } else if (!inner_field->info->save(
-                    f, curr_elem, size, inner_field, vmdesc_loop, errp)) {
-                    ret = -EINVAL;
+                    ok = vmstate_save_vmsd_v(f, inner_field->vmsd,
+                                             curr_elem, vmdesc_loop,
+                                             inner_field->struct_version_id,
+                                             errp);
+                } else {
+                    ok = inner_field->info->save(
+                        f, curr_elem, size, inner_field, vmdesc_loop, errp);
                 }
 
                 written_bytes = qemu_file_transferred(f) - old_offset;
@@ -549,18 +548,13 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
                     g_clear_pointer((gpointer *)&inner_field, g_free);
                 }
 
-                if (ret) {
-                    if (*errp) {
-                        error_prepend(errp, "Save of field %s/%s failed: ",
-                                      vmsd->name, field->name);
-                    } else {
-                        error_setg(errp, "Save of field %s/%s failed",
-                                   vmsd->name, field->name);
-                    }
+                if (!ok) {
+                    error_prepend(errp, "Save of field %s/%s failed: ",
+                                  vmsd->name, field->name);
                     if (vmsd->post_save) {
                         vmsd->post_save(opaque);
                     }
-                    return ret;
+                    return false;
                 }
 
                 /* Compressed arrays only care about the first element */
@@ -583,18 +577,27 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
         json_writer_end_array(vmdesc);
     }
 
-    ret = vmstate_subsection_save(f, vmsd, opaque, vmdesc, errp) ? 0 : -EINVAL;
+    ok = vmstate_subsection_save(f, vmsd, opaque, vmdesc, errp);
 
     if (vmsd->post_save) {
         int ps_ret = vmsd->post_save(opaque);
-        if (!ret && ps_ret) {
-            ret = ps_ret;
+        if (ok && ps_ret) {
+            ok = false;
             error_setg(errp, "post-save failed: %s", vmsd->name);
         }
     }
-    return ret;
+
+    return ok;
 }
 
+bool vmstate_save_vmsd(QEMUFile *f, const VMStateDescription *vmsd,
+                        void *opaque, JSONWriter *vmdesc_id, Error **errp)
+{
+    return vmstate_save_vmsd_v(f, vmsd, opaque, vmdesc_id, vmsd->version_id,
+                               errp);
+}
+
+
 static const VMStateDescription *
 vmstate_get_subsection(const VMStateDescription * const *sub,
                        const char *idstr)
@@ -637,7 +640,7 @@ static bool vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
         if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) {
             trace_vmstate_subsection_load_bad(vmsd->name, idstr, "(prefix)");
             /* it doesn't have a valid subsection name */
-            return 0;
+            return true;
         }
         sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr);
         if (sub_vmsd == NULL) {
-- 
2.48.1