* [PATCH v2] erofs-utils: update i_nlink stat for directories
[not found] <20201205091637.8944-1-hsiangkao.ref@aol.com>
@ 2020-12-05 9:16 ` Gao Xiang via Linux-erofs
2020-12-05 9:22 ` Li GuiFu via Linux-erofs
0 siblings, 1 reply; 3+ messages in thread
From: Gao Xiang via Linux-erofs @ 2020-12-05 9:16 UTC (permalink / raw)
To: linux-erofs, Li Guifu
From: Gao Xiang <hsiangkao@aol.com>
Previously, nlink of directories was treated as 1 for simplicity.
Since st_nlink for dirs is actually not well defined, nlink=1 seems
to pacify `find' (even without -noleaf option) and other utilities.
AFAICT, isofs, romfs and cramfs always set it to 1, Overlayfs sets
it to 1 conditionally, btrfs[1], ceph[2] and FUSE client historically
set it to 1.
The convention under unix is that it's # of subdirs including "."
and "..". This patch tries to follow such convention if possible to
optimize `find' performance since it's not quite hard for local fs.
[1] https://lore.kernel.org/r/20100124003336.GP23006@think
[2] https://lore.kernel.org/r/20180521092729.17470-1-lhenriques@suse.com
Signed-off-by: Gao Xiang <hsiangkao@aol.com>
---
v1: https://lore.kernel.org/r/20201205055732.14276-1-hsiangkao@aol.com
changes since v1:
- update a DBG_BUGON statement suggestted by Guifu.
lib/inode.c | 33 +++++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/lib/inode.c b/lib/inode.c
index 618eb284550f..3d634fc92852 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -25,7 +25,7 @@
struct erofs_sb_info sbi;
#define S_SHIFT 12
-static unsigned char erofs_type_by_mode[S_IFMT >> S_SHIFT] = {
+static unsigned char erofs_ftype_by_mode[S_IFMT >> S_SHIFT] = {
[S_IFREG >> S_SHIFT] = EROFS_FT_REG_FILE,
[S_IFDIR >> S_SHIFT] = EROFS_FT_DIR,
[S_IFCHR >> S_SHIFT] = EROFS_FT_CHRDEV,
@@ -35,6 +35,11 @@ static unsigned char erofs_type_by_mode[S_IFMT >> S_SHIFT] = {
[S_IFLNK >> S_SHIFT] = EROFS_FT_SYMLINK,
};
+static unsigned char erofs_mode_to_ftype(umode_t mode)
+{
+ return erofs_ftype_by_mode[(mode & S_IFMT) >> S_SHIFT];
+}
+
#define NR_INODE_HASHTABLE 16384
struct list_head inode_hashtable[NR_INODE_HASHTABLE];
@@ -156,7 +161,7 @@ static int __allocate_inode_bh_data(struct erofs_inode *inode,
int erofs_prepare_dir_file(struct erofs_inode *dir)
{
struct erofs_dentry *d;
- unsigned int d_size;
+ unsigned int d_size, i_nlink;
int ret;
/* dot is pointed to the current dir inode */
@@ -169,16 +174,28 @@ int erofs_prepare_dir_file(struct erofs_inode *dir)
d->inode = erofs_igrab(dir->i_parent);
d->type = EROFS_FT_DIR;
- /* let's calculate dir size */
+ /* 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 + 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;
@@ -957,6 +974,10 @@ struct erofs_inode *erofs_mkfs_build_tree(struct erofs_inode *dir)
ret = PTR_ERR(d);
goto err_closedir;
}
+
+ /* to count i_nlink for directories */
+ d->type = (dp->d_type == DT_DIR ?
+ EROFS_FT_DIR : EROFS_FT_UNKNOWN);
}
if (errno) {
@@ -978,6 +999,7 @@ struct erofs_inode *erofs_mkfs_build_tree(struct erofs_inode *dir)
list_for_each_entry(d, &dir->i_subdirs, d_child) {
char buf[PATH_MAX];
+ unsigned char ftype;
if (is_dot_dotdot(d->name)) {
erofs_d_invalidate(d);
@@ -1000,7 +1022,10 @@ fail:
goto err;
}
- d->type = erofs_type_by_mode[d->inode->i_mode >> S_SHIFT];
+ ftype = erofs_mode_to_ftype(d->inode->i_mode);
+ DBG_BUGON(ftype == EROFS_FT_DIR && d->type != ftype);
+ d->type = ftype;
+
erofs_d_invalidate(d);
erofs_info("add file %s/%s (nid %llu, type %d)",
dir->i_srcpath, d->name, (unsigned long long)d->nid,
--
2.24.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] erofs-utils: update i_nlink stat for directories
2020-12-05 9:16 ` [PATCH v2] erofs-utils: update i_nlink stat for directories Gao Xiang via Linux-erofs
@ 2020-12-05 9:22 ` Li GuiFu via Linux-erofs
2020-12-05 9:34 ` Gao Xiang
0 siblings, 1 reply; 3+ messages in thread
From: Li GuiFu via Linux-erofs @ 2020-12-05 9:22 UTC (permalink / raw)
To: Gao Xiang, linux-erofs
On 2020/12/5 17:16, Gao Xiang wrote:
> From: Gao Xiang <hsiangkao@aol.com>
>
> Previously, nlink of directories was treated as 1 for simplicity.
>
> Since st_nlink for dirs is actually not well defined, nlink=1 seems
> to pacify `find' (even without -noleaf option) and other utilities.
> AFAICT, isofs, romfs and cramfs always set it to 1, Overlayfs sets
> it to 1 conditionally, btrfs[1], ceph[2] and FUSE client historically
> set it to 1.
>
> The convention under unix is that it's # of subdirs including "."
> and "..". This patch tries to follow such convention if possible to
> optimize `find' performance since it's not quite hard for local fs.
>
> [1] https://lore.kernel.org/r/20100124003336.GP23006@think
> [2] https://lore.kernel.org/r/20180521092729.17470-1-lhenriques@suse.com
> Signed-off-by: Gao Xiang <hsiangkao@aol.com>
> ---
> v1: https://lore.kernel.org/r/20201205055732.14276-1-hsiangkao@aol.com
> changes since v1:
> - update a DBG_BUGON statement suggestted by Guifu.
>
> lib/inode.c | 33 +++++++++++++++++++++++++++++----
> 1 file changed, 29 insertions(+), 4 deletions(-)
>
It looks good
Reviewed-by: Li Guifu <bluce.lee@aliyun.com>
Thanks,
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] erofs-utils: update i_nlink stat for directories
2020-12-05 9:22 ` Li GuiFu via Linux-erofs
@ 2020-12-05 9:34 ` Gao Xiang
0 siblings, 0 replies; 3+ messages in thread
From: Gao Xiang @ 2020-12-05 9:34 UTC (permalink / raw)
To: Li GuiFu; +Cc: linux-erofs
Hi Guifu,
On Sat, Dec 05, 2020 at 05:22:13PM +0800, Li GuiFu via Linux-erofs wrote:
>
>
> On 2020/12/5 17:16, Gao Xiang wrote:
> > From: Gao Xiang <hsiangkao@aol.com>
> >
> > Previously, nlink of directories was treated as 1 for simplicity.
> >
> > Since st_nlink for dirs is actually not well defined, nlink=1 seems
> > to pacify `find' (even without -noleaf option) and other utilities.
> > AFAICT, isofs, romfs and cramfs always set it to 1, Overlayfs sets
> > it to 1 conditionally, btrfs[1], ceph[2] and FUSE client historically
> > set it to 1.
> >
> > The convention under unix is that it's # of subdirs including "."
> > and "..". This patch tries to follow such convention if possible to
> > optimize `find' performance since it's not quite hard for local fs.
> >
> > [1] https://lore.kernel.org/r/20100124003336.GP23006@think
> > [2] https://lore.kernel.org/r/20180521092729.17470-1-lhenriques@suse.com
> > Signed-off-by: Gao Xiang <hsiangkao@aol.com>
> > ---
> > v1: https://lore.kernel.org/r/20201205055732.14276-1-hsiangkao@aol.com
> > changes since v1:
> > - update a DBG_BUGON statement suggestted by Guifu.
> >
> > lib/inode.c | 33 +++++++++++++++++++++++++++++----
> > 1 file changed, 29 insertions(+), 4 deletions(-)
> >
>
> It looks good
> Reviewed-by: Li Guifu <bluce.lee@aliyun.com>
Thanks for the review. I've applied all pending patches from experimental
to dev branch. Tonight, I'll update README for erofsfuse (if you have time,
kindly review it then, but I think I'm not going to wait for a long time)
and will release erofs-utils v1.2 this weekend since we already have many
commits and the release period has been somewhat longer than v1.0 ~ v1.1.
Thanks,
Gao Xiang
> Thanks,
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-12-05 9:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20201205091637.8944-1-hsiangkao.ref@aol.com>
2020-12-05 9:16 ` [PATCH v2] erofs-utils: update i_nlink stat for directories Gao Xiang via Linux-erofs
2020-12-05 9:22 ` Li GuiFu via Linux-erofs
2020-12-05 9:34 ` Gao Xiang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.