Extract the logic for deserializing single entries for files into
separate helper functions. In preparation to a linked-block
serialization for files.

Signed-off-by: Pasha Tatashin <[email protected]>
---
 kernel/liveupdate/luo_file.c | 77 ++++++++++++++++++++----------------
 1 file changed, 44 insertions(+), 33 deletions(-)

diff --git a/kernel/liveupdate/luo_file.c b/kernel/liveupdate/luo_file.c
index a0a419085e28..a2510563469a 100644
--- a/kernel/liveupdate/luo_file.c
+++ b/kernel/liveupdate/luo_file.c
@@ -752,6 +752,46 @@ int luo_file_finish(struct luo_file_set *file_set)
        return 0;
 }
 
+static int luo_file_deserialize_one(struct luo_file_set *file_set,
+                                   struct luo_file_ser *ser)
+{
+       struct liveupdate_file_handler *fh;
+       bool handler_found = false;
+       struct luo_file *luo_file;
+
+       down_read(&luo_register_rwlock);
+       list_private_for_each_entry(fh, &luo_file_handler_list, list) {
+               if (!strcmp(fh->compatible, ser->compatible)) {
+                       if (try_module_get(fh->ops->owner))
+                               handler_found = true;
+                       break;
+               }
+       }
+       up_read(&luo_register_rwlock);
+
+       if (!handler_found) {
+               pr_warn("No registered handler for compatible '%.*s'\n",
+                       (int)sizeof(ser->compatible),
+                       ser->compatible);
+               return -ENOENT;
+       }
+
+       luo_file = kzalloc_obj(*luo_file);
+       if (!luo_file) {
+               module_put(fh->ops->owner);
+               return -ENOMEM;
+       }
+
+       luo_file->fh = fh;
+       luo_file->file = NULL;
+       luo_file->serialized_data = ser->data;
+       luo_file->token = ser->token;
+       mutex_init(&luo_file->mutex);
+       list_add_tail(&luo_file->list, &file_set->files_list);
+
+       return 0;
+}
+
 /**
  * luo_file_deserialize - Reconstructs the list of preserved files in the new 
kernel.
  * @file_set:     The incoming file_set to fill with deserialized data.
@@ -781,6 +821,7 @@ int luo_file_deserialize(struct luo_file_set *file_set,
                         struct luo_file_set_ser *file_set_ser)
 {
        struct luo_file_ser *file_ser;
+       int err;
        u64 i;
 
        if (!file_set_ser->files) {
@@ -808,39 +849,9 @@ int luo_file_deserialize(struct luo_file_set *file_set,
         */
        file_ser = file_set->files;
        for (i = 0; i < file_set->count; i++) {
-               struct liveupdate_file_handler *fh;
-               bool handler_found = false;
-               struct luo_file *luo_file;
-
-               down_read(&luo_register_rwlock);
-               list_private_for_each_entry(fh, &luo_file_handler_list, list) {
-                       if (!strcmp(fh->compatible, file_ser[i].compatible)) {
-                               if (try_module_get(fh->ops->owner))
-                                       handler_found = true;
-                               break;
-                       }
-               }
-               up_read(&luo_register_rwlock);
-
-               if (!handler_found) {
-                       pr_warn("No registered handler for compatible '%.*s'\n",
-                               (int)sizeof(file_ser[i].compatible),
-                               file_ser[i].compatible);
-                       return -ENOENT;
-               }
-
-               luo_file = kzalloc_obj(*luo_file);
-               if (!luo_file) {
-                       module_put(fh->ops->owner);
-                       return -ENOMEM;
-               }
-
-               luo_file->fh = fh;
-               luo_file->file = NULL;
-               luo_file->serialized_data = file_ser[i].data;
-               luo_file->token = file_ser[i].token;
-               mutex_init(&luo_file->mutex);
-               list_add_tail(&luo_file->list, &file_set->files_list);
+               err = luo_file_deserialize_one(file_set, &file_ser[i]);
+               if (err)
+                       return err;
        }
 
        return 0;
-- 
2.53.0


Reply via email to