diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 11:34:52 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-08 11:34:52 -0700 |
commit | 02a93208edec0d655c9f18613d830dc6afeda7d4 (patch) | |
tree | 3a48dbae348c02d4b108cb3fcc5f1600ad3dd53a /fs/splice.c | |
parent | 18062a91d2ddc40e19fc674afeb7cad58cfa23ab (diff) | |
parent | 821de3a27bf33f11ec878562577c586cd5f83c64 (diff) | |
download | op-kernel-dev-02a93208edec0d655c9f18613d830dc6afeda7d4.zip op-kernel-dev-02a93208edec0d655c9f18613d830dc6afeda7d4.tar.gz |
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/splice.c')
-rw-r--r-- | fs/splice.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/fs/splice.c b/fs/splice.c index 5428b0f..12f2828 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 |