From: Yifan Zhao <zhaoyi...@sjtu.edu.cn> The following new helpers are added to prepare for the upcoming multi-threaded inter-file compression: - erofs_mkfs_handle_{non,}directory; - erofs_write_unencoded_file.
Signed-off-by: Yifan Zhao <zhaoyi...@sjtu.edu.cn> Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- lib/inode.c | 106 +++++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/lib/inode.c b/lib/inode.c index ba0419f..f419f3c 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -477,12 +477,8 @@ static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd) return 0; } -int erofs_write_file(struct erofs_inode *inode, int fd, u64 fpos) +int erofs_write_unencoded_file(struct erofs_inode *inode, int fd, u64 fpos) { - int ret; - - DBG_BUGON(!inode->i_size); - if (cfg.c_chunkbits) { inode->u.chunkbits = cfg.c_chunkbits; /* chunk indexes when explicitly specified */ @@ -492,7 +488,17 @@ int erofs_write_file(struct erofs_inode *inode, int fd, u64 fpos) return erofs_blob_write_chunked_file(inode, fd, fpos); } + /* fallback to all data uncompressed */ + return write_uncompressed_file_from_fd(inode, fd); +} + +int erofs_write_file(struct erofs_inode *inode, int fd, u64 fpos) +{ + DBG_BUGON(!inode->i_size); + if (cfg.c_compr_opts[0].alg && erofs_file_is_compressible(inode)) { + int ret; + ret = erofs_write_compressed_file(inode, fd, fpos); if (!ret || ret != -ENOSPC) return ret; @@ -500,9 +506,8 @@ int erofs_write_file(struct erofs_inode *inode, int fd, u64 fpos) if (lseek(fd, fpos, SEEK_SET) < 0) return -errno; } - /* fallback to all data uncompressed */ - return write_uncompressed_file_from_fd(inode, fd); + return erofs_write_unencoded_file(inode, fd, fpos); } static int erofs_bh_flush_write_inode(struct erofs_buffer_head *bh) @@ -1095,52 +1100,44 @@ static void erofs_fixup_meta_blkaddr(struct erofs_inode *rootdir) rootdir->nid = (off - meta_offset) >> EROFS_ISLOTBITS; } -static int erofs_mkfs_build_tree(struct erofs_inode *dir, struct list_head *dirs) +static int erofs_mkfs_handle_nondirectory(struct erofs_inode *inode) { - int ret; - DIR *_dir; - struct dirent *dp; - struct erofs_dentry *d; - unsigned int nr_subdirs, i_nlink; + int ret = 0; - ret = erofs_scan_file_xattrs(dir); - if (ret < 0) - return ret; + if (S_ISLNK(inode->i_mode)) { + char *const symlink = malloc(inode->i_size); - ret = erofs_prepare_xattr_ibody(dir); - if (ret < 0) - return ret; - - if (!S_ISDIR(dir->i_mode)) { - if (S_ISLNK(dir->i_mode)) { - char *const symlink = malloc(dir->i_size); - - if (!symlink) - return -ENOMEM; - ret = readlink(dir->i_srcpath, symlink, dir->i_size); - if (ret < 0) { - free(symlink); - return -errno; - } - ret = erofs_write_file_from_buffer(dir, symlink); + if (!symlink) + return -ENOMEM; + ret = readlink(inode->i_srcpath, symlink, inode->i_size); + if (ret < 0) { free(symlink); - } else if (dir->i_size) { - int fd = open(dir->i_srcpath, O_RDONLY | O_BINARY); - if (fd < 0) - return -errno; - - ret = erofs_write_file(dir, fd, 0); - close(fd); - } else { - ret = 0; + return -errno; } - if (ret) - return ret; + 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); - erofs_prepare_inode_buffer(dir); - erofs_write_tail_end(dir); - return 0; + if (fd < 0) + return -errno; + ret = erofs_write_file(inode, fd, 0); + close(fd); } + if (ret) + return ret; + erofs_prepare_inode_buffer(inode); + erofs_write_tail_end(inode); + return 0; +} + +static int erofs_mkfs_handle_directory(struct erofs_inode *dir, struct list_head *dirs) +{ + DIR *_dir; + struct dirent *dp; + struct erofs_dentry *d; + unsigned int nr_subdirs, i_nlink; + int ret; _dir = opendir(dir->i_srcpath); if (!_dir) { @@ -1252,6 +1249,23 @@ err_closedir: return ret; } +static int erofs_mkfs_build_tree(struct erofs_inode *inode, struct list_head *dirs) +{ + int ret; + + ret = erofs_scan_file_xattrs(inode); + if (ret < 0) + return ret; + + ret = erofs_prepare_xattr_ibody(inode); + if (ret < 0) + return ret; + + if (!S_ISDIR(inode->i_mode)) + return erofs_mkfs_handle_nondirectory(inode); + return erofs_mkfs_handle_directory(inode, dirs); +} + struct erofs_inode *erofs_mkfs_build_tree_from_path(const char *path) { LIST_HEAD(dirs); -- 2.39.3