Commit 5677242f authored by Denis V. Lunev's avatar Denis V. Lunev Committed by David S. Miller

[NETNS]: Inet control socket should not hold a namespace.

This is a generic requirement, so make inet_ctl_sock_create namespace
aware and create a inet_ctl_sock_destroy wrapper around
sk_release_kernel.
Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Acked-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eee4fe4d
...@@ -42,7 +42,13 @@ extern int inet_ioctl(struct socket *sock, ...@@ -42,7 +42,13 @@ extern int inet_ioctl(struct socket *sock,
extern int inet_ctl_sock_create(struct sock **sk, extern int inet_ctl_sock_create(struct sock **sk,
unsigned short family, unsigned short family,
unsigned short type, unsigned short type,
unsigned char protocol); unsigned char protocol,
struct net *net);
static inline void inet_ctl_sock_destroy(struct sock *sk)
{
sk_release_kernel(sk);
}
#endif #endif
......
...@@ -1003,7 +1003,7 @@ static int __init dccp_v4_init(void) ...@@ -1003,7 +1003,7 @@ static int __init dccp_v4_init(void)
inet_register_protosw(&dccp_v4_protosw); inet_register_protosw(&dccp_v4_protosw);
err = inet_ctl_sock_create(&dccp_v4_ctl_sk, PF_INET, err = inet_ctl_sock_create(&dccp_v4_ctl_sk, PF_INET,
SOCK_DCCP, IPPROTO_DCCP); SOCK_DCCP, IPPROTO_DCCP, &init_net);
if (err) if (err)
goto out_unregister_protosw; goto out_unregister_protosw;
out: out:
...@@ -1018,7 +1018,7 @@ static int __init dccp_v4_init(void) ...@@ -1018,7 +1018,7 @@ static int __init dccp_v4_init(void)
static void __exit dccp_v4_exit(void) static void __exit dccp_v4_exit(void)
{ {
sock_release(dccp_v4_ctl_sk->sk_socket); inet_ctl_sock_destroy(dccp_v4_ctl_sk);
inet_unregister_protosw(&dccp_v4_protosw); inet_unregister_protosw(&dccp_v4_protosw);
inet_del_protocol(&dccp_v4_protocol, IPPROTO_DCCP); inet_del_protocol(&dccp_v4_protocol, IPPROTO_DCCP);
proto_unregister(&dccp_v4_prot); proto_unregister(&dccp_v4_prot);
......
...@@ -1185,7 +1185,7 @@ static int __init dccp_v6_init(void) ...@@ -1185,7 +1185,7 @@ static int __init dccp_v6_init(void)
inet6_register_protosw(&dccp_v6_protosw); inet6_register_protosw(&dccp_v6_protosw);
err = inet_ctl_sock_create(&dccp_v6_ctl_sk, PF_INET6, err = inet_ctl_sock_create(&dccp_v6_ctl_sk, PF_INET6,
SOCK_DCCP, IPPROTO_DCCP); SOCK_DCCP, IPPROTO_DCCP, &init_net);
if (err != 0) if (err != 0)
goto out_unregister_protosw; goto out_unregister_protosw;
out: out:
...@@ -1200,7 +1200,7 @@ static int __init dccp_v6_init(void) ...@@ -1200,7 +1200,7 @@ static int __init dccp_v6_init(void)
static void __exit dccp_v6_exit(void) static void __exit dccp_v6_exit(void)
{ {
sock_release(dccp_v6_ctl_sk->sk_socket); inet_ctl_sock_destroy(dccp_v6_ctl_sk);
inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP); inet6_del_protocol(&dccp_v6_protocol, IPPROTO_DCCP);
inet6_unregister_protosw(&dccp_v6_protosw); inet6_unregister_protosw(&dccp_v6_protosw);
proto_unregister(&dccp_v6_prot); proto_unregister(&dccp_v6_prot);
......
...@@ -1251,7 +1251,8 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features) ...@@ -1251,7 +1251,8 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
} }
int inet_ctl_sock_create(struct sock **sk, unsigned short family, int inet_ctl_sock_create(struct sock **sk, unsigned short family,
unsigned short type, unsigned char protocol) unsigned short type, unsigned char protocol,
struct net *net)
{ {
struct socket *sock; struct socket *sock;
int rc = sock_create_kern(family, type, protocol, &sock); int rc = sock_create_kern(family, type, protocol, &sock);
...@@ -1265,6 +1266,8 @@ int inet_ctl_sock_create(struct sock **sk, unsigned short family, ...@@ -1265,6 +1266,8 @@ int inet_ctl_sock_create(struct sock **sk, unsigned short family,
* we do not wish this socket to see incoming packets. * we do not wish this socket to see incoming packets.
*/ */
(*sk)->sk_prot->unhash(*sk); (*sk)->sk_prot->unhash(*sk);
sk_change_net(*sk, net);
} }
return rc; return rc;
} }
......
...@@ -2491,7 +2491,7 @@ struct proto tcp_prot = { ...@@ -2491,7 +2491,7 @@ struct proto tcp_prot = {
void __init tcp_v4_init(void) void __init tcp_v4_init(void)
{ {
if (inet_ctl_sock_create(&tcp_sock, PF_INET, SOCK_RAW, if (inet_ctl_sock_create(&tcp_sock, PF_INET, SOCK_RAW,
IPPROTO_TCP) < 0) IPPROTO_TCP, &init_net) < 0)
panic("Failed to create the TCP control socket.\n"); panic("Failed to create the TCP control socket.\n");
} }
......
...@@ -2199,21 +2199,13 @@ static struct inet_protosw tcpv6_protosw = { ...@@ -2199,21 +2199,13 @@ static struct inet_protosw tcpv6_protosw = {
static int tcpv6_net_init(struct net *net) static int tcpv6_net_init(struct net *net)
{ {
int err; return inet_ctl_sock_create(&net->ipv6.tcp_sk, PF_INET6,
struct sock *sk; SOCK_RAW, IPPROTO_TCP, net);
err = inet_ctl_sock_create(&sk, PF_INET6, SOCK_RAW, IPPROTO_TCP);
if (err)
return err;
net->ipv6.tcp_sk = sk;
sk_change_net(sk, net);
return err;
} }
static void tcpv6_net_exit(struct net *net) static void tcpv6_net_exit(struct net *net)
{ {
sk_release_kernel(net->ipv6.tcp_sk); inet_ctl_sock_destroy(net->ipv6.tcp_sk);
} }
static struct pernet_operations tcpv6_net_ops = { static struct pernet_operations tcpv6_net_ops = {
......
...@@ -681,7 +681,7 @@ static int sctp_ctl_sock_init(void) ...@@ -681,7 +681,7 @@ static int sctp_ctl_sock_init(void)
family = PF_INET; family = PF_INET;
err = inet_ctl_sock_create(&sctp_ctl_sock, family, err = inet_ctl_sock_create(&sctp_ctl_sock, family,
SOCK_SEQPACKET, IPPROTO_SCTP); SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
if (err < 0) { if (err < 0) {
printk(KERN_ERR printk(KERN_ERR
"SCTP: Failed to create the SCTP control socket.\n"); "SCTP: Failed to create the SCTP control socket.\n");
...@@ -1284,7 +1284,7 @@ SCTP_STATIC __init int sctp_init(void) ...@@ -1284,7 +1284,7 @@ SCTP_STATIC __init int sctp_init(void)
sctp_v6_del_protocol(); sctp_v6_del_protocol();
err_add_protocol: err_add_protocol:
sctp_v4_del_protocol(); sctp_v4_del_protocol();
sock_release(sctp_ctl_sock->sk_socket); inet_ctl_sock_destroy(sctp_ctl_sock);
err_ctl_sock_init: err_ctl_sock_init:
sctp_v6_protosw_exit(); sctp_v6_protosw_exit();
err_v6_protosw_init: err_v6_protosw_init:
...@@ -1328,7 +1328,7 @@ SCTP_STATIC __exit void sctp_exit(void) ...@@ -1328,7 +1328,7 @@ SCTP_STATIC __exit void sctp_exit(void)
sctp_v4_del_protocol(); sctp_v4_del_protocol();
/* Free the control endpoint. */ /* Free the control endpoint. */
sock_release(sctp_ctl_sock->sk_socket); inet_ctl_sock_destroy(sctp_ctl_sock);
/* Free protosw registrations */ /* Free protosw registrations */
sctp_v6_protosw_exit(); sctp_v6_protosw_exit();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment