diff options
Diffstat (limited to 'net/ipv6/udp.c')
| -rw-r--r-- | net/ipv6/udp.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e5a337e6b970..317b01c9bc39 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1653,6 +1653,20 @@ do_confirm:  }  EXPORT_SYMBOL(udpv6_sendmsg); +static void udpv6_splice_eof(struct socket *sock) +{ +	struct sock *sk = sock->sk; +	struct udp_sock *up = udp_sk(sk); + +	if (!up->pending || READ_ONCE(up->corkflag)) +		return; + +	lock_sock(sk); +	if (up->pending && !READ_ONCE(up->corkflag)) +		udp_v6_push_pending_frames(sk); +	release_sock(sk); +} +  void udpv6_destroy_sock(struct sock *sk)  {  	struct udp_sock *up = udp_sk(sk); @@ -1764,6 +1778,7 @@ struct proto udpv6_prot = {  	.getsockopt		= udpv6_getsockopt,  	.sendmsg		= udpv6_sendmsg,  	.recvmsg		= udpv6_recvmsg, +	.splice_eof		= udpv6_splice_eof,  	.release_cb		= ip6_datagram_release_cb,  	.hash			= udp_lib_hash,  	.unhash			= udp_lib_unhash,  |