diff options
| author | Ingo Molnar <mingo@kernel.org> | 2012-12-07 12:15:33 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2012-12-07 12:15:33 +0100 | 
| commit | 222e82bef4bd520a31d48c31ab24e49dd46daa46 (patch) | |
| tree | b6e73cad8e0b3a1c3e1acc537789e97aadaefa92 /net/ipv4/tcp.c | |
| parent | 38ca9c927c7d3db61f57e3d3a9334958c3af6e9a (diff) | |
| parent | 18a2f371f5edf41810f6469cb9be39931ef9deb9 (diff) | |
Merge branch 'linus' into sched/core
Pick up the autogroups fix and other fixes.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'net/ipv4/tcp.c')
| -rw-r--r-- | net/ipv4/tcp.c | 29 | 
1 files changed, 13 insertions, 16 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f32c02e2a543..e457c7ab2e28 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -549,14 +549,12 @@ int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg)  			 !tp->urg_data ||  			 before(tp->urg_seq, tp->copied_seq) ||  			 !before(tp->urg_seq, tp->rcv_nxt)) { -			struct sk_buff *skb;  			answ = tp->rcv_nxt - tp->copied_seq; -			/* Subtract 1, if FIN is in queue. */ -			skb = skb_peek_tail(&sk->sk_receive_queue); -			if (answ && skb) -				answ -= tcp_hdr(skb)->fin; +			/* Subtract 1, if FIN was received */ +			if (answ && sock_flag(sk, SOCK_DONE)) +				answ--;  		} else  			answ = tp->urg_seq - tp->copied_seq;  		release_sock(sk); @@ -832,8 +830,8 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags)  	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; @@ -860,12 +858,9 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffse  	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; -		int offset = poffset % PAGE_SIZE; -		int size = min_t(size_t, psize, PAGE_SIZE - offset);  		bool can_coalesce;  		if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) { @@ -914,8 +909,8 @@ new_segment:  			TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH;  		copied += copy; -		poffset += copy; -		if (!(psize -= copy)) +		offset += copy; +		if (!(size -= copy))  			goto out;  		if (skb->len < size_goal || (flags & MSG_OOB)) @@ -962,7 +957,7 @@ int tcp_sendpage(struct sock *sk, struct page *page, int offset,  					flags);  	lock_sock(sk); -	res = do_tcp_sendpages(sk, &page, offset, size, flags); +	res = do_tcp_sendpages(sk, page, offset, size, flags);  	release_sock(sk);  	return res;  } @@ -1214,7 +1209,7 @@ new_segment:  wait_for_sndbuf:  			set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);  wait_for_memory: -			if (copied && likely(!tp->repair)) +			if (copied)  				tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH);  			if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) @@ -1225,7 +1220,7 @@ wait_for_memory:  	}  out: -	if (copied && likely(!tp->repair)) +	if (copied)  		tcp_push(sk, flags, mss_now, tp->nonagle);  	release_sock(sk);  	return copied + copied_syn; @@ -2766,6 +2761,8 @@ void tcp_get_info(const struct sock *sk, struct tcp_info *info)  		info->tcpi_options |= TCPI_OPT_ECN;  	if (tp->ecn_flags & TCP_ECN_SEEN)  		info->tcpi_options |= TCPI_OPT_ECN_SEEN; +	if (tp->syn_data_acked) +		info->tcpi_options |= TCPI_OPT_SYN_DATA;  	info->tcpi_rto = jiffies_to_usecs(icsk->icsk_rto);  	info->tcpi_ato = jiffies_to_usecs(icsk->icsk_ack.ato);  | 
