diff options
Diffstat (limited to 'fs/splice.c')
-rw-r--r-- | fs/splice.c | 370 |
1 files changed, 185 insertions, 185 deletions
diff --git a/fs/splice.c b/fs/splice.c index c18aa7e03e2b..666953d59a35 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -182,8 +182,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
182 | do_wakeup = 0; | 182 | do_wakeup = 0; |
183 | page_nr = 0; | 183 | page_nr = 0; |
184 | 184 | ||
185 | if (pipe->inode) | 185 | pipe_lock(pipe); |
186 | mutex_lock(&pipe->inode->i_mutex); | ||
187 | 186 | ||
188 | for (;;) { | 187 | for (;;) { |
189 | if (!pipe->readers) { | 188 | if (!pipe->readers) { |
@@ -245,15 +244,13 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, | |||
245 | pipe->waiting_writers--; | 244 | pipe->waiting_writers--; |
246 | } | 245 | } |
247 | 246 | ||
248 | if (pipe->inode) { | 247 | pipe_unlock(pipe); |
249 | mutex_unlock(&pipe->inode->i_mutex); | ||
250 | 248 | ||
251 | if (do_wakeup) { | 249 | if (do_wakeup) { |
252 | smp_mb(); | 250 | smp_mb(); |
253 | if (waitqueue_active(&pipe->wait)) | 251 | if (waitqueue_active(&pipe->wait)) |
254 | wake_up_interruptible(&pipe->wait); | 252 | wake_up_interruptible(&pipe->wait); |
255 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); | 253 | kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); |
256 | } | ||
257 | } | 254 | } |
258 | 255 | ||
259 | while (page_nr < spd_pages) | 256 | while (page_nr < spd_pages) |
@@ -555,8 +552,8 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
555 | * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create | 552 | * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create |
556 | * a new page in the output file page cache and fill/dirty that. | 553 | * a new page in the output file page cache and fill/dirty that. |
557 | */ | 554 | */ |
558 | static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | 555 | int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, |
559 | struct splice_desc *sd) | 556 | struct splice_desc *sd) |
560 | { | 557 | { |
561 | struct file *file = sd->u.file; | 558 | struct file *file = sd->u.file; |
562 | struct address_space *mapping = file->f_mapping; | 559 | struct address_space *mapping = file->f_mapping; |
@@ -600,108 +597,177 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
600 | out: | 597 | out: |
601 | return ret; | 598 | return ret; |
602 | } | 599 | } |
600 | EXPORT_SYMBOL(pipe_to_file); | ||
601 | |||
602 | static void wakeup_pipe_writers(struct pipe_inode_info *pipe) | ||
603 | { | ||
604 | smp_mb(); | ||
605 | if (waitqueue_active(&pipe->wait)) | ||
606 | wake_up_interruptible(&pipe->wait); | ||
607 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | ||
608 | } | ||
603 | 609 | ||
604 | /** | 610 | /** |
605 | * __splice_from_pipe - splice data from a pipe to given actor | 611 | * splice_from_pipe_feed - feed available data from a pipe to a file |
606 | * @pipe: pipe to splice from | 612 | * @pipe: pipe to splice from |
607 | * @sd: information to @actor | 613 | * @sd: information to @actor |
608 | * @actor: handler that splices the data | 614 | * @actor: handler that splices the data |
609 | * | 615 | * |
610 | * Description: | 616 | * Description: |
611 | * This function does little more than loop over the pipe and call | 617 | * This function loops over the pipe and calls @actor to do the |
612 | * @actor to do the actual moving of a single struct pipe_buffer to | 618 | * actual moving of a single struct pipe_buffer to the desired |
613 | * the desired destination. See pipe_to_file, pipe_to_sendpage, or | 619 | * destination. It returns when there's no more buffers left in |
614 | * pipe_to_user. | 620 | * the pipe or if the requested number of bytes (@sd->total_len) |
621 | * have been copied. It returns a positive number (one) if the | ||
622 | * pipe needs to be filled with more data, zero if the required | ||
623 | * number of bytes have been copied and -errno on error. | ||
615 | * | 624 | * |
625 | * This, together with splice_from_pipe_{begin,end,next}, may be | ||
626 | * used to implement the functionality of __splice_from_pipe() when | ||
627 | * locking is required around copying the pipe buffers to the | ||
628 | * destination. | ||
616 | */ | 629 | */ |
617 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | 630 | int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd, |
618 | splice_actor *actor) | 631 | splice_actor *actor) |
619 | { | 632 | { |
620 | int ret, do_wakeup, err; | 633 | int ret; |
621 | |||
622 | ret = 0; | ||
623 | do_wakeup = 0; | ||
624 | |||
625 | for (;;) { | ||
626 | if (pipe->nrbufs) { | ||
627 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; | ||
628 | const struct pipe_buf_operations *ops = buf->ops; | ||
629 | 634 | ||
630 | sd->len = buf->len; | 635 | while (pipe->nrbufs) { |
631 | if (sd->len > sd->total_len) | 636 | struct pipe_buffer *buf = pipe->bufs + pipe->curbuf; |
632 | sd->len = sd->total_len; | 637 | const struct pipe_buf_operations *ops = buf->ops; |
633 | 638 | ||
634 | err = actor(pipe, buf, sd); | 639 | sd->len = buf->len; |
635 | if (err <= 0) { | 640 | if (sd->len > sd->total_len) |
636 | if (!ret && err != -ENODATA) | 641 | sd->len = sd->total_len; |
637 | ret = err; | ||
638 | 642 | ||
639 | break; | 643 | ret = actor(pipe, buf, sd); |
640 | } | 644 | if (ret <= 0) { |
645 | if (ret == -ENODATA) | ||
646 | ret = 0; | ||
647 | return ret; | ||
648 | } | ||
649 | buf->offset += ret; | ||
650 | buf->len -= ret; | ||
641 | 651 | ||
642 | ret += err; | 652 | sd->num_spliced += ret; |
643 | buf->offset += err; | 653 | sd->len -= ret; |
644 | buf->len -= err; | 654 | sd->pos += ret; |
655 | sd->total_len -= ret; | ||
645 | 656 | ||
646 | sd->len -= err; | 657 | if (!buf->len) { |
647 | sd->pos += err; | 658 | buf->ops = NULL; |
648 | sd->total_len -= err; | 659 | ops->release(pipe, buf); |
649 | if (sd->len) | 660 | pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1); |
650 | continue; | 661 | pipe->nrbufs--; |
662 | if (pipe->inode) | ||
663 | sd->need_wakeup = true; | ||
664 | } | ||
651 | 665 | ||
652 | if (!buf->len) { | 666 | if (!sd->total_len) |
653 | buf->ops = NULL; | 667 | return 0; |
654 | ops->release(pipe, buf); | 668 | } |
655 | pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1); | ||
656 | pipe->nrbufs--; | ||
657 | if (pipe->inode) | ||
658 | do_wakeup = 1; | ||
659 | } | ||
660 | 669 | ||
661 | if (!sd->total_len) | 670 | return 1; |
662 | break; | 671 | } |
663 | } | 672 | EXPORT_SYMBOL(splice_from_pipe_feed); |
664 | 673 | ||
665 | if (pipe->nrbufs) | 674 | /** |
666 | continue; | 675 | * splice_from_pipe_next - wait for some data to splice from |
676 | * @pipe: pipe to splice from | ||
677 | * @sd: information about the splice operation | ||
678 | * | ||
679 | * Description: | ||
680 | * This function will wait for some data and return a positive | ||
681 | * value (one) if pipe buffers are available. It will return zero | ||
682 | * or -errno if no more data needs to be spliced. | ||
683 | */ | ||
684 | int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd) | ||
685 | { | ||
686 | while (!pipe->nrbufs) { | ||
667 | if (!pipe->writers) | 687 | if (!pipe->writers) |
668 | break; | 688 | return 0; |
669 | if (!pipe->waiting_writers) { | ||
670 | if (ret) | ||
671 | break; | ||
672 | } | ||
673 | 689 | ||
674 | if (sd->flags & SPLICE_F_NONBLOCK) { | 690 | if (!pipe->waiting_writers && sd->num_spliced) |
675 | if (!ret) | 691 | return 0; |
676 | ret = -EAGAIN; | ||
677 | break; | ||
678 | } | ||
679 | 692 | ||
680 | if (signal_pending(current)) { | 693 | if (sd->flags & SPLICE_F_NONBLOCK) |
681 | if (!ret) | 694 | return -EAGAIN; |
682 | ret = -ERESTARTSYS; | ||
683 | break; | ||
684 | } | ||
685 | 695 | ||
686 | if (do_wakeup) { | 696 | if (signal_pending(current)) |
687 | smp_mb(); | 697 | return -ERESTARTSYS; |
688 | if (waitqueue_active(&pipe->wait)) | 698 | |
689 | wake_up_interruptible_sync(&pipe->wait); | 699 | if (sd->need_wakeup) { |
690 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | 700 | wakeup_pipe_writers(pipe); |
691 | do_wakeup = 0; | 701 | sd->need_wakeup = false; |
692 | } | 702 | } |
693 | 703 | ||
694 | pipe_wait(pipe); | 704 | pipe_wait(pipe); |
695 | } | 705 | } |
696 | 706 | ||
697 | if (do_wakeup) { | 707 | return 1; |
698 | smp_mb(); | 708 | } |
699 | if (waitqueue_active(&pipe->wait)) | 709 | EXPORT_SYMBOL(splice_from_pipe_next); |
700 | wake_up_interruptible(&pipe->wait); | ||
701 | kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); | ||
702 | } | ||
703 | 710 | ||
704 | return ret; | 711 | /** |
712 | * splice_from_pipe_begin - start splicing from pipe | ||
713 | * @sd: information about the splice operation | ||
714 | * | ||
715 | * Description: | ||
716 | * This function should be called before a loop containing | ||
717 | * splice_from_pipe_next() and splice_from_pipe_feed() to | ||
718 | * initialize the necessary fields of @sd. | ||
719 | */ | ||
720 | void splice_from_pipe_begin(struct splice_desc *sd) | ||
721 | { | ||
722 | sd->num_spliced = 0; | ||
723 | sd->need_wakeup = false; | ||
724 | } | ||
725 | EXPORT_SYMBOL(splice_from_pipe_begin); | ||
726 | |||
727 | /** | ||
728 | * splice_from_pipe_end - finish splicing from pipe | ||
729 | * @pipe: pipe to splice from | ||
730 | * @sd: information about the splice operation | ||
731 | * | ||
732 | * Description: | ||
733 | * This function will wake up pipe writers if necessary. It should | ||
734 | * be called after a loop containing splice_from_pipe_next() and | ||
735 | * splice_from_pipe_feed(). | ||
736 | */ | ||
737 | void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd) | ||
738 | { | ||
739 | if (sd->need_wakeup) | ||
740 | wakeup_pipe_writers(pipe); | ||
741 | } | ||
742 | EXPORT_SYMBOL(splice_from_pipe_end); | ||
743 | |||
744 | /** | ||
745 | * __splice_from_pipe - splice data from a pipe to given actor | ||
746 | * @pipe: pipe to splice from | ||
747 | * @sd: information to @actor | ||
748 | * @actor: handler that splices the data | ||
749 | * | ||
750 | * Description: | ||
751 | * This function does little more than loop over the pipe and call | ||
752 | * @actor to do the actual moving of a single struct pipe_buffer to | ||
753 | * the desired destination. See pipe_to_file, pipe_to_sendpage, or | ||
754 | * pipe_to_user. | ||
755 | * | ||
756 | */ | ||
757 | ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd, | ||
758 | splice_actor *actor) | ||
759 | { | ||
760 | int ret; | ||
761 | |||
762 | splice_from_pipe_begin(sd); | ||
763 | do { | ||
764 | ret = splice_from_pipe_next(pipe, sd); | ||
765 | if (ret > 0) | ||
766 | ret = splice_from_pipe_feed(pipe, sd, actor); | ||
767 | } while (ret > 0); | ||
768 | splice_from_pipe_end(pipe, sd); | ||
769 | |||
770 | return sd->num_spliced ? sd->num_spliced : ret; | ||
705 | } | 771 | } |
706 | EXPORT_SYMBOL(__splice_from_pipe); | 772 | EXPORT_SYMBOL(__splice_from_pipe); |
707 | 773 | ||
@@ -715,7 +781,7 @@ EXPORT_SYMBOL(__splice_from_pipe); | |||
715 | * @actor: handler that splices the data | 781 | * @actor: handler that splices the data |
716 | * | 782 | * |
717 | * Description: | 783 | * Description: |
718 | * See __splice_from_pipe. This function locks the input and output inodes, | 784 | * See __splice_from_pipe. This function locks the pipe inode, |
719 | * otherwise it's identical to __splice_from_pipe(). | 785 | * otherwise it's identical to __splice_from_pipe(). |
720 | * | 786 | * |
721 | */ | 787 | */ |
@@ -724,7 +790,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
724 | splice_actor *actor) | 790 | splice_actor *actor) |
725 | { | 791 | { |
726 | ssize_t ret; | 792 | ssize_t ret; |
727 | struct inode *inode = out->f_mapping->host; | ||
728 | struct splice_desc sd = { | 793 | struct splice_desc sd = { |
729 | .total_len = len, | 794 | .total_len = len, |
730 | .flags = flags, | 795 | .flags = flags, |
@@ -732,30 +797,15 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
732 | .u.file = out, | 797 | .u.file = out, |
733 | }; | 798 | }; |
734 | 799 | ||
735 | /* | 800 | pipe_lock(pipe); |
736 | * The actor worker might be calling ->write_begin and | ||
737 | * ->write_end. Most of the time, these expect i_mutex to | ||
738 | * be held. Since this may result in an ABBA deadlock with | ||
739 | * pipe->inode, we have to order lock acquiry here. | ||
740 | * | ||
741 | * Outer lock must be inode->i_mutex, as pipe_wait() will | ||
742 | * release and reacquire pipe->inode->i_mutex, AND inode must | ||
743 | * never be a pipe. | ||
744 | */ | ||
745 | WARN_ON(S_ISFIFO(inode->i_mode)); | ||
746 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); | ||
747 | if (pipe->inode) | ||
748 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); | ||
749 | ret = __splice_from_pipe(pipe, &sd, actor); | 801 | ret = __splice_from_pipe(pipe, &sd, actor); |
750 | if (pipe->inode) | 802 | pipe_unlock(pipe); |
751 | mutex_unlock(&pipe->inode->i_mutex); | ||
752 | mutex_unlock(&inode->i_mutex); | ||
753 | 803 | ||
754 | return ret; | 804 | return ret; |
755 | } | 805 | } |
756 | 806 | ||
757 | /** | 807 | /** |
758 | * generic_file_splice_write_nolock - generic_file_splice_write without mutexes | 808 | * generic_file_splice_write - splice data from a pipe to a file |
759 | * @pipe: pipe info | 809 | * @pipe: pipe info |
760 | * @out: file to write to | 810 | * @out: file to write to |
761 | * @ppos: position in @out | 811 | * @ppos: position in @out |
@@ -764,13 +814,12 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
764 | * | 814 | * |
765 | * Description: | 815 | * Description: |
766 | * Will either move or copy pages (determined by @flags options) from | 816 | * Will either move or copy pages (determined by @flags options) from |
767 | * the given pipe inode to the given file. The caller is responsible | 817 | * the given pipe inode to the given file. |
768 | * for acquiring i_mutex on both inodes. | ||
769 | * | 818 | * |
770 | */ | 819 | */ |
771 | ssize_t | 820 | ssize_t |
772 | generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, | 821 | generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, |
773 | loff_t *ppos, size_t len, unsigned int flags) | 822 | loff_t *ppos, size_t len, unsigned int flags) |
774 | { | 823 | { |
775 | struct address_space *mapping = out->f_mapping; | 824 | struct address_space *mapping = out->f_mapping; |
776 | struct inode *inode = mapping->host; | 825 | struct inode *inode = mapping->host; |
@@ -781,76 +830,28 @@ generic_file_splice_write_nolock(struct pipe_inode_info *pipe, struct file *out, | |||
781 | .u.file = out, | 830 | .u.file = out, |
782 | }; | 831 | }; |
783 | ssize_t ret; | 832 | ssize_t ret; |
784 | int err; | ||
785 | |||
786 | err = file_remove_suid(out); | ||
787 | if (unlikely(err)) | ||
788 | return err; | ||
789 | |||
790 | ret = __splice_from_pipe(pipe, &sd, pipe_to_file); | ||
791 | if (ret > 0) { | ||
792 | unsigned long nr_pages; | ||
793 | 833 | ||
794 | *ppos += ret; | 834 | pipe_lock(pipe); |
795 | nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | ||
796 | |||
797 | /* | ||
798 | * If file or inode is SYNC and we actually wrote some data, | ||
799 | * sync it. | ||
800 | */ | ||
801 | if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) { | ||
802 | err = generic_osync_inode(inode, mapping, | ||
803 | OSYNC_METADATA|OSYNC_DATA); | ||
804 | 835 | ||
805 | if (err) | 836 | splice_from_pipe_begin(&sd); |
806 | ret = err; | 837 | do { |
807 | } | 838 | ret = splice_from_pipe_next(pipe, &sd); |
808 | balance_dirty_pages_ratelimited_nr(mapping, nr_pages); | 839 | if (ret <= 0) |
809 | } | 840 | break; |
810 | 841 | ||
811 | return ret; | 842 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD); |
812 | } | 843 | ret = file_remove_suid(out); |
844 | if (!ret) | ||
845 | ret = splice_from_pipe_feed(pipe, &sd, pipe_to_file); | ||
846 | mutex_unlock(&inode->i_mutex); | ||
847 | } while (ret > 0); | ||
848 | splice_from_pipe_end(pipe, &sd); | ||
813 | 849 | ||
814 | EXPORT_SYMBOL(generic_file_splice_write_nolock); | 850 | pipe_unlock(pipe); |
815 | 851 | ||
816 | /** | 852 | if (sd.num_spliced) |
817 | * generic_file_splice_write - splice data from a pipe to a file | 853 | ret = sd.num_spliced; |
818 | * @pipe: pipe info | ||
819 | * @out: file to write to | ||
820 | * @ppos: position in @out | ||
821 | * @len: number of bytes to splice | ||
822 | * @flags: splice modifier flags | ||
823 | * | ||
824 | * Description: | ||
825 | * Will either move or copy pages (determined by @flags options) from | ||
826 | * the given pipe inode to the given file. | ||
827 | * | ||
828 | */ | ||
829 | ssize_t | ||
830 | generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out, | ||
831 | loff_t *ppos, size_t len, unsigned int flags) | ||
832 | { | ||
833 | struct address_space *mapping = out->f_mapping; | ||
834 | struct inode *inode = mapping->host; | ||
835 | struct splice_desc sd = { | ||
836 | .total_len = len, | ||
837 | .flags = flags, | ||
838 | .pos = *ppos, | ||
839 | .u.file = out, | ||
840 | }; | ||
841 | ssize_t ret; | ||
842 | 854 | ||
843 | WARN_ON(S_ISFIFO(inode->i_mode)); | ||
844 | mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); | ||
845 | ret = file_remove_suid(out); | ||
846 | if (likely(!ret)) { | ||
847 | if (pipe->inode) | ||
848 | mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD); | ||
849 | ret = __splice_from_pipe(pipe, &sd, pipe_to_file); | ||
850 | if (pipe->inode) | ||
851 | mutex_unlock(&pipe->inode->i_mutex); | ||
852 | } | ||
853 | mutex_unlock(&inode->i_mutex); | ||
854 | if (ret > 0) { | 855 | if (ret > 0) { |
855 | unsigned long nr_pages; | 856 | unsigned long nr_pages; |
856 | 857 | ||
@@ -1339,8 +1340,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov, | |||
1339 | if (!pipe) | 1340 | if (!pipe) |
1340 | return -EBADF; | 1341 | return -EBADF; |
1341 | 1342 | ||
1342 | if (pipe->inode) | 1343 | pipe_lock(pipe); |
1343 | mutex_lock(&pipe->inode->i_mutex); | ||
1344 | 1344 | ||
1345 | error = ret = 0; | 1345 | error = ret = 0; |
1346 | while (nr_segs) { | 1346 | while (nr_segs) { |
@@ -1395,8 +1395,7 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov, | |||
1395 | iov++; | 1395 | iov++; |
1396 | } | 1396 | } |
1397 | 1397 | ||
1398 | if (pipe->inode) | 1398 | pipe_unlock(pipe); |
1399 | mutex_unlock(&pipe->inode->i_mutex); | ||
1400 | 1399 | ||
1401 | if (!ret) | 1400 | if (!ret) |
1402 | ret = error; | 1401 | ret = error; |
@@ -1524,7 +1523,7 @@ static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1524 | return 0; | 1523 | return 0; |
1525 | 1524 | ||
1526 | ret = 0; | 1525 | ret = 0; |
1527 | mutex_lock(&pipe->inode->i_mutex); | 1526 | pipe_lock(pipe); |
1528 | 1527 | ||
1529 | while (!pipe->nrbufs) { | 1528 | while (!pipe->nrbufs) { |
1530 | if (signal_pending(current)) { | 1529 | if (signal_pending(current)) { |
@@ -1542,7 +1541,7 @@ static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1542 | pipe_wait(pipe); | 1541 | pipe_wait(pipe); |
1543 | } | 1542 | } |
1544 | 1543 | ||
1545 | mutex_unlock(&pipe->inode->i_mutex); | 1544 | pipe_unlock(pipe); |
1546 | return ret; | 1545 | return ret; |
1547 | } | 1546 | } |
1548 | 1547 | ||
@@ -1562,7 +1561,7 @@ static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1562 | return 0; | 1561 | return 0; |
1563 | 1562 | ||
1564 | ret = 0; | 1563 | ret = 0; |
1565 | mutex_lock(&pipe->inode->i_mutex); | 1564 | pipe_lock(pipe); |
1566 | 1565 | ||
1567 | while (pipe->nrbufs >= PIPE_BUFFERS) { | 1566 | while (pipe->nrbufs >= PIPE_BUFFERS) { |
1568 | if (!pipe->readers) { | 1567 | if (!pipe->readers) { |
@@ -1583,7 +1582,7 @@ static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags) | |||
1583 | pipe->waiting_writers--; | 1582 | pipe->waiting_writers--; |
1584 | } | 1583 | } |
1585 | 1584 | ||
1586 | mutex_unlock(&pipe->inode->i_mutex); | 1585 | pipe_unlock(pipe); |
1587 | return ret; | 1586 | return ret; |
1588 | } | 1587 | } |
1589 | 1588 | ||
@@ -1599,10 +1598,10 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1599 | 1598 | ||
1600 | /* | 1599 | /* |
1601 | * Potential ABBA deadlock, work around it by ordering lock | 1600 | * Potential ABBA deadlock, work around it by ordering lock |
1602 | * grabbing by inode address. Otherwise two different processes | 1601 | * grabbing by pipe info address. Otherwise two different processes |
1603 | * could deadlock (one doing tee from A -> B, the other from B -> A). | 1602 | * could deadlock (one doing tee from A -> B, the other from B -> A). |
1604 | */ | 1603 | */ |
1605 | inode_double_lock(ipipe->inode, opipe->inode); | 1604 | pipe_double_lock(ipipe, opipe); |
1606 | 1605 | ||
1607 | do { | 1606 | do { |
1608 | if (!opipe->readers) { | 1607 | if (!opipe->readers) { |
@@ -1653,7 +1652,8 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1653 | if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) | 1652 | if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) |
1654 | ret = -EAGAIN; | 1653 | ret = -EAGAIN; |
1655 | 1654 | ||
1656 | inode_double_unlock(ipipe->inode, opipe->inode); | 1655 | pipe_unlock(ipipe); |
1656 | pipe_unlock(opipe); | ||
1657 | 1657 | ||
1658 | /* | 1658 | /* |
1659 | * If we put data in the output pipe, wakeup any potential readers. | 1659 | * If we put data in the output pipe, wakeup any potential readers. |