ext4: introduce ext4_sb_breadahead_unmovable() to replace sb_breadahead_unmovable()
authorzhangyi (F) <yi.zhang@huawei.com>
Thu, 24 Sep 2020 07:33:35 +0000 (15:33 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 18 Oct 2020 14:37:14 +0000 (10:37 -0400)
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>
fs/ext4/ext4.h
fs/ext4/inode.c
fs/ext4/super.c

index 199afbf..caef3aa 100644 (file)
@@ -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,
                        bh_end_io_t *end_io);
 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_calculate_overhead(struct super_block *sb);
 extern void ext4_superblock_csum_set(struct super_block *sb);
index 39c02dc..3630b49 100644 (file)
@@ -4381,7 +4381,7 @@ make_io:
                        if (end > table)
                                end = table;
                        while (b <= end)
-                               sb_breadahead_unmovable(sb, b++);
+                               ext4_sb_breadahead_unmovable(sb, b++);
                }
 
                /*
index 77492cc..4a0887e 100644 (file)
@@ -229,6 +229,16 @@ ext4_sb_bread(struct super_block *sb, sector_t block, int op_flags)
        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,
                                 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 */
        for (i = 0; i < db_count; 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++) {