From b3105cb666a7a8447e08cf3ab49b8e60426b21cc Mon Sep 17 00:00:00 2001 From: Lukas Czerner Date: Wed, 8 Aug 2018 13:52:56 +0200 Subject: [PATCH 03/10] e2fsck: remove resize inode if both resize_inode and meta_bg are enabled Previous e2fsprogs versions allowed to create a file system with both resize_inode and meta_bg enabled. This was fixed by upstream commit 42e77d5d ("libext2fs: don't create filesystems with meta_bg and resize_inode") However e2fsck still does not recognize the conflict and will attempt to clear and recreate resize_inode if it's corrupted due to this incompatible feature combination, though it will create it in the same wrong layout. Fix it by teaching e2fsck to recognize resize_inode and meta_bg conflict and fixing it by disabling and clearing resize inode. Signed-off-by: Lukas Czerner Reviewed-by: Andreas Dilger Signed-off-by: Theodore Ts'o --- e2fsck/problem.c | 6 ++++++ e2fsck/problem.h | 3 +++ e2fsck/super.c | 8 ++++++++ 3 files changed, 17 insertions(+) diff --git a/e2fsck/problem.c b/e2fsck/problem.c index a0a3cfec..ddd8c1c4 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -498,6 +498,12 @@ static struct e2fsck_problem problem_table[] = { N_("@S would have too many inodes (%N).\n"), PROMPT_NONE, PR_AFTER_CODE, PR_0_SB_CORRUPT }, + /* Meta_bg and resize_inode are not compatible, disable resize_inode*/ + { PR_0_DISABLE_RESIZE_INODE, + N_("Resize_@i and meta_bg features are enabled. Those features are\n" + "not compatible. Resize @i should be disabled. "), + PROMPT_FIX, 0 }, + /* Pass 1 errors */ /* Pass 1: Checking inodes, blocks, and sizes */ diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 7db122ab..2c79169e 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -285,6 +285,9 @@ struct problem_context { /* Inode count in the superblock incorrect */ #define PR_0_INODE_COUNT_BIG 0x000050 +/* Meta_bg and resize_inode are not compatible, remove resize_inode*/ +#define PR_0_DISABLE_RESIZE_INODE 0x000051 + /* * Pass 1 errors */ diff --git a/e2fsck/super.c b/e2fsck/super.c index eb7ab0d1..e5932be6 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -436,6 +436,14 @@ void check_resize_inode(e2fsck_t ctx) clear_problem_context(&pctx); + if (ext2fs_has_feature_resize_inode(fs->super) && + ext2fs_has_feature_meta_bg(fs->super) && + fix_problem(ctx, PR_0_DISABLE_RESIZE_INODE, &pctx)) { + ext2fs_clear_feature_resize_inode(fs->super); + fs->super->s_reserved_gdt_blocks = 0; + ext2fs_mark_super_dirty(fs); + } + /* * If the resize inode feature isn't set, then * s_reserved_gdt_blocks must be zero. -- 2.17.2