diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 950e28c0cdf2..db003438aaf5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -921,7 +921,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,  	}  	md5sig = rcu_dereference_protected(tp->md5sig_info, -					   sock_owned_by_user(sk)); +					   sock_owned_by_user(sk) || +					   lockdep_is_held(&sk->sk_lock.slock));  	if (!md5sig) {  		md5sig = kmalloc(sizeof(*md5sig), gfp);  		if (!md5sig) @@ -2158,6 +2159,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i)  	__u16 destp = ntohs(inet->inet_dport);  	__u16 srcp = ntohs(inet->inet_sport);  	int rx_queue; +	int state;  	if (icsk->icsk_pending == ICSK_TIME_RETRANS ||  	    icsk->icsk_pending == ICSK_TIME_EARLY_RETRANS || @@ -2175,17 +2177,18 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i)  		timer_expires = jiffies;  	} -	if (sk->sk_state == TCP_LISTEN) +	state = sk_state_load(sk); +	if (state == TCP_LISTEN)  		rx_queue = sk->sk_ack_backlog;  	else -		/* -		 * because we dont lock socket, we might find a transient negative value +		/* Because we don't lock the socket, +		 * we might find a transient negative value.  		 */  		rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0);  	seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "  			"%08X %5u %8d %lu %d %pK %lu %lu %u %u %d", -		i, src, srcp, dest, destp, sk->sk_state, +		i, src, srcp, dest, destp, state,  		tp->write_seq - tp->snd_una,  		rx_queue,  		timer_active, @@ -2199,8 +2202,8 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i)  		jiffies_to_clock_t(icsk->icsk_ack.ato),  		(icsk->icsk_ack.quick << 1) | icsk->icsk_ack.pingpong,  		tp->snd_cwnd, -		sk->sk_state == TCP_LISTEN ? -		    (fastopenq ? fastopenq->max_qlen : 0) : +		state == TCP_LISTEN ? +		    fastopenq->max_qlen :  		    (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh));  }  | 
