2018-12-13 21:32:37

by Artem Blagodarenko

[permalink] [raw]
Subject: [PATCH 1/2] e2fsck: allow to check >2GB sized directory

After large_dir feature has been added, e2fsprogs is
ready for directories > 2GB, so we can remove e2fsck
directory size check.

Signed-off-by: Artem Blagodarenko <[email protected]>
---
e2fsck/pass1.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 5c0b92d5..3318d881 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -3647,9 +3647,10 @@ static int process_block(ext2_filsys fs,
}
}

- if (p->is_dir && blockcnt > (1 << (21 - fs->super->s_log_block_size)))
+ if (p->is_dir && !ext2fs_has_feature_largedir(fs->super) &&
+ blockcnt > (1 << (21 - fs->super->s_log_block_size)))
problem = PR_1_TOOBIG_DIR;
- if (p->is_reg && p->num_blocks+1 >= p->max_blocks)
+ if ((p->is_reg || p->is_dir) && p->num_blocks + 1 >= p->max_blocks)
problem = PR_1_TOOBIG_REG;
if (!p->is_dir && !p->is_reg && blockcnt > 0)
problem = PR_1_TOOBIG_SYMLINK;
--
2.14.3


2018-12-14 03:10:12

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH 1/2] e2fsck: allow to check >2GB sized directory

On Fri, Dec 14, 2018 at 12:31:55AM +0300, Artem Blagodarenko wrote:
> After large_dir feature has been added, e2fsprogs is
> ready for directories > 2GB, so we can remove e2fsck
> directory size check.
>
>
> - if (p->is_dir && blockcnt > (1 << (21 - fs->super->s_log_block_size)))
> + if (p->is_dir && !ext2fs_has_feature_largedir(fs->super) &&
> + blockcnt > (1 << (21 - fs->super->s_log_block_size)))
> problem = PR_1_TOOBIG_DIR;
> - if (p->is_reg && p->num_blocks+1 >= p->max_blocks)
> + if ((p->is_reg || p->is_dir) && p->num_blocks + 1 >= p->max_blocks)
> problem = PR_1_TOOBIG_REG;
> if (!p->is_dir && !p->is_reg && blockcnt > 0)
> problem = PR_1_TOOBIG_SYMLINK;

In the largedir case, if the directory is too big, it will return
PR_1_TOOBIG_REG; it should still return PR_1_TOOBIG_DIR, so the
message is not confusing.

Could you fix this, please? Thanks!!

- Ted

2018-12-13 21:32:43

by Artem Blagodarenko

[permalink] [raw]
Subject: [PATCH 2/2] debugfs: output large directory size

Use hight part of directory size in debugfs output.

Signed-off-by: Artem Blagodarenko <[email protected]>
---
debugfs/debugfs.c | 2 +-
debugfs/ls.c | 3 ---
2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index e03519c4..2e600b92 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -848,7 +848,7 @@ void internal_dump_inode(FILE *out, const char *prefix,
if (is_large_inode && large_inode->i_extra_isize >= 32)
fprintf(out, " Project: %5d", large_inode->i_projid);
fputs(" Size: ", out);
- if (LINUX_S_ISREG(inode->i_mode))
+ if (LINUX_S_ISREG(inode->i_mode) || LINUX_S_ISDIR(inode->i_mode))
fprintf(out, "%llu\n", EXT2_I_SIZE(inode));
else
fprintf(out, "%d\n", inode->i_size);
diff --git a/debugfs/ls.c b/debugfs/ls.c
index a1e8f4e9..41af15d2 100644
--- a/debugfs/ls.c
+++ b/debugfs/ls.c
@@ -152,9 +152,6 @@ static int list_dir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)),
fprintf(ls->f, "(%d) %5d %5d ",
ext2fs_dirent_file_type(dirent),
inode_uid(inode), inode_gid(inode));
- if (LINUX_S_ISDIR(inode.i_mode))
- fprintf(ls->f, "%5d", inode.i_size);
- else
fprintf(ls->f, "%5llu", EXT2_I_SIZE(&inode));
fprintf(ls->f, " %s ", datestr);
print_filename(ls->f, dirent, options);
--
2.14.3

2018-12-14 03:11:56

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH 2/2] debugfs: output large directory size

On Fri, Dec 14, 2018 at 12:31:56AM +0300, Artem Blagodarenko wrote:
> Use hight part of directory size in debugfs output.

"high", not "hight". Also, it would be better if the discription
explained the context of this being needed for directories with the
largedir feature being enabled.

Thanks,

- Ted