mirror of https://gitee.com/openkylin/linux.git
ext4: introduce ext4_sb_breadahead_unmovable() to replace sb_breadahead_unmovable()
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: zhangyi (F) <yi.zhang@huawei.com> Link: https://lore.kernel.org/r/20200924073337.861472-6-yi.zhang@huawei.com Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
60c776e50b
commit
5df1d4123d
|
@ -2828,6 +2828,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);
|
||||||
|
|
|
@ -4381,7 +4381,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++);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -229,6 +229,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)
|
||||||
{
|
{
|
||||||
|
@ -4556,7 +4566,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++) {
|
||||||
|
|
Loading…
Reference in New Issue