X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=fs%2Fsplice.c;h=12f28281d2b1e1f8d1627995f03efcfeb25a4945;hb=5b982c5bb7db5cfbc15236d9d45cec32e5472ed5;hp=5428b0ff3b6fcfebe6abd074cb9719ec48c9dbda;hpb=22c8c65d24b37cef1d28583c7a7ffbf84f840e7a;p=powerpc.git diff --git a/fs/splice.c b/fs/splice.c index 5428b0ff3b..12f28281d2 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -289,12 +289,10 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, nr_pages = PIPE_BUFFERS; /* - * Initiate read-ahead on this page range. however, don't call into - * read-ahead if this is a non-zero offset (we are likely doing small - * chunk splice and the page is already there) for a single page. + * Don't try to 2nd guess the read-ahead logic, call into + * page_cache_readahead() like the page cache reads would do. */ - if (!loff || nr_pages > 1) - page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages); + page_cache_readahead(mapping, &in->f_ra, in, index, nr_pages); /* * Now fill in the holes: @@ -378,10 +376,11 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, * If in nonblock mode then dont block on waiting * for an in-flight io page */ - if (flags & SPLICE_F_NONBLOCK) - break; - - lock_page(page); + if (flags & SPLICE_F_NONBLOCK) { + if (TestSetPageLocked(page)) + break; + } else + lock_page(page); /* * page was truncated, stop here. if this isn't the