]> Git Repo - linux.git/commitdiff
erofs: use read_cache_page_gfp for erofs_get_meta_page
authorGao Xiang <[email protected]>
Wed, 4 Sep 2019 02:09:12 +0000 (10:09 +0800)
committerGreg Kroah-Hartman <[email protected]>
Thu, 5 Sep 2019 18:10:09 +0000 (20:10 +0200)
As Christoph said [1], "I'd much prefer to just use
read_cache_page_gfp, and live with the fact that this
allocates bufferheads behind you for now.  I'll try to
speed up my attempts to get rid of the buffer heads on
the block device mapping instead. "

This simplifies the code a lot and a minor thing is
"no REQ_META (e.g. for blktrace) on metadata at all..."

[1] https://lore.kernel.org/r/20190903153704[email protected]/
Reported-by: Christoph Hellwig <[email protected]>
Signed-off-by: Gao Xiang <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
fs/erofs/data.c

index eb7bbae89ed017b7c99860ea942aa97f439b8f66..8a9fcbd0e8ac197fbe22d04c23fc66bb9feff7b8 100644 (file)
@@ -32,71 +32,13 @@ static void erofs_readendio(struct bio *bio)
        bio_put(bio);
 }
 
-static struct bio *erofs_grab_raw_bio(struct super_block *sb,
-                                     erofs_blk_t blkaddr,
-                                     unsigned int nr_pages,
-                                     bool ismeta)
-{
-       struct bio *bio = bio_alloc(GFP_NOIO, nr_pages);
-
-       bio->bi_end_io = erofs_readendio;
-       bio_set_dev(bio, sb->s_bdev);
-       bio->bi_iter.bi_sector = (sector_t)blkaddr << LOG_SECTORS_PER_BLOCK;
-       if (ismeta)
-               bio->bi_opf = REQ_OP_READ | REQ_META;
-       else
-               bio->bi_opf = REQ_OP_READ;
-
-       return bio;
-}
-
 struct page *erofs_get_meta_page(struct super_block *sb, erofs_blk_t blkaddr)
 {
        struct inode *const bd_inode = sb->s_bdev->bd_inode;
        struct address_space *const mapping = bd_inode->i_mapping;
-       const gfp_t gfp = mapping_gfp_constraint(mapping, ~__GFP_FS);
-       struct page *page;
-       int err;
-
-repeat:
-       page = find_or_create_page(mapping, blkaddr, gfp);
-       if (!page)
-               return ERR_PTR(-ENOMEM);
-
-       DBG_BUGON(!PageLocked(page));
-
-       if (!PageUptodate(page)) {
-               struct bio *bio;
-
-               bio = erofs_grab_raw_bio(sb, blkaddr, 1, true);
-
-               if (bio_add_page(bio, page, PAGE_SIZE, 0) != PAGE_SIZE) {
-                       err = -EFAULT;
-                       goto err_out;
-               }
-
-               submit_bio(bio);
-               lock_page(page);
 
-               /* this page has been truncated by others */
-               if (page->mapping != mapping) {
-                       unlock_page(page);
-                       put_page(page);
-                       goto repeat;
-               }
-
-               /* more likely a read error */
-               if (!PageUptodate(page)) {
-                       err = -EIO;
-                       goto err_out;
-               }
-       }
-       return page;
-
-err_out:
-       unlock_page(page);
-       put_page(page);
-       return ERR_PTR(err);
+       return read_cache_page_gfp(mapping, blkaddr,
+                                  mapping_gfp_constraint(mapping, ~__GFP_FS));
 }
 
 static int erofs_map_blocks_flatmode(struct inode *inode,
@@ -272,7 +214,13 @@ submit_bio_retry:
                if (nblocks > BIO_MAX_PAGES)
                        nblocks = BIO_MAX_PAGES;
 
-               bio = erofs_grab_raw_bio(sb, blknr, nblocks, false);
+               bio = bio_alloc(GFP_NOIO, nblocks);
+
+               bio->bi_end_io = erofs_readendio;
+               bio_set_dev(bio, sb->s_bdev);
+               bio->bi_iter.bi_sector = (sector_t)blknr <<
+                       LOG_SECTORS_PER_BLOCK;
+               bio->bi_opf = REQ_OP_READ;
        }
 
        err = bio_add_page(bio, page, PAGE_SIZE, 0);
This page took 0.049327 seconds and 4 git commands to generate.