提交 b4cd9a85 编写于 作者: Z zhangyi (F) 提交者: Yang Yingliang

ext4: introduce ext4_sb_breadahead_unmovable() to replace sb_breadahead_unmovable()

mainline inclusion
from mainline-5.10-rc1
commit 5df1d412
category: bugfix
bugzilla: 51832
CVE: NA
---------------------------

If we readahead inode tables in __ext4_get_inode_loc(), it may bypass
buffer_write_io_error() check, so introduce ext4_sb_breadahead_unmovable()
to handle this special case.

This patch also replace sb_breadahead_unmovable() in ext4_fill_super()
for the sake of unification.
Signed-off-by: Nzhangyi (F) <yi.zhang@huawei.com>
Link: https://lore.kernel.org/r/20200924073337.861472-6-yi.zhang@huawei.comSigned-off-by: NTheodore Ts'o <tytso@mit.edu>
Signed-off-by: Nyangerkun <yangerkun@huawei.com>
Reviewed-by: Nzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 bb81ef93
...@@ -2727,6 +2727,7 @@ extern void ext4_read_bh_nowait(struct buffer_head *bh, int op_flags, ...@@ -2727,6 +2727,7 @@ extern void ext4_read_bh_nowait(struct buffer_head *bh, int op_flags,
extern int ext4_read_bh(struct buffer_head *bh, int op_flags, extern int ext4_read_bh(struct buffer_head *bh, int op_flags,
bh_end_io_t *end_io); bh_end_io_t *end_io);
extern int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait); extern int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait);
extern void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block);
extern int ext4_seq_options_show(struct seq_file *seq, void *offset); extern int ext4_seq_options_show(struct seq_file *seq, void *offset);
extern int ext4_calculate_overhead(struct super_block *sb); extern int ext4_calculate_overhead(struct super_block *sb);
extern void ext4_superblock_csum_set(struct super_block *sb); extern void ext4_superblock_csum_set(struct super_block *sb);
......
...@@ -4707,7 +4707,7 @@ static int __ext4_get_inode_loc(struct inode *inode, ...@@ -4707,7 +4707,7 @@ static int __ext4_get_inode_loc(struct inode *inode,
if (end > table) if (end > table)
end = table; end = table;
while (b <= end) while (b <= end)
sb_breadahead_unmovable(sb, b++); ext4_sb_breadahead_unmovable(sb, b++);
} }
/* /*
......
...@@ -236,6 +236,16 @@ ext4_sb_bread(struct super_block *sb, sector_t block, int op_flags) ...@@ -236,6 +236,16 @@ ext4_sb_bread(struct super_block *sb, sector_t block, int op_flags)
return bh; return bh;
} }
void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block)
{
struct buffer_head *bh = sb_getblk_gfp(sb, block, 0);
if (likely(bh)) {
ext4_read_bh_lock(bh, REQ_RAHEAD, false);
brelse(bh);
}
}
static int ext4_verify_csum_type(struct super_block *sb, static int ext4_verify_csum_type(struct super_block *sb,
struct ext4_super_block *es) struct ext4_super_block *es)
{ {
...@@ -4374,7 +4384,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) ...@@ -4374,7 +4384,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
/* Pre-read the descriptors into the buffer cache */ /* Pre-read the descriptors into the buffer cache */
for (i = 0; i < db_count; i++) { for (i = 0; i < db_count; i++) {
block = descriptor_loc(sb, logical_sb_block, i); block = descriptor_loc(sb, logical_sb_block, i);
sb_breadahead_unmovable(sb, block); ext4_sb_breadahead_unmovable(sb, block);
} }
for (i = 0; i < db_count; i++) { for (i = 0; i < db_count; i++) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册