diff options
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4787f86ae64c..b945c2b046c5 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1136,11 +1136,12 @@ int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) | |||
1136 | /* This should be in poll */ | 1136 | /* This should be in poll */ |
1137 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); | 1137 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
1138 | 1138 | ||
1139 | mss_now = tcp_send_mss(sk, &size_goal, flags); | ||
1140 | |||
1141 | /* Ok commence sending. */ | 1139 | /* Ok commence sending. */ |
1142 | copied = 0; | 1140 | copied = 0; |
1143 | 1141 | ||
1142 | restart: | ||
1143 | mss_now = tcp_send_mss(sk, &size_goal, flags); | ||
1144 | |||
1144 | err = -EPIPE; | 1145 | err = -EPIPE; |
1145 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) | 1146 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) |
1146 | goto out_err; | 1147 | goto out_err; |
@@ -1166,6 +1167,9 @@ new_segment: | |||
1166 | if (!sk_stream_memory_free(sk)) | 1167 | if (!sk_stream_memory_free(sk)) |
1167 | goto wait_for_sndbuf; | 1168 | goto wait_for_sndbuf; |
1168 | 1169 | ||
1170 | if (sk_flush_backlog(sk)) | ||
1171 | goto restart; | ||
1172 | |||
1169 | skb = sk_stream_alloc_skb(sk, | 1173 | skb = sk_stream_alloc_skb(sk, |
1170 | select_size(sk, sg), | 1174 | select_size(sk, sg), |
1171 | sk->sk_allocation, | 1175 | sk->sk_allocation, |