+++ /dev/null
---- a/net/ipv4/tcp.c 2014-10-31 14:27:58.000000000 +0200
-+++ b/net/ipv4/tcp.c 2015-05-19 15:34:22.078802741 +0300
-@@ -763,8 +763,8 @@ static int tcp_send_mss(struct sock *sk,
- return mss_now;
- }
-
--static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset,
-- size_t psize, int flags)
-+static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset,
-+ size_t size, int flags)
- {
- struct tcp_sock *tp = tcp_sk(sk);
- int mss_now, size_goal;
-@@ -786,12 +786,9 @@ static ssize_t do_tcp_sendpages(struct s
- if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
- goto out_err;
-
-- while (psize > 0) {
-+ while (size > 0) {
- struct sk_buff *skb = tcp_write_queue_tail(sk);
-- struct page *page = pages[poffset / PAGE_SIZE];
- int copy, i, can_coalesce;
-- int offset = poffset % PAGE_SIZE;
-- int size = min_t(size_t, psize, PAGE_SIZE - offset);
-
- if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) {
- new_segment:
-@@ -840,8 +837,8 @@ new_segment:
- TCP_SKB_CB(skb)->flags &= ~TCPCB_FLAG_PSH;
-
- copied += copy;
-- poffset += copy;
-- if (!(psize -= copy))
-+ offset += copy;
-+ if (!(size -= copy))
- goto out;
-
- if (skb->len < size_goal || (flags & MSG_OOB))
-@@ -890,7 +887,7 @@ ssize_t tcp_sendpage(struct socket *sock
-
- lock_sock(sk);
- TCP_CHECK_TIMER(sk);
-- res = do_tcp_sendpages(sk, &page, offset, size, flags);
-+ res = do_tcp_sendpages(sk, page, offset, size, flags);
- TCP_CHECK_TIMER(sk);
- release_sock(sk);
- return res;