diff options
| -rw-r--r-- | net/ipv4/tcp_output.c | 23 | 
1 files changed, 12 insertions, 11 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 76f840917bc..80147ba4414 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1530,13 +1530,6 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)  	int cwnd_quota;  	int result; -	/* If we are closed, the bytes will have to remain here. -	 * In time closedown will finish, we empty the write queue and all -	 * will be happy. -	 */ -	if (unlikely(sk->sk_state == TCP_CLOSE)) -		return 0; -  	sent_pkts = 0;  	/* Do MTU probing. */ @@ -1608,10 +1601,18 @@ void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss,  {  	struct sk_buff *skb = tcp_send_head(sk); -	if (skb) { -		if (tcp_write_xmit(sk, cur_mss, nonagle)) -			tcp_check_probe_timer(sk); -	} +	if (!skb) +		return; + +	/* If we are closed, the bytes will have to remain here. +	 * In time closedown will finish, we empty the write queue and +	 * all will be happy. +	 */ +	if (unlikely(sk->sk_state == TCP_CLOSE)) +		return; + +	if (tcp_write_xmit(sk, cur_mss, nonagle)) +		tcp_check_probe_timer(sk);  }  /* Send _single_ skb sitting at the send head. This function requires  |