From 4202dcdf96f36ab7934e14cc62abf6f94d0e1a8c Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Thu, 23 May 2019 22:59:45 -0400 Subject: [PATCH] add patch dont-perform-block-validity-checks-on-the-journal-inode --- ...form-block-validity-checks-on-the-journal-inode | 48 ++++++++++++++++++++++ series | 1 + timestamps | 8 ++-- 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 dont-perform-block-validity-checks-on-the-journal-inode diff --git a/dont-perform-block-validity-checks-on-the-journal-inode b/dont-perform-block-validity-checks-on-the-journal-inode new file mode 100644 index 00000000..3331a75f --- /dev/null +++ b/dont-perform-block-validity-checks-on-the-journal-inode @@ -0,0 +1,48 @@ +ext4: don't perform block validity checks on the journal inode + +Since the journal inode is already checked when we added it to the +block validity's system zone, if we check it again, we'll just trigger +a failure. + +This was causing failures like this: + +[ 53.897001] EXT4-fs error (device sda): ext4_find_extent:909: inode +#8: comm jbd2/sda-8: pblk 121667583 bad header/extent: invalid extent entries - magic f30a, entries 8, max 340(340), depth 0(0) +[ 53.931430] jbd2_journal_bmap: journal block not found at offset 49 on sda-8 +[ 53.938480] Aborting journal on device sda-8. + +... but only if the system was under enough memory pressure that +logical->physical mapping for the journal inode gets pushed out of the +extent cache. (This is why it wasn't noticed earlier.) + +Fixes: 345c0dbf3a30 ("ext4: protect journal inode's blocks using block_validity") +Reported-by: Dan Rue +Signed-off-by: Theodore Ts'o +Tested-by: Naresh Kamboju +--- + fs/ext4/extents.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c +index f2c62e2a0c98..d40ed940001e 100644 +--- a/fs/ext4/extents.c ++++ b/fs/ext4/extents.c +@@ -518,10 +518,14 @@ __read_extent_tree_block(const char *function, unsigned int line, + } + if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE)) + return bh; +- err = __ext4_ext_check(function, line, inode, +- ext_block_hdr(bh), depth, pblk); +- if (err) +- goto errout; ++ if (!ext4_has_feature_journal(inode->i_sb) || ++ (inode->i_ino != ++ le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) { ++ err = __ext4_ext_check(function, line, inode, ++ ext_block_hdr(bh), depth, pblk); ++ if (err) ++ goto errout; ++ } + set_buffer_verified(bh); + /* + * If this is a leaf block, cache all of its entries diff --git a/series b/series index dcfb80ca..252597ee 100644 --- a/series +++ b/series @@ -10,6 +10,7 @@ unicode-add-missing-utf8lookup-check unicode-update-to-12.1-final fix-ext3-block-validity-checks avoid-panic-during-forced-reboot-due-to-aborted-journal +dont-perform-block-validity-checks-on-the-journal-inode #fix-slow-writeback-under-dioread_nolock-and-nodelalloc diff --git a/timestamps b/timestamps index afc28a5c..6c0dd32a 100755 --- a/timestamps +++ b/timestamps @@ -21,8 +21,8 @@ touch -d @1557651411 unicode-add-missing-utf8lookup-check touch -d @1557681968 unicode-update-to-12.1-final touch -d @1557895879 fix-ext3-block-validity-checks touch -d @1558129038 avoid-panic-during-forced-reboot-due-to-aborted-journal -touch -d @1558472044 series -touch -d @1558472461 dont-perform-block-validity-checks-on-the-journal-inode touch -d @1558472521 stable-boundary -touch -d @1558501389 status -touch -d @1558535169 timestamps +touch -d @1558535203 series +touch -d @1558535221 dont-perform-block-validity-checks-on-the-journal-inode +touch -d @1558535243 status +touch -d @1558666776 timestamps -- 2.11.4.GIT