From: Yu Kuai <yuku...@huawei.com>

Avoid to access bd_inode directly, prepare to remove bd_inode from
block_devcie.

Signed-off-by: Yu Kuai <yuku...@huawei.com>
---
 fs/ext4/dir.c               |  6 ++----
 fs/ext4/ext4_jbd2.c         |  6 +++---
 fs/ext4/super.c             | 27 ++++-----------------------
 include/linux/buffer_head.h |  5 +++--
 4 files changed, 12 insertions(+), 32 deletions(-)

diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
index 3985f8c33f95..64e35eb6a324 100644
--- a/fs/ext4/dir.c
+++ b/fs/ext4/dir.c
@@ -191,10 +191,8 @@ static int ext4_readdir(struct file *file, struct 
dir_context *ctx)
                        pgoff_t index = map.m_pblk >>
                                        (PAGE_SHIFT - inode->i_blkbits);
                        if (!ra_has_index(&file->f_ra, index))
-                               page_cache_sync_readahead(
-                                       sb->s_bdev->bd_inode->i_mapping,
-                                       &file->f_ra, file,
-                                       index, 1);
+                               bdev_sync_readahead(sb->s_bdev, &file->f_ra,
+                                                   file, index, 1);
                        file->f_ra.prev_pos = (loff_t)index << PAGE_SHIFT;
                        bh = ext4_bread(NULL, inode, map.m_lblk, 0);
                        if (IS_ERR(bh)) {
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
index d1a2e6624401..c1bf3a00fad9 100644
--- a/fs/ext4/ext4_jbd2.c
+++ b/fs/ext4/ext4_jbd2.c
@@ -206,7 +206,6 @@ static void ext4_journal_abort_handle(const char *caller, 
unsigned int line,
 
 static void ext4_check_bdev_write_error(struct super_block *sb)
 {
-       struct address_space *mapping = sb->s_bdev->bd_inode->i_mapping;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        int err;
 
@@ -216,9 +215,10 @@ static void ext4_check_bdev_write_error(struct super_block 
*sb)
         * we could read old data from disk and write it out again, which
         * may lead to on-disk filesystem inconsistency.
         */
-       if (errseq_check(&mapping->wb_err, READ_ONCE(sbi->s_bdev_wb_err))) {
+       if (bdev_wb_err_check(sb->s_bdev, READ_ONCE(sbi->s_bdev_wb_err))) {
                spin_lock(&sbi->s_bdev_wb_lock);
-               err = errseq_check_and_advance(&mapping->wb_err, 
&sbi->s_bdev_wb_err);
+               err = bdev_wb_err_check_and_advance(sb->s_bdev,
+                                                   &sbi->s_bdev_wb_err);
                spin_unlock(&sbi->s_bdev_wb_lock);
                if (err)
                        ext4_error_err(sb, -err,
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 0980845c8b8f..243671d86db3 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -244,8 +244,7 @@ static struct buffer_head *__ext4_sb_bread_gfp(struct 
super_block *sb,
 struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block,
                                   blk_opf_t op_flags)
 {
-       gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping,
-                       ~__GFP_FS) | __GFP_MOVABLE;
+       gfp_t gfp = bdev_gfp_constraint(sb->s_bdev, ~__GFP_FS) | __GFP_MOVABLE;
 
        return __ext4_sb_bread_gfp(sb, block, op_flags, gfp);
 }
@@ -253,8 +252,7 @@ struct buffer_head *ext4_sb_bread(struct super_block *sb, 
sector_t block,
 struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb,
                                            sector_t block)
 {
-       gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping,
-                       ~__GFP_FS);
+       gfp_t gfp = bdev_gfp_constraint(sb->s_bdev, ~__GFP_FS);
 
        return __ext4_sb_bread_gfp(sb, block, 0, gfp);
 }
@@ -492,22 +490,6 @@ static void ext4_maybe_update_superblock(struct 
super_block *sb)
                schedule_work(&EXT4_SB(sb)->s_sb_upd_work);
 }
 
-/*
- * The del_gendisk() function uninitializes the disk-specific data
- * structures, including the bdi structure, without telling anyone
- * else.  Once this happens, any attempt to call mark_buffer_dirty()
- * (for example, by ext4_commit_super), will cause a kernel OOPS.
- * This is a kludge to prevent these oops until we can put in a proper
- * hook in del_gendisk() to inform the VFS and file system layers.
- */
-static int block_device_ejected(struct super_block *sb)
-{
-       struct inode *bd_inode = sb->s_bdev->bd_inode;
-       struct backing_dev_info *bdi = inode_to_bdi(bd_inode);
-
-       return bdi->dev == NULL;
-}
-
 static void ext4_journal_commit_callback(journal_t *journal, transaction_t 
*txn)
 {
        struct super_block              *sb = journal->j_private;
@@ -5585,8 +5567,7 @@ static int __ext4_fill_super(struct fs_context *fc, 
struct super_block *sb)
         * used to detect the metadata async write error.
         */
        spin_lock_init(&sbi->s_bdev_wb_lock);
-       errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err,
-                                &sbi->s_bdev_wb_err);
+       bdev_wb_err_check_and_advance(sb->s_bdev, &sbi->s_bdev_wb_err);
        EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;
        ext4_orphan_cleanup(sb, es);
        EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS;
@@ -6185,7 +6166,7 @@ static int ext4_commit_super(struct super_block *sb)
 
        if (!sbh)
                return -EINVAL;
-       if (block_device_ejected(sb))
+       if (bdev_ejected(sb->s_bdev))
                return -ENODEV;
 
        ext4_update_super(sb);
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
index 5f23ee599889..3a88b295b4f2 100644
--- a/include/linux/buffer_head.h
+++ b/include/linux/buffer_head.h
@@ -15,6 +15,7 @@
 #include <linux/pagemap.h>
 #include <linux/wait.h>
 #include <linux/atomic.h>
+#include <linux/blkdev.h>
 
 enum bh_state_bits {
        BH_Uptodate,    /* Contains valid data */
@@ -341,7 +342,7 @@ static inline struct buffer_head *getblk_unmovable(struct 
block_device *bdev,
 {
        gfp_t gfp;
 
-       gfp = mapping_gfp_constraint(bdev->bd_inode->i_mapping, ~__GFP_FS);
+       gfp = bdev_gfp_constraint(bdev, ~__GFP_FS);
        gfp |= __GFP_NOFAIL;
 
        return bdev_getblk(bdev, block, size, gfp);
@@ -352,7 +353,7 @@ static inline struct buffer_head *__getblk(struct 
block_device *bdev,
 {
        gfp_t gfp;
 
-       gfp = mapping_gfp_constraint(bdev->bd_inode->i_mapping, ~__GFP_FS);
+       gfp = bdev_gfp_constraint(bdev, ~__GFP_FS);
        gfp |= __GFP_MOVABLE | __GFP_NOFAIL;
 
        return bdev_getblk(bdev, block, size, gfp);
-- 
2.39.2


Reply via email to