i_mode should be used instead for some old random fs.

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

diff --git a/lib/inode.c b/lib/inode.c
index 0f49f6e..ff17295 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -182,7 +182,7 @@ static int comp_subdir(const void *a, const void *b)
 int erofs_prepare_dir_file(struct erofs_inode *dir, unsigned int nr_subdirs)
 {
        struct erofs_dentry *d, *n, **sorted_d;
-       unsigned int d_size, i_nlink, i;
+       unsigned int d_size, i;
 
        /* dot is pointed to the current dir inode */
        d = erofs_d_alloc(dir, ".");
@@ -216,26 +216,14 @@ int erofs_prepare_dir_file(struct erofs_inode *dir, 
unsigned int nr_subdirs)
 
        /* let's calculate dir size and update i_nlink */
        d_size = 0;
-       i_nlink = 0;
        list_for_each_entry(d, &dir->i_subdirs, d_child) {
                int len = strlen(d->name) + sizeof(struct erofs_dirent);
 
                if ((d_size & (erofs_blksiz() - 1)) + len > erofs_blksiz())
                        d_size = round_up(d_size, erofs_blksiz());
                d_size += len;
-
-               i_nlink += (d->type == EROFS_FT_DIR);
        }
        dir->i_size = d_size;
-       /*
-        * if there're too many subdirs as compact form, set nlink=1
-        * rather than upgrade to use extented form instead.
-        */
-       if (i_nlink > USHRT_MAX &&
-           dir->inode_isize == sizeof(struct erofs_inode_compact))
-               dir->i_nlink = 1;
-       else
-               dir->i_nlink = i_nlink;
 
        /* no compression for all dirs */
        dir->datalayout = EROFS_INODE_FLAT_INLINE;
@@ -1039,7 +1027,7 @@ static int erofs_mkfs_build_tree(struct erofs_inode *dir, 
struct list_head *dirs
        DIR *_dir;
        struct dirent *dp;
        struct erofs_dentry *d;
-       unsigned int nr_subdirs;
+       unsigned int nr_subdirs, i_nlink;
 
        ret = erofs_prepare_xattr_ibody(dir);
        if (ret < 0)
@@ -1100,10 +1088,6 @@ static int erofs_mkfs_build_tree(struct erofs_inode 
*dir, struct list_head *dirs
                        goto err_closedir;
                }
                nr_subdirs++;
-
-               /* to count i_nlink for directories */
-               d->type = (dp->d_type == DT_DIR ?
-                       EROFS_FT_DIR : EROFS_FT_UNKNOWN);
        }
 
        if (errno) {
@@ -1124,6 +1108,7 @@ static int erofs_mkfs_build_tree(struct erofs_inode *dir, 
struct list_head *dirs
        if (IS_ROOT(dir))
                erofs_fixup_meta_blkaddr(dir);
 
+       i_nlink = 0;
        list_for_each_entry(d, &dir->i_subdirs, d_child) {
                char buf[PATH_MAX];
                unsigned char ftype;
@@ -1159,12 +1144,21 @@ fail:
                        ++dir->subdirs_queued;
                }
                ftype = erofs_mode_to_ftype(inode->i_mode);
-               DBG_BUGON(ftype == EROFS_FT_DIR && d->type != ftype);
+               i_nlink += (ftype == EROFS_FT_DIR);
                d->inode = inode;
                d->type = ftype;
                erofs_info("file %s/%s dumped (type %u)",
                           dir->i_srcpath, d->name, d->type);
        }
+       /*
+        * if there're too many subdirs as compact form, set nlink=1
+        * rather than upgrade to use extented form instead.
+        */
+       if (i_nlink > USHRT_MAX &&
+           dir->inode_isize == sizeof(struct erofs_inode_compact))
+               dir->i_nlink = 1;
+       else
+               dir->i_nlink = i_nlink;
        return 0;
 
 err_closedir:
-- 
2.24.4

Reply via email to