提交 0a944e8a 编写于 作者: T Theodore Ts'o

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: 345c0dbf ("ext4: protect journal inode's blocks using block_validity")
Reported-by: NDan Rue <dan.rue@linaro.org>
Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
Tested-by: NNaresh Kamboju <naresh.kamboju@linaro.org>
上级 2c1d0e36
...@@ -518,10 +518,14 @@ __read_extent_tree_block(const char *function, unsigned int line, ...@@ -518,10 +518,14 @@ __read_extent_tree_block(const char *function, unsigned int line,
} }
if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE)) if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE))
return bh; return bh;
err = __ext4_ext_check(function, line, inode, if (!ext4_has_feature_journal(inode->i_sb) ||
ext_block_hdr(bh), depth, pblk); (inode->i_ino !=
if (err) le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) {
goto errout; err = __ext4_ext_check(function, line, inode,
ext_block_hdr(bh), depth, pblk);
if (err)
goto errout;
}
set_buffer_verified(bh); set_buffer_verified(bh);
/* /*
* If this is a leaf block, cache all of its entries * If this is a leaf block, cache all of its entries
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册