diff options
Diffstat (limited to 'fs/splice.c')
| -rw-r--r-- | fs/splice.c | 151 |
1 files changed, 105 insertions, 46 deletions
diff --git a/fs/splice.c b/fs/splice.c index 9313b6124a2e..ac22b00d86c3 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
| @@ -193,8 +193,8 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
| 193 | break; | 193 | break; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | if (pipe->nrbufs < PIPE_BUFFERS) { | 196 | if (pipe->nrbufs < pipe->buffers) { |
| 197 | int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1); | 197 | int newbuf = (pipe->curbuf + pipe->nrbufs) & (pipe->buffers - 1); |
| 198 | struct pipe_buffer *buf = pipe->bufs + newbuf; | 198 | struct pipe_buffer *buf = pipe->bufs + newbuf; |
| 199 | 199 | ||
| 200 | buf->page = spd->pages[page_nr]; | 200 | buf->page = spd->pages[page_nr]; |
| @@ -214,7 +214,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
| 214 | 214 | ||
| 215 | if (!--spd->nr_pages) | 215 | if (!--spd->nr_pages) |
| 216 | break; | 216 | break; |
| 217 | if (pipe->nrbufs < PIPE_BUFFERS) | 217 | if (pipe->nrbufs < pipe->buffers) |
| 218 | continue; | 218 | continue; |
| 219 | 219 | ||
| 220 | break; | 220 | break; |
| @@ -265,6 +265,36 @@ static void spd_release_page(struct splice_pipe_desc *spd, unsigned int i) | |||
| 265 | page_cache_release(spd->pages[i]); | 265 | page_cache_release(spd->pages[i]); |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | /* | ||
| 269 | * Check if we need to grow the arrays holding pages and partial page | ||
| 270 | * descriptions. | ||
| 271 | */ | ||
| 272 | int splice_grow_spd(struct pipe_inode_info *pipe, struct splice_pipe_desc *spd) | ||
| 273 | { | ||
| 274 | if (pipe->buffers <= PIPE_DEF_BUFFERS) | ||
| 275 | return 0; | ||
| 276 | |||
| 277 | spd->pages = kmalloc(pipe->buffers * sizeof(struct page *), GFP_KERNEL); | ||
| 278 | spd->partial = kmalloc(pipe->buffers * sizeof(struct partial_page), GFP_KERNEL); | ||
| 279 | |||
| 280 | if (spd->pages && spd->partial) | ||
| 281 | return 0; | ||
| 282 | |||
| 283 | kfree(spd->pages); | ||
| 284 | kfree(spd->partial); | ||
| 285 | return -ENOMEM; | ||
| 286 | } | ||
| 287 | |||
| 288 | void splice_shrink_spd(struct pipe_inode_info *pipe, | ||
| 289 | struct splice_pipe_desc *spd) | ||
| 290 | { | ||
| 291 | if (pipe->buffers <= PIPE_DEF_BUFFERS) | ||
| 292 | return; | ||
| 293 | |||
| 294 | kfree(spd->pages); | ||
| 295 | kfree(spd->partial); | ||
| 296 | } | ||
| 297 | |||
| 268 | static int | 298 | static int |
| 269 | __generic_file_splice_read(struct file *in, loff_t *ppos, | 299 | __generic_file_splice_read(struct file *in, loff_t *ppos, |
| 270 | struct pipe_inode_info *pipe, size_t len, | 300 | struct pipe_inode_info *pipe, size_t len, |
| @@ -272,8 +302,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 272 | { | 302 | { |
| 273 | struct address_space *mapping = in->f_mapping; | 303 | struct address_space *mapping = in->f_mapping; |
| 274 | unsigned int loff, nr_pages, req_pages; | 304 | unsigned int loff, nr_pages, req_pages; |
| 275 | struct page *pages[PIPE_BUFFERS]; | 305 | struct page *pages[PIPE_DEF_BUFFERS]; |
| 276 | struct partial_page partial[PIPE_BUFFERS]; | 306 | struct partial_page partial[PIPE_DEF_BUFFERS]; |
| 277 | struct page *page; | 307 | struct page *page; |
| 278 | pgoff_t index, end_index; | 308 | pgoff_t index, end_index; |
| 279 | loff_t isize; | 309 | loff_t isize; |
| @@ -286,15 +316,18 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 286 | .spd_release = spd_release_page, | 316 | .spd_release = spd_release_page, |
| 287 | }; | 317 | }; |
| 288 | 318 | ||
| 319 | if (splice_grow_spd(pipe, &spd)) | ||
| 320 | return -ENOMEM; | ||
| 321 | |||
| 289 | index = *ppos >> PAGE_CACHE_SHIFT; | 322 | index = *ppos >> PAGE_CACHE_SHIFT; |
| 290 | loff = *ppos & ~PAGE_CACHE_MASK; | 323 | loff = *ppos & ~PAGE_CACHE_MASK; |
| 291 | req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 324 | req_pages = (len + loff + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 292 | nr_pages = min(req_pages, (unsigned)PIPE_BUFFERS); | 325 | nr_pages = min(req_pages, pipe->buffers); |
| 293 | 326 | ||
| 294 | /* | 327 | /* |
| 295 | * Lookup the (hopefully) full range of pages we need. | 328 | * Lookup the (hopefully) full range of pages we need. |
| 296 | */ | 329 | */ |
| 297 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, pages); | 330 | spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, spd.pages); |
| 298 | index += spd.nr_pages; | 331 | index += spd.nr_pages; |
| 299 | 332 | ||
| 300 | /* | 333 | /* |
| @@ -335,7 +368,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 335 | unlock_page(page); | 368 | unlock_page(page); |
| 336 | } | 369 | } |
| 337 | 370 | ||
| 338 | pages[spd.nr_pages++] = page; | 371 | spd.pages[spd.nr_pages++] = page; |
| 339 | index++; | 372 | index++; |
| 340 | } | 373 | } |
| 341 | 374 | ||
| @@ -356,7 +389,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 356 | * this_len is the max we'll use from this page | 389 | * this_len is the max we'll use from this page |
| 357 | */ | 390 | */ |
| 358 | this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff); | 391 | this_len = min_t(unsigned long, len, PAGE_CACHE_SIZE - loff); |
| 359 | page = pages[page_nr]; | 392 | page = spd.pages[page_nr]; |
| 360 | 393 | ||
| 361 | if (PageReadahead(page)) | 394 | if (PageReadahead(page)) |
| 362 | page_cache_async_readahead(mapping, &in->f_ra, in, | 395 | page_cache_async_readahead(mapping, &in->f_ra, in, |
| @@ -393,8 +426,8 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
| 393 | error = -ENOMEM; | 426 | error = -ENOMEM; |
| 394 | break; | 427 | break; |
| 395 | } | 428 | } |
| 396 | page_cache_release(pages[page_nr]); | 429 | page_cache_release(spd.pages[page_nr]); |
| 397 | pages[page_nr] = page; | 430 | spd.pages[page_nr] = page; |
| 398 | } | 431 | } |
| 399 | /* | 432 | /* |
| 400 | * page was already under io and is now done, great | 433 | * page was already under io and is now done, great |
| @@ -451,8 +484,8 @@ fill_it: | |||
| 451 | len = this_len; | 484 | len = this_len; |
| 452 | } | 485 | } |
| 453 | 486 | ||
| 454 | partial[page_nr].offset = loff; | 487 | spd.partial[page_nr].offset = loff; |
| 455 | partial[page_nr].len = this_len; | 488 | spd.partial[page_nr].len = this_len; |
| 456 | len -= this_len; | 489 | len -= this_len; |
| 457 | loff = 0; | 490 | loff = 0; |
| 458 | spd.nr_pages++; | 491 | spd.nr_pages++; |
| @@ -464,12 +497,13 @@ fill_it: | |||
| 464 | * we got, 'nr_pages' is how many pages are in the map. | 497 | * we got, 'nr_pages' is how many pages are in the map. |
| 465 | */ | 498 | */ |
| 466 | while (page_nr < nr_pages) | 499 | while (page_nr < nr_pages) |
| 467 | page_cache_release(pages[page_nr++]); | 500 | page_cache_release(spd.pages[page_nr++]); |
| 468 | in->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; | 501 | in->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; |
| 469 | 502 | ||
| 470 | if (spd.nr_pages) | 503 | if (spd.nr_pages) |
| 471 | return splice_to_pipe(pipe, &spd); | 504 | error = splice_to_pipe(pipe, &spd); |
| 472 | 505 | ||
| 506 | splice_shrink_spd(pipe, &spd); | ||
| 473 | return error; | 507 | return error; |
| 474 | } | 508 | } |
| 475 | 509 | ||
| @@ -560,9 +594,9 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, | |||
| 560 | unsigned int nr_pages; | 594 | unsigned int nr_pages; |
| 561 | unsigned int nr_freed; | 595 | unsigned int nr_freed; |
| 562 | size_t offset; | 596 | size_t offset; |
| 563 | struct page *pages[PIPE_BUFFERS]; | 597 | struct page *pages[PIPE_DEF_BUFFERS]; |
| 564 | struct partial_page partial[PIPE_BUFFERS]; | 598 | struct partial_page partial[PIPE_DEF_BUFFERS]; |
| 565 | struct iovec vec[PIPE_BUFFERS]; | 599 | struct iovec *vec, __vec[PIPE_DEF_BUFFERS]; |
| 566 | pgoff_t index; | 600 | pgoff_t index; |
| 567 | ssize_t res; | 601 | ssize_t res; |
| 568 | size_t this_len; | 602 | size_t this_len; |
| @@ -576,11 +610,22 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, | |||
| 576 | .spd_release = spd_release_page, | 610 | .spd_release = spd_release_page, |
| 577 | }; | 611 | }; |
| 578 | 612 | ||
| 613 | if (splice_grow_spd(pipe, &spd)) | ||
| 614 | return -ENOMEM; | ||
| 615 | |||
| 616 | res = -ENOMEM; | ||
| 617 | vec = __vec; | ||
| 618 | if (pipe->buffers > PIPE_DEF_BUFFERS) { | ||
| 619 | vec = kmalloc(pipe->buffers * sizeof(struct iovec), GFP_KERNEL); | ||
| 620 | if (!vec) | ||
| 621 | goto shrink_ret; | ||
| 622 | } | ||
| 623 | |||
| 579 | index = *ppos >> PAGE_CACHE_SHIFT; | 624 | index = *ppos >> PAGE_CACHE_SHIFT; |
| 580 | offset = *ppos & ~PAGE_CACHE_MASK; | 625 | offset = *ppos & ~PAGE_CACHE_MASK; |
| 581 | nr_pages = (len + offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 626 | nr_pages = (len + offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
| 582 | 627 | ||
| 583 | for (i = 0; i < nr_pages && i < PIPE_BUFFERS && len; i++) { | 628 | for (i = 0; i < nr_pages && i < pipe->buffers && len; i++) { |
| 584 | struct page *page; | 629 | struct page *page; |
| 585 | 630 | ||
| 586 | page = alloc_page(GFP_USER); | 631 | page = alloc_page(GFP_USER); |
| @@ -591,7 +636,7 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, | |||
| 591 | this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset); | 636 | this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset); |
| 592 | vec[i].iov_base = (void __user *) page_address(page); | 637 | vec[i].iov_base = (void __user *) page_address(page); |
| 593 | vec[i].iov_len = this_len; | 638 | vec[i].iov_len = this_len; |
| 594 | pages[i] = page; | 639 | spd.pages[i] = page; |
| 595 | spd.nr_pages++; | 640 | spd.nr_pages++; |
| 596 | len -= this_len; | 641 | len -= this_len; |
| 597 | offset = 0; | 642 | offset = 0; |
| @@ -610,11 +655,11 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, | |||
| 610 | nr_freed = 0; | 655 | nr_freed = 0; |
| 611 | for (i = 0; i < spd.nr_pages; i++) { | 656 | for (i = 0; i < spd.nr_pages; i++) { |
| 612 | this_len = min_t(size_t, vec[i].iov_len, res); | 657 | this_len = min_t(size_t, vec[i].iov_len, res); |
| 613 | partial[i].offset = 0; | 658 | spd.partial[i].offset = 0; |
| 614 | partial[i].len = this_len; | 659 | spd.partial[i].len = this_len; |
| 615 | if (!this_len) { | 660 | if (!this_len) { |
| 616 | __free_page(pages[i]); | 661 | __free_page(spd.pages[i]); |
| 617 | pages[i] = NULL; | 662 | spd.pages[i] = NULL; |
| 618 | nr_freed++; | 663 | nr_freed++; |
| 619 | } | 664 | } |
| 620 | res -= this_len; | 665 | res -= this_len; |
| @@ -625,13 +670,18 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, | |||
| 625 | if (res > 0) | 670 | if (res > 0) |
| 626 | *ppos += res; | 671 | *ppos += res; |
| 627 | 672 | ||
| 673 | shrink_ret: | ||
| 674 | if (vec != __vec) | ||
| 675 | kfree(vec); | ||
| 676 | splice_shrink_spd(pipe, &spd); | ||
| 628 | return res; | 677 | return res; |
| 629 | 678 | ||
| 630 | err: | 679 | err: |
| 631 | for (i = 0; i < spd.nr_pages; i++) | 680 | for (i = 0; i < spd.nr_pages; i++) |
| 632 | __free_page(pages[i]); | 681 | __free_page(spd.pages[i]); |
| 633 | 682 | ||
| 634 | return error; | 683 | res = error; |
| 684 | goto shrink_ret; | ||
| 635 | } | 685 | } |
| 636 | EXPORT_SYMBOL(default_file_splice_read); | 686 | EXPORT_SYMBOL(default_file_splice_read); |
| 637 | 687 | ||
| @@ -784,7 +834,7 @@ int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd, | |||
| 784 | if (!buf->len) { | 834 | if (!buf->len) { |
| 785 | buf->ops = NULL; | 835 | buf->ops = NULL; |
| 786 | ops->release(pipe, buf); | 836 | ops->release(pipe, buf); |
| 787 | pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1); | 837 | pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1); |
| 788 | pipe->nrbufs--; | 838 | pipe->nrbufs--; |
| 789 | if (pipe->inode) | 839 | if (pipe->inode) |
| 790 | sd->need_wakeup = true; | 840 | sd->need_wakeup = true; |
| @@ -1211,7 +1261,7 @@ out_release: | |||
| 1211 | * If we did an incomplete transfer we must release | 1261 | * If we did an incomplete transfer we must release |
| 1212 | * the pipe buffers in question: | 1262 | * the pipe buffers in question: |
| 1213 | */ | 1263 | */ |
| 1214 | for (i = 0; i < PIPE_BUFFERS; i++) { | 1264 | for (i = 0; i < pipe->buffers; i++) { |
| 1215 | struct pipe_buffer *buf = pipe->bufs + i; | 1265 | struct pipe_buffer *buf = pipe->bufs + i; |
| 1216 | 1266 | ||
| 1217 | if (buf->ops) { | 1267 | if (buf->ops) { |
| @@ -1371,7 +1421,8 @@ static long do_splice(struct file *in, loff_t __user *off_in, | |||
| 1371 | */ | 1421 | */ |
| 1372 | static int get_iovec_page_array(const struct iovec __user *iov, | 1422 | static int get_iovec_page_array(const struct iovec __user *iov, |
| 1373 | unsigned int nr_vecs, struct page **pages, | 1423 | unsigned int nr_vecs, struct page **pages, |
| 1374 | struct partial_page *partial, int aligned) | 1424 | struct partial_page *partial, int aligned, |
| 1425 | unsigned int pipe_buffers) | ||
| 1375 | { | 1426 | { |
| 1376 | int buffers = 0, error = 0; | 1427 | int buffers = 0, error = 0; |
| 1377 | 1428 | ||
| @@ -1414,8 +1465,8 @@ static int get_iovec_page_array(const struct iovec __user *iov, | |||
| 1414 | break; | 1465 | break; |
| 1415 | 1466 | ||
| 1416 | npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; | 1467 | npages = (off + len + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 1417 | if (npages > PIPE_BUFFERS - buffers) | 1468 | if (npages > pipe_buffers - buffers) |
| 1418 | npages = PIPE_BUFFERS - buffers; | 1469 | npages = pipe_buffers - buffers; |
| 1419 | 1470 | ||
| 1420 | error = get_user_pages_fast((unsigned long)base, npages, | 1471 | error = get_user_pages_fast((unsigned long)base, npages, |
| 1421 | 0, &pages[buffers]); | 1472 | 0, &pages[buffers]); |
| @@ -1450,7 +1501,7 @@ static int get_iovec_page_array(const struct iovec __user *iov, | |||
| 1450 | * or if we mapped the max number of pages that we have | 1501 | * or if we mapped the max number of pages that we have |
| 1451 | * room for. | 1502 | * room for. |
| 1452 | */ | 1503 | */ |
| 1453 | if (error < npages || buffers == PIPE_BUFFERS) | 1504 | if (error < npages || buffers == pipe_buffers) |
| 1454 | break; | 1505 | break; |
| 1455 | 1506 | ||
| 1456 | nr_vecs--; | 1507 | nr_vecs--; |
| @@ -1593,8 +1644,8 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov, | |||
| 1593 | unsigned long nr_segs, unsigned int flags) | 1644 | unsigned long nr_segs, unsigned int flags) |
| 1594 | { | 1645 | { |
| 1595 | struct pipe_inode_info *pipe; | 1646 | struct pipe_inode_info *pipe; |
| 1596 | struct page *pages[PIPE_BUFFERS]; | 1647 | struct page *pages[PIPE_DEF_BUFFERS]; |
| 1597 | struct partial_page partial[PIPE_BUFFERS]; | 1648 | struct partial_page partial[PIPE_DEF_BUFFERS]; |
| 1598 | struct splice_pipe_desc spd = { | 1649 | struct splice_pipe_desc spd = { |
| 1599 | .pages = pages, | 1650 | .pages = pages, |
| 1600 | .partial = partial, | 1651 | .partial = partial, |
| @@ -1602,17 +1653,25 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov, | |||
| 1602 | .ops = &user_page_pipe_buf_ops, | 1653 | .ops = &user_page_pipe_buf_ops, |
| 1603 | .spd_release = spd_release_page, | 1654 | .spd_release = spd_release_page, |
| 1604 | }; | 1655 | }; |
| 1656 | long ret; | ||
| 1605 | 1657 | ||
| 1606 | pipe = pipe_info(file->f_path.dentry->d_inode); | 1658 | pipe = pipe_info(file->f_path.dentry->d_inode); |
| 1607 | if (!pipe) | 1659 | if (!pipe) |
| 1608 | return -EBADF; | 1660 | return -EBADF; |
| 1609 | 1661 | ||
| 1610 | spd.nr_pages = get_iovec_page_array(iov, nr_segs, pages, partial, | 1662 | if (splice_grow_spd(pipe, &spd)) |
| 1611 | flags & SPLICE_F_GIFT); | 1663 | return -ENOMEM; |
| 1664 | |||
| 1665 | spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages, | ||
| 1666 | spd.partial, flags & SPLICE_F_GIFT, | ||
| 1667 | pipe->buffers); | ||
| 1612 | if (spd.nr_pages <= 0) | 1668 | if (spd.nr_pages <= 0) |
| 1613 | return spd.nr_pages; | 1669 | ret = spd.nr_pages; |
| 1670 | else | ||
| 1671 | ret = splice_to_pipe(pipe, &spd); | ||
| 1614 | 1672 | ||
| 1615 | return splice_to_pipe(pipe, &spd); | 1673 | splice_shrink_spd(pipe, &spd); |
| 1674 | return ret; | ||
| 1616 | } | 1675 | } |
| 1617 | 1676 | ||
| 1618 | /* | 1677 | /* |
| @@ -1738,13 +1797,13 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
| 1738 | * Check ->nrbufs without the inode lock first. This function | 1797 | * Check ->nrbufs without the inode lock first. This function |
| 1739 | * is speculative anyways, so missing one is ok. | 1798 | * is speculative anyways, so missing one is ok. |
| 1740 | */ | 1799 | */ |
| 1741 | if (pipe->nrbufs < PIPE_BUFFERS) | 1800 | if (pipe->nrbufs < pipe->buffers) |
| 1742 | return 0; | 1801 | return 0; |
| 1743 | 1802 | ||
| 1744 | ret = 0; | 1803 | ret = 0; |
| 1745 | pipe_lock(pipe); | 1804 | pipe_lock(pipe); |
| 1746 | 1805 | ||
| 1747 | while (pipe->nrbufs >= PIPE_BUFFERS) { | 1806 | while (pipe->nrbufs >= pipe->buffers) { |
| 1748 | if (!pipe->readers) { | 1807 | if (!pipe->readers) { |
| 1749 | send_sig(SIGPIPE, current, 0); | 1808 | send_sig(SIGPIPE, current, 0); |
| 1750 | ret = -EPIPE; | 1809 | ret = -EPIPE; |
| @@ -1810,7 +1869,7 @@ retry: | |||
| 1810 | * Cannot make any progress, because either the input | 1869 | * Cannot make any progress, because either the input |
| 1811 | * pipe is empty or the output pipe is full. | 1870 | * pipe is empty or the output pipe is full. |
| 1812 | */ | 1871 | */ |
| 1813 | if (!ipipe->nrbufs || opipe->nrbufs >= PIPE_BUFFERS) { | 1872 | if (!ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) { |
| 1814 | /* Already processed some buffers, break */ | 1873 | /* Already processed some buffers, break */ |
| 1815 | if (ret) | 1874 | if (ret) |
| 1816 | break; | 1875 | break; |
| @@ -1831,7 +1890,7 @@ retry: | |||
| 1831 | } | 1890 | } |
| 1832 | 1891 | ||
| 1833 | ibuf = ipipe->bufs + ipipe->curbuf; | 1892 | ibuf = ipipe->bufs + ipipe->curbuf; |
| 1834 | nbuf = (opipe->curbuf + opipe->nrbufs) % PIPE_BUFFERS; | 1893 | nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1); |
| 1835 | obuf = opipe->bufs + nbuf; | 1894 | obuf = opipe->bufs + nbuf; |
| 1836 | 1895 | ||
| 1837 | if (len >= ibuf->len) { | 1896 | if (len >= ibuf->len) { |
| @@ -1841,7 +1900,7 @@ retry: | |||
| 1841 | *obuf = *ibuf; | 1900 | *obuf = *ibuf; |
| 1842 | ibuf->ops = NULL; | 1901 | ibuf->ops = NULL; |
| 1843 | opipe->nrbufs++; | 1902 | opipe->nrbufs++; |
| 1844 | ipipe->curbuf = (ipipe->curbuf + 1) % PIPE_BUFFERS; | 1903 | ipipe->curbuf = (ipipe->curbuf + 1) & (ipipe->buffers - 1); |
| 1845 | ipipe->nrbufs--; | 1904 | ipipe->nrbufs--; |
| 1846 | input_wakeup = true; | 1905 | input_wakeup = true; |
| 1847 | } else { | 1906 | } else { |
| @@ -1914,11 +1973,11 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
| 1914 | * If we have iterated all input buffers or ran out of | 1973 | * If we have iterated all input buffers or ran out of |
| 1915 | * output room, break. | 1974 | * output room, break. |
| 1916 | */ | 1975 | */ |
| 1917 | if (i >= ipipe->nrbufs || opipe->nrbufs >= PIPE_BUFFERS) | 1976 | if (i >= ipipe->nrbufs || opipe->nrbufs >= opipe->buffers) |
| 1918 | break; | 1977 | break; |
| 1919 | 1978 | ||
| 1920 | ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1)); | 1979 | ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (ipipe->buffers-1)); |
| 1921 | nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1); | 1980 | nbuf = (opipe->curbuf + opipe->nrbufs) & (opipe->buffers - 1); |
| 1922 | 1981 | ||
| 1923 | /* | 1982 | /* |
| 1924 | * Get a reference to this pipe buffer, | 1983 | * Get a reference to this pipe buffer, |
