On 4/16/24 4:04 PM, Gao Xiang wrote:
From: Gao Xiang <hsiang...@linux.alibaba.com>

Split out ordered metadata operations and add the following helpers:

  - erofs_mkfs_jobfn()

  - erofs_mkfs_go()

to handle these mkfs job items for multi-threadding support.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
  lib/inode.c | 68 +++++++++++++++++++++++++++++++++++++++++++++--------
  1 file changed, 58 insertions(+), 10 deletions(-)

diff --git a/lib/inode.c b/lib/inode.c
index 55969d9..8ef0604 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1133,6 +1133,57 @@ static int erofs_mkfs_handle_nondirectory(struct 
erofs_inode *inode)
        return 0;
  }
+enum erofs_mkfs_jobtype { /* ordered job types */
+       EROFS_MKFS_JOB_NDIR,
+       EROFS_MKFS_JOB_DIR,
+       EROFS_MKFS_JOB_DIR_BH,
+};
+
+struct erofs_mkfs_jobitem {
+       enum erofs_mkfs_jobtype type;
+       union {
+               struct erofs_inode *inode;
+       } u;
+};
+
+static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem *item)
+{
+       struct erofs_inode *inode = item->u.inode;
+       int ret;
+
+       if (item->type == EROFS_MKFS_JOB_NDIR)
+               return erofs_mkfs_handle_nondirectory(inode);
+
+       if (item->type == EROFS_MKFS_JOB_DIR) {
+               ret = erofs_prepare_inode_buffer(inode);
+               if (ret)
+                       return ret;
+               inode->bh->op = &erofs_skip_write_bhops;
+               if (IS_ROOT(inode))
+                       erofs_fixup_meta_blkaddr(inode);

I think this 2 line above does not exist in the logic replaced by `erofs_mkfs_jobfn`, should it appear in this patch, or need further explanation in the commit msg?


Thanks,

Yifan Zhao

+               return 0;
+       }
+
+       if (item->type == EROFS_MKFS_JOB_DIR_BH) {
+               erofs_write_dir_file(inode);
+               erofs_write_tail_end(inode);
+               inode->bh->op = &erofs_write_inode_bhops;
+               erofs_iput(inode);
+               return 0;
+       }
+       return -EINVAL;
+}
+
+int erofs_mkfs_go(struct erofs_sb_info *sbi,
+                 enum erofs_mkfs_jobtype type, void *elem, int size)
+{
+       struct erofs_mkfs_jobitem item;
+
+       item.type = type;
+       memcpy(&item.u, elem, size);
+       return erofs_mkfs_jobfn(&item);
+}
+
  static int erofs_mkfs_handle_directory(struct erofs_inode *dir)
  {
        DIR *_dir;
@@ -1213,11 +1264,7 @@ static int erofs_mkfs_handle_directory(struct 
erofs_inode *dir)
        else
                dir->i_nlink = i_nlink;
- ret = erofs_prepare_inode_buffer(dir);
-       if (ret)
-               return ret;
-       dir->bh->op = &erofs_skip_write_bhops;
-       return 0;
+       return erofs_mkfs_go(dir->sbi, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir));
err_closedir:
        closedir(_dir);
@@ -1243,7 +1290,8 @@ static int erofs_mkfs_handle_inode(struct erofs_inode 
*inode)
                return ret;
if (!S_ISDIR(inode->i_mode))
-               ret = erofs_mkfs_handle_nondirectory(inode);
+               ret = erofs_mkfs_go(inode->sbi, EROFS_MKFS_JOB_NDIR,
+                                   &inode, sizeof(inode));
        else
                ret = erofs_mkfs_handle_directory(inode);
        erofs_info("file %s dumped (mode %05o)", erofs_fspath(inode->i_srcpath),
@@ -1302,10 +1350,10 @@ struct erofs_inode 
*erofs_mkfs_build_tree_from_path(const char *path)
                }
                *last = dumpdir;        /* fixup the last (or the only) one */
                dumpdir = head;
-               erofs_write_dir_file(dir);
-               erofs_write_tail_end(dir);
-               dir->bh->op = &erofs_write_inode_bhops;
-               erofs_iput(dir);
+               err = erofs_mkfs_go(dir->sbi, EROFS_MKFS_JOB_DIR_BH,
+                                   &dir, sizeof(dir));
+               if (err)
+                       return ERR_PTR(err);
        } while (dumpdir);
return root;

Reply via email to