diff options
author | Jens Axboe <axboe@suse.de> | 2006-05-03 10:58:22 +0200 |
---|---|---|
committer | Jens Axboe <axboe@nelson.home.kernel.dk> | 2006-05-04 06:55:12 +0200 |
commit | a0548871ed267ae12eb1c860c5aaebd9e466b34e (patch) | |
tree | 457aff209cd9a2a1c3c2678b639268dfa482f3d1 /fs/splice.c | |
parent | 76ad4d11105ccd40a536db1057083f28326019fd (diff) | |
download | linux-a0548871ed267ae12eb1c860c5aaebd9e466b34e.tar.gz linux-a0548871ed267ae12eb1c860c5aaebd9e466b34e.tar.bz2 linux-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.c | 2 |
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; } /* |