From 4a11f499573c71fde91623f45146fdc60a4bb89c Mon Sep 17 00:00:00 2001 From: Li Dongyang Date: Tue, 13 Nov 2018 15:46:03 +1100 Subject: [PATCH] e2fsck: check xattr 'system.data' before setting inline_data feature ext2fs_inline_data_size will happy return 0 and set size to EXT4_MIN_INLINE_DATA_SIZE even when inode doesn't have xattr 'system.data', a corrupted i_flags could make e2fsck enable the inline_data on the superblock. We should only offer to enable inline_data when i_flags is set and xattr 'system.data' can be found. Also use correct prompt for PR_1_INLINE_DATA_FEATURE. Signed-off-by: Li Dongyang --- e2fsck/pass1.c | 4 ++-- e2fsck/problem.c | 2 +- tests/f_inlinedata_flags/expect.1 | 26 ++++++++++++++++++++++++++ tests/f_inlinedata_flags/expect.2 | 7 +++++++ tests/f_inlinedata_flags/image.gz | Bin 0 -> 11226 bytes tests/f_inlinedata_flags/name | 1 + 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 tests/f_inlinedata_flags/expect.1 create mode 100644 tests/f_inlinedata_flags/expect.2 create mode 100644 tests/f_inlinedata_flags/image.gz create mode 100644 tests/f_inlinedata_flags/name diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 8abf0c33a..45534388a 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -1496,8 +1496,8 @@ void e2fsck_pass1(e2fsck_t ctx) (ino >= EXT2_FIRST_INODE(fs->super))) { size_t size = 0; - pctx.errcode = ext2fs_inline_data_size(fs, ino, &size); - if (!pctx.errcode && size && + pctx.errcode = get_inline_data_ea_size(fs, ino, &size); + if (!pctx.errcode && fix_problem(ctx, PR_1_INLINE_DATA_FEATURE, &pctx)) { ext2fs_set_feature_inline_data(sb); ext2fs_mark_super_dirty(fs); diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 932cad3cd..4082e373e 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -1063,7 +1063,7 @@ static struct e2fsck_problem problem_table[] = { /* Inode has inline data, but superblock is missing INLINE_DATA feature */ { PR_1_INLINE_DATA_FEATURE, N_("@i %i has inline data, but @S is missing INLINE_DATA feature\n"), - PROMPT_CLEAR, PR_PREEN_OK, 0, 0, 0 }, + PROMPT_FIX, PR_PREEN_OK, 0, 0, 0 }, /* inode has INLINE_DATA_FL flag on filesystem without inline data */ { PR_1_INLINE_DATA_SET, diff --git a/tests/f_inlinedata_flags/expect.1 b/tests/f_inlinedata_flags/expect.1 new file mode 100644 index 000000000..86eba8833 --- /dev/null +++ b/tests/f_inlinedata_flags/expect.1 @@ -0,0 +1,26 @@ +Pass 1: Checking inodes, blocks, and sizes +Inode 12 has INLINE_DATA_FL flag on filesystem without inline data support. +Clear? yes + +Inode 13 has inline data, but superblock is missing INLINE_DATA feature +Fix? yes + +Pass 2: Checking directory structure +Entry '1' in / (2) has deleted/unused inode 12. Clear? yes + +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Inode bitmap differences: -12 +Fix? yes + +Free inodes count wrong for group #0 (243, counted=244). +Fix? yes + +Free inodes count wrong (243, counted=244). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 12/256 files (0.0% non-contiguous), 1143/8192 blocks +Exit status is 1 diff --git a/tests/f_inlinedata_flags/expect.2 b/tests/f_inlinedata_flags/expect.2 new file mode 100644 index 000000000..87b3f18b0 --- /dev/null +++ b/tests/f_inlinedata_flags/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 12/256 files (0.0% non-contiguous), 1143/8192 blocks +Exit status is 0 diff --git a/tests/f_inlinedata_flags/image.gz b/tests/f_inlinedata_flags/image.gz new file mode 100644 index 0000000000000000000000000000000000000000..4344a0a8cc0d711c10beca1ff0ef174d4357f523 GIT binary patch literal 11226 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 literal 0 Hc-jL100001 diff --git a/tests/f_inlinedata_flags/name b/tests/f_inlinedata_flags/name new file mode 100644 index 000000000..66b7676a8 --- /dev/null +++ b/tests/f_inlinedata_flags/name @@ -0,0 +1 @@ +check incorrect inline_data flags -- 2.47.2