]> www.infradead.org Git - users/hch/block.git/commitdiff
mm: factor out a filemap_find_get_pages helper
authorChristoph Hellwig <hch@lst.de>
Fri, 30 Oct 2020 15:45:50 +0000 (16:45 +0100)
committerChristoph Hellwig <hch@lst.de>
Fri, 30 Oct 2020 16:34:38 +0000 (17:34 +0100)
Factor out a helper to lookup a range of contiguous pages from
generic_file_buffered_read_get_pages.

Signed-off-by: Christoph Hellwig <hch@lst.de>
mm/filemap.c

index 94033d8f2310d9d76b0951a6a6f57a1ce9e9f58e..adb81d705772205b4fe06e3c6e9b3558dc27fa14 100644 (file)
@@ -2323,39 +2323,46 @@ static int filemap_new_page(struct kiocb *iocb, struct iov_iter *iter,
        return filemap_readpage(iocb, *page);
 }
 
+static int filemap_find_get_pages(struct kiocb *iocb, struct iov_iter *iter,
+               struct page **pages, unsigned int nr)
+{
+       struct address_space *mapping = iocb->ki_filp->f_mapping;
+       pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
+       pgoff_t last_index = (iocb->ki_pos + iter->count + PAGE_SIZE - 1) >>
+                       PAGE_SHIFT;
+       int nr_pages;
+
+       nr = min_t(unsigned long, last_index - index, nr);
+       nr_pages = find_get_pages_contig(mapping, index, nr, pages);
+       if (nr_pages)
+               return nr_pages;
+
+       if (iocb->ki_flags & IOCB_NOIO)
+               return -EAGAIN;
+       page_cache_sync_readahead(mapping, &iocb->ki_filp->f_ra, iocb->ki_filp,
+                       index, last_index - index);
+       return find_get_pages_contig(mapping, index, nr, pages);
+}
+
 static int generic_file_buffered_read_get_pages(struct kiocb *iocb,
                                                struct iov_iter *iter,
                                                struct page **pages,
                                                unsigned int nr)
 {
-       struct file *filp = iocb->ki_filp;
-       struct address_space *mapping = filp->f_mapping;
-       struct file_ra_state *ra = &filp->f_ra;
        pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
-       pgoff_t last_index = (iocb->ki_pos + iter->count + PAGE_SIZE-1) >> PAGE_SHIFT;
        int i, j, nr_got, err = 0;
 
-       nr = min_t(unsigned long, last_index - index, nr);
 find_page:
        if (fatal_signal_pending(current))
                return -EINTR;
 
-       nr_got = find_get_pages_contig(mapping, index, nr, pages);
-       if (nr_got)
-               goto got_pages;
-
-       if (iocb->ki_flags & IOCB_NOIO)
-               return -EAGAIN;
-
-       page_cache_sync_readahead(mapping, ra, filp, index, last_index - index);
+       nr_got = filemap_find_get_pages(iocb, iter, pages, nr);
+       if (!nr_got) {
+               err = filemap_new_page(iocb, iter, &pages[0]);
+               if (!err)
+                       nr_got = 1;
+       }
 
-       nr_got = find_get_pages_contig(mapping, index, nr, pages);
-       if (nr_got)
-               goto got_pages;
-       err = filemap_new_page(iocb, iter, &pages[0]);
-       if (!err)
-               nr_got = 1;
-got_pages:
        for (i = 0; i < nr_got; i++) {
                err = filemap_make_page_uptodate(iocb, iter, pages[i],
                                index + i, i == 0);