summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 20:34:52 +0200
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 20:34:52 +0200
commit02a93208edec0d655c9f18613d830dc6afeda7d4 (patch)
tree3a48dbae348c02d4b108cb3fcc5f1600ad3dd53a /fs
parentMerge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sha... (diff)
parent[PATCH] ll_rw_blk: fix missing bounce in blk_rq_map_kern() (diff)
downloadlinux-02a93208edec0d655c9f18613d830dc6afeda7d4.tar.xz
linux-02a93208edec0d655c9f18613d830dc6afeda7d4.zip
Merge branch 'for-2.6.22' of git://git.kernel.dk/data/git/linux-2.6-block
* 'for-2.6.22' of git://git.kernel.dk/data/git/linux-2.6-block: [PATCH] ll_rw_blk: fix missing bounce in blk_rq_map_kern() [PATCH] splice: always call into page_cache_readahead() [PATCH] splice(): fix interaction with readahead
Diffstat (limited to 'fs')
-rw-r--r--fs/splice.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/fs/splice.c b/fs/splice.c
index 5428b0ff3b6f..12f28281d2b1 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