[PATCH 2/8] erofs-utils: lib: prepare for later deferred work
Yifan Zhao
zhaoyifan at sjtu.edu.cn
Tue Apr 16 21:58:30 AEST 2024
On 4/16/24 4:04 PM, Gao Xiang wrote:
> From: Gao Xiang <hsiangkao at 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 <hsiangkao at 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;
More information about the Linux-erofs
mailing list