diff options
Diffstat (limited to 'net/ipv4/tcp.c')
| -rw-r--r-- | net/ipv4/tcp.c | 10 | 
1 files changed, 5 insertions, 5 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f8232811a5be..3f570b25c53d 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -457,6 +457,7 @@ void tcp_init_sock(struct sock *sk)  	WRITE_ONCE(sk->sk_sndbuf, READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_wmem[1]));  	WRITE_ONCE(sk->sk_rcvbuf, READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_rmem[1])); +	set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags);  	sk_sockets_allocated_inc(sk);  }  EXPORT_SYMBOL(tcp_init_sock); @@ -1999,7 +2000,7 @@ static int receive_fallback_to_copy(struct sock *sk,  	if (copy_address != zc->copybuf_address)  		return -EINVAL; -	err = import_single_range(READ, (void __user *)copy_address, +	err = import_single_range(ITER_DEST, (void __user *)copy_address,  				  inq, &iov, &msg.msg_iter);  	if (err)  		return err; @@ -2033,7 +2034,7 @@ static int tcp_copy_straggler_data(struct tcp_zerocopy_receive *zc,  	if (copy_address != zc->copybuf_address)  		return -EINVAL; -	err = import_single_range(READ, (void __user *)copy_address, +	err = import_single_range(ITER_DEST, (void __user *)copy_address,  				  copylen, &iov, &msg.msg_iter);  	if (err)  		return err; @@ -3113,8 +3114,7 @@ int tcp_disconnect(struct sock *sk, int flags)  	inet->inet_dport = 0; -	if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) -		inet_reset_saddr(sk); +	inet_bhash2_reset_saddr(sk);  	sk->sk_shutdown = 0;  	sock_reset_flag(sk, SOCK_DONE); @@ -3646,7 +3646,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,  	case TCP_REPAIR_OPTIONS:  		if (!tp->repair)  			err = -EINVAL; -		else if (sk->sk_state == TCP_ESTABLISHED) +		else if (sk->sk_state == TCP_ESTABLISHED && !tp->bytes_sent)  			err = tcp_repair_options_est(sk, optval, optlen);  		else  			err = -EPERM;  |