From: Gao Xiang <hsiang...@linux.alibaba.com>

It will describe EROFS_MKFS_JOB_NDIR defer work.  Also, start
compression before queueing EROFS_MKFS_JOB_NDIR.

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

diff --git a/lib/inode.c b/lib/inode.c
index 0d044f4..6ad66bf 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1107,8 +1107,36 @@ static void erofs_fixup_meta_blkaddr(struct erofs_inode 
*rootdir)
        rootdir->nid = (off - meta_offset) >> EROFS_ISLOTBITS;
 }
 
-static int erofs_mkfs_handle_nondirectory(struct erofs_inode *inode)
+struct erofs_mkfs_job_ndir_ctx {
+       struct erofs_inode *inode;
+       void *ictx;
+       int fd;
+};
+
+static int erofs_mkfs_job_write_file(struct erofs_mkfs_job_ndir_ctx *ctx)
 {
+       struct erofs_inode *inode = ctx->inode;
+       int ret;
+
+       if (ctx->ictx) {
+               ret = erofs_write_compressed_file(ctx->ictx);
+               if (ret != -ENOSPC)
+                       goto out;
+               if (lseek(ctx->fd, 0, SEEK_SET) < 0) {
+                       ret = -errno;
+                       goto out;
+               }
+       }
+       /* fallback to all data uncompressed */
+       ret = erofs_write_unencoded_file(inode, ctx->fd, 0);
+out:
+       close(ctx->fd);
+       return ret;
+}
+
+static int erofs_mkfs_handle_nondirectory(struct erofs_mkfs_job_ndir_ctx *ctx)
+{
+       struct erofs_inode *inode = ctx->inode;
        int ret = 0;
 
        if (S_ISLNK(inode->i_mode)) {
@@ -1124,12 +1152,7 @@ static int erofs_mkfs_handle_nondirectory(struct 
erofs_inode *inode)
                ret = erofs_write_file_from_buffer(inode, symlink);
                free(symlink);
        } else if (inode->i_size) {
-               int fd = open(inode->i_srcpath, O_RDONLY | O_BINARY);
-
-               if (fd < 0)
-                       return -errno;
-               ret = erofs_write_file(inode, fd, 0);
-               close(fd);
+               ret = erofs_mkfs_job_write_file(ctx);
        }
        if (ret)
                return ret;
@@ -1148,6 +1171,7 @@ struct erofs_mkfs_jobitem {
        enum erofs_mkfs_jobtype type;
        union {
                struct erofs_inode *inode;
+               struct erofs_mkfs_job_ndir_ctx ndir;
        } u;
 };
 
@@ -1157,7 +1181,7 @@ static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem 
*item)
        int ret;
 
        if (item->type == EROFS_MKFS_JOB_NDIR)
-               return erofs_mkfs_handle_nondirectory(inode);
+               return erofs_mkfs_handle_nondirectory(&item->u.ndir);
 
        if (item->type == EROFS_MKFS_JOB_DIR) {
                ret = erofs_prepare_inode_buffer(inode);
@@ -1294,11 +1318,27 @@ static int erofs_mkfs_handle_inode(struct erofs_inode 
*inode)
        if (ret < 0)
                return ret;
 
-       if (!S_ISDIR(inode->i_mode))
+       if (!S_ISDIR(inode->i_mode)) {
+               struct erofs_mkfs_job_ndir_ctx ctx = { .inode = inode };
+
+               if (!S_ISLNK(inode->i_mode) && inode->i_size) {
+                       ctx.fd = open(inode->i_srcpath, O_RDONLY | O_BINARY);
+                       if (ctx.fd < 0)
+                               return -errno;
+
+                       if (cfg.c_compr_opts[0].alg &&
+                           erofs_file_is_compressible(inode)) {
+                               ctx.ictx = erofs_begin_compressed_file(inode,
+                                                               ctx.fd, 0);
+                               if (IS_ERR(ctx.ictx))
+                                       return PTR_ERR(ctx.ictx);
+                       }
+               }
                ret = erofs_mkfs_go(inode->sbi, EROFS_MKFS_JOB_NDIR,
-                                   &inode, sizeof(inode));
-       else
+                                   &ctx, sizeof(ctx));
+       } else {
                ret = erofs_mkfs_handle_directory(inode);
+       }
        erofs_info("file %s dumped (mode %05o)", erofs_fspath(inode->i_srcpath),
                   inode->i_mode);
        return ret;
-- 
2.30.2

Reply via email to