erofs: use read_mapping_page instead of sb_bread
authorGao Xiang <gaoxiang25@huawei.com>
Wed, 4 Sep 2019 02:09:10 +0000 (10:09 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Sep 2019 18:10:09 +0000 (20:10 +0200)
As Christoph said [1], "This seems to be your only direct
use of buffer heads, which while not deprecated are a bit
of an ugly step child.  So if you can easily avoid creating
a buffer_head dependency in a new filesystem I think you
should avoid it. "

[1] https://lore.kernel.org/r/20190902125109.GA9826@infradead.org/
Reported-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
Link: https://lore.kernel.org/r/20190904020912.63925-24-gaoxiang25@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/erofs/super.c

index 1d98801..caf9a95 100644 (file)
@@ -98,20 +98,22 @@ static bool check_layout_compatibility(struct super_block *sb,
 static int erofs_read_superblock(struct super_block *sb)
 {
        struct erofs_sb_info *sbi;
-       struct buffer_head *bh;
+       struct page *page;
        struct erofs_super_block *dsb;
        unsigned int blkszbits;
+       void *data;
        int ret;
 
-       bh = sb_bread(sb, 0);
-
-       if (!bh) {
+       page = read_mapping_page(sb->s_bdev->bd_inode->i_mapping, 0, NULL);
+       if (!page) {
                erofs_err(sb, "cannot read erofs superblock");
                return -EIO;
        }
 
        sbi = EROFS_SB(sb);
-       dsb = (struct erofs_super_block *)(bh->b_data + EROFS_SUPER_OFFSET);
+
+       data = kmap_atomic(page);
+       dsb = (struct erofs_super_block *)(data + EROFS_SUPER_OFFSET);
 
        ret = -EINVAL;
        if (le32_to_cpu(dsb->magic) != EROFS_SUPER_MAGIC_V1) {
@@ -153,7 +155,8 @@ static int erofs_read_superblock(struct super_block *sb)
        }
        ret = 0;
 out:
-       brelse(bh);
+       kunmap_atomic(data);
+       put_page(page);
        return ret;
 }