summaryrefslogtreecommitdiff
path: root/fs/splice.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2006-05-03 10:58:22 +0200
committerJens Axboe <axboe@nelson.home.kernel.dk>2006-05-04 06:55:12 +0200
commita0548871ed267ae12eb1c860c5aaebd9e466b34e (patch)
tree457aff209cd9a2a1c3c2678b639268dfa482f3d1 /fs/splice.c
parent76ad4d11105ccd40a536db1057083f28326019fd (diff)
downloadlwn-a0548871ed267ae12eb1c860c5aaebd9e466b34e.tar.gz
lwn-a0548871ed267ae12eb1c860c5aaebd9e466b34e.zip
[PATCH] splice: redo page lookup if add_to_page_cache() returns -EEXIST
This can happen quite easily, if several processes are trying to splice the same file at the same time. It's not a failure, it just means someone raced with us in allocating this file page. So just dump the allocated page and relookup the original. Signed-off-by: Jens Axboe <axboe@suse.de>
Diffstat (limited to 'fs/splice.c')
-rw-r--r--fs/splice.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/splice.c b/fs/splice.c
index 8fa9217ed585..a285fd746dc0 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -324,6 +324,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,
mapping_gfp_mask(mapping));
if (unlikely(error)) {
page_cache_release(page);
+ if (error == -EEXIST)
+ continue;
break;
}
/*