diff options
Diffstat (limited to 'fs/splice.c')
| -rw-r--r-- | fs/splice.c | 33 |
1 files changed, 7 insertions, 26 deletions
diff --git a/fs/splice.c b/fs/splice.c index 0670c915cd35..eeb1a86a7014 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
| @@ -320,7 +320,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 320 | break; | 320 | break; |
| 321 | 321 | ||
| 322 | error = add_to_page_cache_lru(page, mapping, index, | 322 | error = add_to_page_cache_lru(page, mapping, index, |
| 323 | GFP_KERNEL); | 323 | mapping_gfp_mask(mapping)); |
| 324 | if (unlikely(error)) { | 324 | if (unlikely(error)) { |
| 325 | page_cache_release(page); | 325 | page_cache_release(page); |
| 326 | if (error == -EEXIST) | 326 | if (error == -EEXIST) |
| @@ -370,8 +370,10 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 370 | * for an in-flight io page | 370 | * for an in-flight io page |
| 371 | */ | 371 | */ |
| 372 | if (flags & SPLICE_F_NONBLOCK) { | 372 | if (flags & SPLICE_F_NONBLOCK) { |
| 373 | if (TestSetPageLocked(page)) | 373 | if (TestSetPageLocked(page)) { |
| 374 | error = -EAGAIN; | ||
| 374 | break; | 375 | break; |
| 376 | } | ||
| 375 | } else | 377 | } else |
| 376 | lock_page(page); | 378 | lock_page(page); |
| 377 | 379 | ||
| @@ -479,9 +481,8 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 479 | struct pipe_inode_info *pipe, size_t len, | 481 | struct pipe_inode_info *pipe, size_t len, |
| 480 | unsigned int flags) | 482 | unsigned int flags) |
| 481 | { | 483 | { |
| 482 | ssize_t spliced; | ||
| 483 | int ret; | ||
| 484 | loff_t isize, left; | 484 | loff_t isize, left; |
| 485 | int ret; | ||
| 485 | 486 | ||
| 486 | isize = i_size_read(in->f_mapping->host); | 487 | isize = i_size_read(in->f_mapping->host); |
| 487 | if (unlikely(*ppos >= isize)) | 488 | if (unlikely(*ppos >= isize)) |
| @@ -491,29 +492,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 491 | if (unlikely(left < len)) | 492 | if (unlikely(left < len)) |
| 492 | len = left; | 493 | len = left; |
| 493 | 494 | ||
| 494 | ret = 0; | 495 | ret = __generic_file_splice_read(in, ppos, pipe, len, flags); |
| 495 | spliced = 0; | 496 | if (ret > 0) |
| 496 | while (len && !spliced) { | ||
| 497 | ret = __generic_file_splice_read(in, ppos, pipe, len, flags); | ||
| 498 | |||
| 499 | if (ret < 0) | ||
| 500 | break; | ||
| 501 | else if (!ret) { | ||
| 502 | if (spliced) | ||
| 503 | break; | ||
| 504 | if (flags & SPLICE_F_NONBLOCK) { | ||
| 505 | ret = -EAGAIN; | ||
| 506 | break; | ||
| 507 | } | ||
| 508 | } | ||
| 509 | |||
| 510 | *ppos += ret; | 497 | *ppos += ret; |
| 511 | len -= ret; | ||
| 512 | spliced += ret; | ||
| 513 | } | ||
| 514 | |||
| 515 | if (spliced) | ||
| 516 | return spliced; | ||
| 517 | 498 | ||
| 518 | return ret; | 499 | return ret; |
| 519 | } | 500 | } |
