lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAO3qy=HcyNh7rV9vaTnvEeFpUTwJU4sTnKkFM=pfbagXAezUHg@mail.gmail.com>
Date:   Wed, 25 Jan 2017 20:20:42 +0300
From:   Artem Blagodarenko <artem.blagodarenko@...gate.com>
To:     linux-ext4@...r.kernel.org
Subject: [PATCH 1/3 v2] e2fsprogs: add support for 3-level htree

Hello,

Darrick J. Wong, thank you for inspection. Here is second version of the patch.

Changes since v1
* Part that removes dir_acl moved to separate patch "e2fsprogs:
supersede i_dir_acl with i_size_high for all  cases"

The INCOMPAT_LARGEDIR feature allows larger directories to
be created, both with directory sizes over 2GB and and a
maximum htree depth of 3 instead of the current limit of 2.
These features are needed in order to exceed the currently
limit of approximately 10M entries in a single directory.

debugfs, e2fsck, ext2fs, mke2fs and tune2fs support is
added.

This patch depends on "e2fsprogs: supersede i_dir_acl with i_size_high
for all  cases"

Signed-off-by: Alexey Lyashkov <alexey.lyashkov@...gate.com>
Signed-off-by: Artem Blagodarenko <artem.blagodarenko@...gate.com>
---
 e2fsck/pass1.c       |    2 +-
 e2fsck/pass2.c       |    3 ++-
 lib/ext2fs/ext2_fs.h |    3 ++-
 lib/ext2fs/ext2fs.h  |   15 ++++++++++++++-
 misc/mke2fs.c        |    3 ++-
 misc/tune2fs.c       |    3 ++-
 6 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 2d21aae..8444b37 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -2468,7 +2468,7 @@ static int handle_htree(e2fsck_t ctx, struct
problem_context *pctx,
         return 1;

     pctx->num = root->indirect_levels;
-    if ((root->indirect_levels > 1) &&
+    if ((root->indirect_levels > ext2_dir_htree_level(fs)) &&
         fix_problem(ctx, PR_1_HTREE_DEPTH, pctx))
         return 1;

diff --git a/e2fsck/pass2.c b/e2fsck/pass2.c
index 3b141db..7ded7bb 100644
--- a/e2fsck/pass2.c
+++ b/e2fsck/pass2.c
@@ -1058,7 +1058,8 @@ inline_read_fail:
             dx_db->flags |= DX_FLAG_FIRST | DX_FLAG_LAST;
             if ((root->reserved_zero ||
                  root->info_length < 8 ||
-                 root->indirect_levels > 1) &&
+                 root->indirect_levels
+                > ext2_dir_htree_level(fs)) &&
                 fix_problem(ctx, PR_2_HTREE_BAD_ROOT, &cd->pctx)) {
                 clear_htree(ctx, ino);
                 dx_dir->numblocks = 0;
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 195e366..6d9a5d0 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -921,7 +921,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(encrypt,        4, ENCRYPT)

 #define EXT2_FEATURE_COMPAT_SUPP    0
 #define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE| \
-                       EXT4_FEATURE_INCOMPAT_MMP)
+                       EXT4_FEATURE_INCOMPAT_MMP|\
+                       EXT4_FEATURE_INCOMPAT_LARGEDIR)
 #define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                      EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
                      EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index 786ded8..5e956d0 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -588,7 +588,8 @@ typedef struct ext2_icount *ext2_icount_t;
                      EXT4_FEATURE_INCOMPAT_64BIT|\
                      EXT4_FEATURE_INCOMPAT_INLINE_DATA|\
                      EXT4_FEATURE_INCOMPAT_ENCRYPT|\
-                     EXT4_FEATURE_INCOMPAT_CSUM_SEED)
+                     EXT4_FEATURE_INCOMPAT_CSUM_SEED|\
+                     EXT4_FEATURE_INCOMPAT_LARGEDIR)

 #define EXT2_LIB_FEATURE_RO_COMPAT_SUPP
(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
                      EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
@@ -1924,6 +1925,18 @@ _INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
     return (blk_t) ext2fs_inode_data_blocks2(fs, inode);
 }

+/* htree levels for ext4 */
+#define EXT4_HTREE_LEVEL_COMPAT 1
+#define EXT4_HTREE_LEVEL    3
+
+_INLINE_ unsigned int ext2_dir_htree_level(ext2_filsys fs)
+{
+        if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
+                          EXT4_FEATURE_INCOMPAT_LARGEDIR))
+                    return EXT4_HTREE_LEVEL;
+            return EXT4_HTREE_LEVEL_COMPAT;
+}
+
 /*
  * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
  */
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 9f18c83..b2bf461 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -1081,7 +1081,8 @@ static __u32 ok_features[3] = {
         EXT4_FEATURE_INCOMPAT_64BIT|
         EXT4_FEATURE_INCOMPAT_INLINE_DATA|
         EXT4_FEATURE_INCOMPAT_ENCRYPT |
-        EXT4_FEATURE_INCOMPAT_CSUM_SEED,
+        EXT4_FEATURE_INCOMPAT_CSUM_SEED |
+        EXT4_FEATURE_INCOMPAT_LARGEDIR,
     /* R/O compat */
     EXT2_FEATURE_RO_COMPAT_LARGE_FILE|
         EXT4_FEATURE_RO_COMPAT_HUGE_FILE|
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
index 6239577..f78d105 100644
--- a/misc/tune2fs.c
+++ b/misc/tune2fs.c
@@ -156,7 +156,8 @@ static __u32 ok_features[3] = {
         EXT4_FEATURE_INCOMPAT_MMP |
         EXT4_FEATURE_INCOMPAT_64BIT |
         EXT4_FEATURE_INCOMPAT_ENCRYPT |
-        EXT4_FEATURE_INCOMPAT_CSUM_SEED,
+        EXT4_FEATURE_INCOMPAT_CSUM_SEED |
+        EXT4_FEATURE_INCOMPAT_LARGEDIR,
     /* R/O compat */
     EXT2_FEATURE_RO_COMPAT_LARGE_FILE |
         EXT4_FEATURE_RO_COMPAT_HUGE_FILE|
--

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ