- Remove redundant logic; - In preparation for incremental builds on local paths.
Signed-off-by: Gao Xiang <[email protected]> --- lib/inode.c | 91 ++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 47 deletions(-) diff --git a/lib/inode.c b/lib/inode.c index e57a0db..2918791 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -1608,26 +1608,29 @@ static void erofs_mkfs_flushjobs(struct erofs_sb_info *sbi) } #endif -static int erofs_mkfs_handle_directory(struct erofs_importer *im, struct erofs_inode *dir) +static int erofs_mkfs_import_localdir(struct erofs_importer *im, struct erofs_inode *dir, + u64 *nr_subdirs, unsigned int *i_nlink) { + unsigned int __nlink; + u64 __nr_subdirs; DIR *_dir; - struct dirent *dp; - struct erofs_dentry *d; - unsigned int nr_subdirs, i_nlink; int ret; _dir = opendir(dir->i_srcpath); if (!_dir) { + ret = -errno; erofs_err("failed to opendir at %s: %s", - dir->i_srcpath, erofs_strerror(-errno)); - return -errno; + dir->i_srcpath, erofs_strerror(ret)); + return ret; } - nr_subdirs = 0; - i_nlink = 0; + __nr_subdirs = *nr_subdirs; + __nlink = *i_nlink; while (1) { - char buf[PATH_MAX]; struct erofs_inode *inode; + struct erofs_dentry *d; + char buf[PATH_MAX]; + struct dirent *dp; /* * set errno to 0 before calling readdir() in order to @@ -1636,16 +1639,14 @@ static int erofs_mkfs_handle_directory(struct erofs_importer *im, struct erofs_i errno = 0; dp = readdir(_dir); if (!dp) { - if (!errno) - break; ret = -errno; + if (!ret) + break; goto err_closedir; } - if (is_dot_dotdot(dp->d_name)) { - ++i_nlink; + if (is_dot_dotdot(dp->d_name)) continue; - } /* skip if it's a exclude file */ if (erofs_is_exclude_path(dir->i_srcpath, dp->d_name)) @@ -1668,32 +1669,15 @@ static int erofs_mkfs_handle_directory(struct erofs_importer *im, struct erofs_i } d->inode = inode; d->type = erofs_mode_to_ftype(inode->i_mode); - i_nlink += S_ISDIR(inode->i_mode); + __nlink += S_ISDIR(inode->i_mode); erofs_dbg("file %s added (type %u)", buf, d->type); - nr_subdirs++; + __nr_subdirs++; } closedir(_dir); - ret = erofs_prepare_dir_file(im, dir, nr_subdirs); /* sort subdirs */ - if (ret) - return ret; - - /* - * if there're too many subdirs as compact form, set nlink=1 - * rather than upgrade to use extented form instead if possible. - */ - if (i_nlink > USHRT_MAX && - dir->inode_isize == sizeof(struct erofs_inode_compact)) { - if (dir->dot_omitted) - dir->inode_isize = sizeof(struct erofs_inode_extended); - else - dir->i_nlink = 1; - } else { - dir->i_nlink = i_nlink; - } - - return erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); - + *nr_subdirs = __nr_subdirs; + *i_nlink = __nlink; + return 0; err_closedir: closedir(_dir); return ret; @@ -1728,13 +1712,15 @@ static void erofs_dentry_kill(struct erofs_dentry *d) free(d); } -static int erofs_rebuild_handle_directory(struct erofs_importer *im, - struct erofs_inode *dir, - bool incremental) +static int erofs_mkfs_handle_directory(struct erofs_importer *im, + struct erofs_inode *dir, + bool rebuild, + bool incremental) { struct erofs_sb_info *sbi = im->sbi; struct erofs_dentry *d, *n; - unsigned int nr_subdirs, i_nlink; + unsigned int i_nlink; + u64 nr_subdirs; bool delwht = im->params->ovlfs_strip && dir->whiteouts; int ret; @@ -1755,6 +1741,14 @@ static int erofs_rebuild_handle_directory(struct erofs_importer *im, i_nlink += (d->type == EROFS_FT_DIR); ++nr_subdirs; } + + if (!rebuild) { + ret = erofs_mkfs_import_localdir(im, dir, + &nr_subdirs, &i_nlink); + if (ret) + return ret; + } + DBG_BUGON(nr_subdirs + 2 < i_nlink); ret = erofs_prepare_dir_file(im, dir, nr_subdirs); if (ret) @@ -1763,15 +1757,18 @@ static int erofs_rebuild_handle_directory(struct erofs_importer *im, if (IS_ROOT(dir) && incremental) dir->datalayout = EROFS_INODE_FLAT_PLAIN; + dir->i_nlink = i_nlink; /* * if there're too many subdirs as compact form, set nlink=1 - * rather than upgrade to use extented form instead. + * rather than upgrade to use extented form instead if possible. */ if (i_nlink > USHRT_MAX && - dir->inode_isize == sizeof(struct erofs_inode_compact)) - dir->i_nlink = 1; - else - dir->i_nlink = i_nlink; + dir->inode_isize == sizeof(struct erofs_inode_compact)) { + if (dir->dot_omitted) + dir->inode_isize = sizeof(struct erofs_inode_extended); + else + dir->i_nlink = 1; + } return erofs_mkfs_go(im, EROFS_MKFS_JOB_DIR, &dir, sizeof(dir)); } @@ -1814,7 +1811,7 @@ static int erofs_mkfs_handle_inode(struct erofs_importer *im, } ret = erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx)); } else { - ret = erofs_mkfs_handle_directory(im, inode); + ret = erofs_mkfs_handle_directory(im, inode, false, false); } erofs_info("file /%s dumped (mode %05o)", relpath, inode->i_mode); return ret; @@ -1880,7 +1877,7 @@ static int erofs_rebuild_handle_inode(struct erofs_importer *im, } ret = erofs_mkfs_go(im, EROFS_MKFS_JOB_NDIR, &ctx, sizeof(ctx)); } else { - ret = erofs_rebuild_handle_directory(im, inode, incremental); + ret = erofs_mkfs_handle_directory(im, inode, true, incremental); } erofs_info("file %s dumped (mode %05o)", erofs_fspath(inode->i_srcpath), inode->i_mode); -- 2.43.5
