]> www.infradead.org Git - users/hch/block.git/commitdiff
mm: refactor generic_file_buffered_read_get_pages
authorChristoph Hellwig <hch@lst.de>
Fri, 30 Oct 2020 16:34:33 +0000 (17:34 +0100)
committerChristoph Hellwig <hch@lst.de>
Fri, 30 Oct 2020 16:52:36 +0000 (17:52 +0100)
Move the call to filemap_make_page_uptodate for a newly allocated page
into filemap_new_page, which turns the new vs lookup decision into a
plain if / else statement, rename two identifier to be more obvious
and the function itself to filemap_find_or_create_pages which describes
it a little better while being much shorter.

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

index adb81d705772205b4fe06e3c6e9b3558dc27fa14..ae52f328e29ba8309e33a406ca71945308082b1e 100644 (file)
@@ -2320,7 +2320,10 @@ static int filemap_new_page(struct kiocb *iocb, struct iov_iter *iter,
                return error;
        }
 
-       return filemap_readpage(iocb, *page);
+       error = filemap_readpage(iocb, *page);
+       if (error)
+               return error;
+       return filemap_make_page_uptodate(iocb, iter, *page, index, true);
 }
 
 static int filemap_find_get_pages(struct kiocb *iocb, struct iov_iter *iter,
@@ -2344,40 +2347,38 @@ static int filemap_find_get_pages(struct kiocb *iocb, struct iov_iter *iter,
        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)
+static int filemap_find_or_create_pages(struct kiocb *iocb,
+               struct iov_iter *iter, struct page **pages, unsigned int nr)
 {
        pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
-       int i, j, nr_got, err = 0;
+       int nr_pages, err = 0, i, j;
 
-find_page:
+retry:
        if (fatal_signal_pending(current))
                return -EINTR;
 
-       nr_got = filemap_find_get_pages(iocb, iter, pages, nr);
-       if (!nr_got) {
+       nr_pages = filemap_find_get_pages(iocb, iter, pages, nr);
+       if (nr_pages) {
+               for (i = 0; i < nr_pages; i++) {
+                       err = filemap_make_page_uptodate(iocb, iter, pages[i],
+                                       index + i, i == 0);
+                       if (err) {
+                               for (j = i + 1; j < nr_pages; j++)
+                                       put_page(pages[j]);
+                               nr_pages = i;
+                               break;
+                       }
+               }
+       } else {
                err = filemap_new_page(iocb, iter, &pages[0]);
                if (!err)
-                       nr_got = 1;
+                       nr_pages = 1;
        }
 
-       for (i = 0; i < nr_got; i++) {
-               err = filemap_make_page_uptodate(iocb, iter, pages[i],
-                               index + i, i == 0);
-               if (err) {
-                       for (j = i + 1; j < nr_got; j++)
-                               put_page(pages[j]);
-                       nr_got = i;
-                       break;
-               }
-       }
-
-       if (likely(nr_got))
-               return nr_got;
+       if (likely(nr_pages))
+               return nr_pages;
        if (err == -EEXIST || err == AOP_TRUNCATED_PAGE)
-               goto find_page;
+               goto retry;
        return err;
 }
 
@@ -2436,8 +2437,8 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
                        iocb->ki_flags |= IOCB_NOWAIT;
 
                i = 0;
-               pg_nr = generic_file_buffered_read_get_pages(iocb, iter,
-                                                            pages, nr_pages);
+               pg_nr = filemap_find_or_create_pages(iocb, iter, pages,
+                                                    nr_pages);
                if (pg_nr < 0) {
                        error = pg_nr;
                        break;