From patchwork Mon Feb 13 09:20:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artem Blagodarenko X-Patchwork-Id: 727439 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vMXdj6tYlz9s7J for ; Tue, 14 Feb 2017 04:31:05 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="W+avk0rc"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753167AbdBMRbE (ORCPT ); Mon, 13 Feb 2017 12:31:04 -0500 Received: from mail-it0-f65.google.com ([209.85.214.65]:33929 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753154AbdBMRbC (ORCPT ); Mon, 13 Feb 2017 12:31:02 -0500 Received: by mail-it0-f65.google.com with SMTP id r141so3355055ita.1 for ; Mon, 13 Feb 2017 09:31:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5LV+JjUSjCCHAuwGC8L5NorQ34dpyumngI6m8jHYi6M=; b=W+avk0rcK+WK5M93N9j4gGMzBUsCREDOfmquLWXceODfVDjKEioKiN6r97rqg5KQlN t+fWcq2mDUyTZveHh+6vHfkFtByAmTLooOQvbY/AdJbdjN29OgXjEPFcI2nTlyqMKNPK 4+dOsVGM4Uwf8gr88Gtr13646D1ri2srgc0JXTgq5+osYWmGzOqcQqRwMYH74rj4vwo1 DYtYB3vgctlkniQRhc9D2Ekm5tD/Tpdjw6Dp3SgcVafU0ZMoFJ6WhJxHqNhLnxeSHfJ6 K0EAXtzdKBVFzKk80DJe7xPV30HM5E4U2N1laRUPJiLmWfnYwia8ZP/D655oIZcY3VcI 4nvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5LV+JjUSjCCHAuwGC8L5NorQ34dpyumngI6m8jHYi6M=; b=Pdlsh0WR4ylYMBHz33GgXAYCX3IxjheLMVDjuIf1v7PtcsWwj/LdiEpxobjX4sBsRi MJ1hR2JzSAuR+nOt0ztXa21jUfUvhkO56IYqw+LkjYmxdEBheOjYQHai4cR3E7DWto5m oSlGOrzGeDoRiCJPoa7wRHXS77Fq3i+DL0QtmaWKV6xDHn+eP6cY+vnnppJWIRfTZu1h RuORFOUo3RzX3J+Ag9xPty9CW0wVtjwgNi4HxEVw2hu38VWxbmSaNnwybebujD7KVh9x HF0oo7YZJGxyuxjipHFqDlwQXQNnybZzX95xejL17W4pfVqVn85CUVUHugyQftQiSwQQ lfOA== X-Gm-Message-State: AMke39mGGomqLgdpowiyjtCBu2HHSJz/dhQ9/29eHdBR3fMjK9TS3hCgx0foltKgy1q76w== X-Received: by 10.36.94.75 with SMTP id h72mr21520474itb.81.1487007061460; Mon, 13 Feb 2017 09:31:01 -0800 (PST) Received: from localhost.localdomain ([91.105.193.96]) by smtp.googlemail.com with ESMTPSA id v197sm47979ita.2.2017.02.13.09.31.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Feb 2017 09:31:01 -0800 (PST) From: Artem Blagodarenko To: linux-ext4@vger.kernel.org Cc: adilger.kernel@dilger.ca Subject: [PATCH v2 2/4] e2fsprogs: add support for 3-level htree Date: Mon, 13 Feb 2017 12:20:15 +0300 Message-Id: <1486977617-17216-3-git-send-email-artem.blagodarenko@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1486977617-17216-1-git-send-email-artem.blagodarenko@gmail.com> References: <1486977617-17216-1-git-send-email-artem.blagodarenko@gmail.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Artem Blagodarenko 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. Signed-off-by: Alexey Lyashkov Signed-off-by: Artem Blagodarenko Reviewed-by: Andreas Dilger --- e2fsck/pass1.c | 5 +++-- e2fsck/pass2.c | 5 +++-- lib/ext2fs/ext2_fs.h | 3 ++- lib/ext2fs/ext2fs.h | 21 ++++++++++++++++++++- misc/mke2fs.c | 3 ++- misc/tune2fs.c | 3 ++- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index ce37176..fff7dcf 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -1716,7 +1716,8 @@ void e2fsck_pass1(e2fsck_t ctx) } if (inode->i_faddr || frag || fsize || - (LINUX_S_ISDIR(inode->i_mode) && inode->i_size_high)) + (!ext2fs_has_feature_large_dir(fs) && + (LINUX_S_ISDIR(inode->i_mode) && inode->i_size_high))) mark_inode_bad(ctx, ino); if ((fs->super->s_creator_os != EXT2_OS_HURD) && !ext2fs_has_feature_64bit(fs->super) && @@ -2469,7 +2470,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 b89ebc9..139d48f 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; @@ -1811,7 +1812,7 @@ int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir, } else not_fixed++; } - if (inode.i_size_high && + if (inode.i_size_high && !ext2fs_has_feature_large_dir(fs) && LINUX_S_ISDIR(inode.i_mode)) { if (fix_problem(ctx, PR_2_DIR_SIZE_HIGH_ZERO, &pctx)) { inode.i_size_high = 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..d714b44 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,24 @@ _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_ int ext2fs_has_feature_large_dir(ext2_filsys fs) +{ + return EXT2_HAS_INCOMPAT_FEATURE(fs->super, + EXT4_FEATURE_INCOMPAT_LARGEDIR); +} + +_INLINE_ unsigned int ext2_dir_htree_level(ext2_filsys fs) +{ + if (ext2fs_has_feature_large_dir(fs)) + 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|