|
@@ -290,13 +290,17 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
|
|
|
* Lookup the (hopefully) full range of pages we need.
|
|
|
*/
|
|
|
spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages);
|
|
|
+ index += spd.nr_pages;
|
|
|
|
|
|
/*
|
|
|
* If find_get_pages_contig() returned fewer pages than we needed,
|
|
|
- * allocate the rest and fill in the holes.
|
|
|
+ * readahead/allocate the rest and fill in the holes.
|
|
|
*/
|
|
|
+ if (spd.nr_pages < nr_pages)
|
|
|
+ page_cache_readahead_ondemand(mapping, &in->f_ra, in,
|
|
|
+ NULL, index, nr_pages - spd.nr_pages);
|
|
|
+
|
|
|
error = 0;
|
|
|
- index += spd.nr_pages;
|
|
|
while (spd.nr_pages < nr_pages) {
|
|
|
/*
|
|
|
* Page could be there, find_get_pages_contig() breaks on
|
|
@@ -304,9 +308,6 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
|
|
|
*/
|
|
|
page = find_get_page(mapping, index);
|
|
|
if (!page) {
|
|
|
- page_cache_readahead_ondemand(mapping, &in->f_ra, in,
|
|
|
- NULL, index, nr_pages - spd.nr_pages);
|
|
|
-
|
|
|
/*
|
|
|
* page didn't exist, allocate one.
|
|
|
*/
|