ext4: readpages() should submit IO as read-ahead
authorJens Axboe <axboe@kernel.dk>
Fri, 17 Aug 2018 22:45:42 +0000 (15:45 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 17 Aug 2018 23:20:29 +0000 (16:20 -0700)
a_ops->readpages() is only ever used for read-ahead.  Ensure that we
pass this information down to the block layer.

Link: http://lkml.kernel.org/r/20180621010725.17813-5-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Chris Mason <clm@fb.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ext4/ext4.h
fs/ext4/inode.c
fs/ext4/readpage.c

index 1fc013f3d944e9abe3bf79155be717b8bc76e1ce..0f0edd1cd0cd259f81eb0349e25ae9efb34641cc 100644 (file)
@@ -3062,7 +3062,7 @@ static inline void ext4_set_de_type(struct super_block *sb,
 /* readpages.c */
 extern int ext4_mpage_readpages(struct address_space *mapping,
                                struct list_head *pages, struct page *page,
-                               unsigned nr_pages);
+                               unsigned nr_pages, bool is_readahead);
 
 /* symlink.c */
 extern const struct inode_operations ext4_encrypted_symlink_inode_operations;
index 8f6ad766797403dac536d0743557898caae8256b..d0dd585add6a005684c569d6edaecc481f926f2d 100644 (file)
@@ -3325,7 +3325,8 @@ static int ext4_readpage(struct file *file, struct page *page)
                ret = ext4_readpage_inline(inode, page);
 
        if (ret == -EAGAIN)
-               return ext4_mpage_readpages(page->mapping, NULL, page, 1);
+               return ext4_mpage_readpages(page->mapping, NULL, page, 1,
+                                               false);
 
        return ret;
 }
@@ -3340,7 +3341,7 @@ ext4_readpages(struct file *file, struct address_space *mapping,
        if (ext4_has_inline_data(inode))
                return 0;
 
-       return ext4_mpage_readpages(mapping, pages, NULL, nr_pages);
+       return ext4_mpage_readpages(mapping, pages, NULL, nr_pages, true);
 }
 
 static void ext4_invalidatepage(struct page *page, unsigned int offset,
index 19b87a8de6ff3659aaaa22dae4c32f73800f6777..f461d75ac049f04e2a180228530c507902269df0 100644 (file)
@@ -98,7 +98,7 @@ static void mpage_end_io(struct bio *bio)
 
 int ext4_mpage_readpages(struct address_space *mapping,
                         struct list_head *pages, struct page *page,
-                        unsigned nr_pages)
+                        unsigned nr_pages, bool is_readahead)
 {
        struct bio *bio = NULL;
        sector_t last_block_in_bio = 0;
@@ -259,7 +259,8 @@ int ext4_mpage_readpages(struct address_space *mapping,
                        bio->bi_iter.bi_sector = blocks[0] << (blkbits - 9);
                        bio->bi_end_io = mpage_end_io;
                        bio->bi_private = ctx;
-                       bio_set_op_attrs(bio, REQ_OP_READ, 0);
+                       bio_set_op_attrs(bio, REQ_OP_READ,
+                                               is_readahead ? REQ_RAHEAD : 0);
                }
 
                length = first_hole << blkbits;