diff options
44 files changed, 184 insertions, 113 deletions
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index ee8ce195c538..53fcee26d6ae 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
@@ -477,12 +477,12 @@ static struct proto pppoe_sk_proto = { | |||
477 | * Initialize a new struct sock. | 477 | * Initialize a new struct sock. |
478 | * | 478 | * |
479 | **********************************************************************/ | 479 | **********************************************************************/ |
480 | static int pppoe_create(struct socket *sock) | 480 | static int pppoe_create(struct net *net, struct socket *sock) |
481 | { | 481 | { |
482 | int error = -ENOMEM; | 482 | int error = -ENOMEM; |
483 | struct sock *sk; | 483 | struct sock *sk; |
484 | 484 | ||
485 | sk = sk_alloc(PF_PPPOX, GFP_KERNEL, &pppoe_sk_proto, 1); | 485 | sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppoe_sk_proto, 1); |
486 | if (!sk) | 486 | if (!sk) |
487 | goto out; | 487 | goto out; |
488 | 488 | ||
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 2eb424ba58e5..921d4ef6d14b 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -1411,12 +1411,12 @@ static struct proto pppol2tp_sk_proto = { | |||
1411 | 1411 | ||
1412 | /* socket() handler. Initialize a new struct sock. | 1412 | /* socket() handler. Initialize a new struct sock. |
1413 | */ | 1413 | */ |
1414 | static int pppol2tp_create(struct socket *sock) | 1414 | static int pppol2tp_create(struct net *net, struct socket *sock) |
1415 | { | 1415 | { |
1416 | int error = -ENOMEM; | 1416 | int error = -ENOMEM; |
1417 | struct sock *sk; | 1417 | struct sock *sk; |
1418 | 1418 | ||
1419 | sk = sk_alloc(PF_PPPOX, GFP_KERNEL, &pppol2tp_sk_proto, 1); | 1419 | sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppol2tp_sk_proto, 1); |
1420 | if (!sk) | 1420 | if (!sk) |
1421 | goto out; | 1421 | goto out; |
1422 | 1422 | ||
diff --git a/drivers/net/pppox.c b/drivers/net/pppox.c index 25c52b55c38f..c6898c1fc54d 100644 --- a/drivers/net/pppox.c +++ b/drivers/net/pppox.c | |||
@@ -104,10 +104,13 @@ int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
104 | 104 | ||
105 | EXPORT_SYMBOL(pppox_ioctl); | 105 | EXPORT_SYMBOL(pppox_ioctl); |
106 | 106 | ||
107 | static int pppox_create(struct socket *sock, int protocol) | 107 | static int pppox_create(struct net *net, struct socket *sock, int protocol) |
108 | { | 108 | { |
109 | int rc = -EPROTOTYPE; | 109 | int rc = -EPROTOTYPE; |
110 | 110 | ||
111 | if (net != &init_net) | ||
112 | return -EAFNOSUPPORT; | ||
113 | |||
111 | if (protocol < 0 || protocol > PX_MAX_PROTO) | 114 | if (protocol < 0 || protocol > PX_MAX_PROTO) |
112 | goto out; | 115 | goto out; |
113 | 116 | ||
@@ -123,7 +126,7 @@ static int pppox_create(struct socket *sock, int protocol) | |||
123 | !try_module_get(pppox_protos[protocol]->owner)) | 126 | !try_module_get(pppox_protos[protocol]->owner)) |
124 | goto out; | 127 | goto out; |
125 | 128 | ||
126 | rc = pppox_protos[protocol]->create(sock); | 129 | rc = pppox_protos[protocol]->create(net, sock); |
127 | 130 | ||
128 | module_put(pppox_protos[protocol]->owner); | 131 | module_put(pppox_protos[protocol]->owner); |
129 | out: | 132 | out: |
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index 25652545ba6e..43cfc9f0c078 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h | |||
@@ -172,7 +172,7 @@ static inline struct sock *sk_pppox(struct pppox_sock *po) | |||
172 | struct module; | 172 | struct module; |
173 | 173 | ||
174 | struct pppox_proto { | 174 | struct pppox_proto { |
175 | int (*create)(struct socket *sock); | 175 | int (*create)(struct net *net, struct socket *sock); |
176 | int (*ioctl)(struct socket *sock, unsigned int cmd, | 176 | int (*ioctl)(struct socket *sock, unsigned int cmd, |
177 | unsigned long arg); | 177 | unsigned long arg); |
178 | struct module *owner; | 178 | struct module *owner; |
diff --git a/include/linux/net.h b/include/linux/net.h index efc45177b503..c136abce7ef6 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | struct poll_table_struct; | 24 | struct poll_table_struct; |
25 | struct inode; | 25 | struct inode; |
26 | struct net; | ||
26 | 27 | ||
27 | #define NPROTO 34 /* should be enough for now.. */ | 28 | #define NPROTO 34 /* should be enough for now.. */ |
28 | 29 | ||
@@ -169,7 +170,7 @@ struct proto_ops { | |||
169 | 170 | ||
170 | struct net_proto_family { | 171 | struct net_proto_family { |
171 | int family; | 172 | int family; |
172 | int (*create)(struct socket *sock, int protocol); | 173 | int (*create)(struct net *net, struct socket *sock, int protocol); |
173 | struct module *owner; | 174 | struct module *owner; |
174 | }; | 175 | }; |
175 | 176 | ||
diff --git a/include/net/iucv/af_iucv.h b/include/net/iucv/af_iucv.h index b6c468cd7f5b..c661c6fd6fd5 100644 --- a/include/net/iucv/af_iucv.h +++ b/include/net/iucv/af_iucv.h | |||
@@ -78,7 +78,6 @@ static void iucv_sock_destruct(struct sock *sk); | |||
78 | static void iucv_sock_cleanup_listen(struct sock *parent); | 78 | static void iucv_sock_cleanup_listen(struct sock *parent); |
79 | static void iucv_sock_kill(struct sock *sk); | 79 | static void iucv_sock_kill(struct sock *sk); |
80 | static void iucv_sock_close(struct sock *sk); | 80 | static void iucv_sock_close(struct sock *sk); |
81 | static int iucv_sock_create(struct socket *sock, int proto); | ||
82 | static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr, | 81 | static int iucv_sock_bind(struct socket *sock, struct sockaddr *addr, |
83 | int addr_len); | 82 | int addr_len); |
84 | static int iucv_sock_connect(struct socket *sock, struct sockaddr *addr, | 83 | static int iucv_sock_connect(struct socket *sock, struct sockaddr *addr, |
diff --git a/include/net/llc_conn.h b/include/net/llc_conn.h index 00730d21b522..e2374e34989f 100644 --- a/include/net/llc_conn.h +++ b/include/net/llc_conn.h | |||
@@ -93,7 +93,7 @@ static __inline__ char llc_backlog_type(struct sk_buff *skb) | |||
93 | return skb->cb[sizeof(skb->cb) - 1]; | 93 | return skb->cb[sizeof(skb->cb) - 1]; |
94 | } | 94 | } |
95 | 95 | ||
96 | extern struct sock *llc_sk_alloc(int family, gfp_t priority, | 96 | extern struct sock *llc_sk_alloc(struct net *net, int family, gfp_t priority, |
97 | struct proto *prot); | 97 | struct proto *prot); |
98 | extern void llc_sk_free(struct sock *sk); | 98 | extern void llc_sk_free(struct sock *sk); |
99 | 99 | ||
diff --git a/include/net/sock.h b/include/net/sock.h index 9ef8b5fb7936..74e1f7d90d73 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -56,6 +56,7 @@ | |||
56 | #include <asm/atomic.h> | 56 | #include <asm/atomic.h> |
57 | #include <net/dst.h> | 57 | #include <net/dst.h> |
58 | #include <net/checksum.h> | 58 | #include <net/checksum.h> |
59 | #include <net/net_namespace.h> | ||
59 | 60 | ||
60 | /* | 61 | /* |
61 | * This structure really needs to be cleaned up. | 62 | * This structure really needs to be cleaned up. |
@@ -776,7 +777,7 @@ extern void FASTCALL(release_sock(struct sock *sk)); | |||
776 | SINGLE_DEPTH_NESTING) | 777 | SINGLE_DEPTH_NESTING) |
777 | #define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) | 778 | #define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) |
778 | 779 | ||
779 | extern struct sock *sk_alloc(int family, | 780 | extern struct sock *sk_alloc(struct net *net, int family, |
780 | gfp_t priority, | 781 | gfp_t priority, |
781 | struct proto *prot, int zero_it); | 782 | struct proto *prot, int zero_it); |
782 | extern void sk_free(struct sock *sk); | 783 | extern void sk_free(struct sock *sk); |
@@ -1005,6 +1006,7 @@ static inline void sock_copy(struct sock *nsk, const struct sock *osk) | |||
1005 | #endif | 1006 | #endif |
1006 | 1007 | ||
1007 | memcpy(nsk, osk, osk->sk_prot->obj_size); | 1008 | memcpy(nsk, osk, osk->sk_prot->obj_size); |
1009 | get_net(nsk->sk_net); | ||
1008 | #ifdef CONFIG_SECURITY_NETWORK | 1010 | #ifdef CONFIG_SECURITY_NETWORK |
1009 | nsk->sk_security = sptr; | 1011 | nsk->sk_security = sptr; |
1010 | security_sk_clone(osk, nsk); | 1012 | security_sk_clone(osk, nsk); |
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 594b59739546..fd1d52f09707 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -1026,11 +1026,14 @@ static struct proto ddp_proto = { | |||
1026 | * Create a socket. Initialise the socket, blank the addresses | 1026 | * Create a socket. Initialise the socket, blank the addresses |
1027 | * set the state. | 1027 | * set the state. |
1028 | */ | 1028 | */ |
1029 | static int atalk_create(struct socket *sock, int protocol) | 1029 | static int atalk_create(struct net *net, struct socket *sock, int protocol) |
1030 | { | 1030 | { |
1031 | struct sock *sk; | 1031 | struct sock *sk; |
1032 | int rc = -ESOCKTNOSUPPORT; | 1032 | int rc = -ESOCKTNOSUPPORT; |
1033 | 1033 | ||
1034 | if (net != &init_net) | ||
1035 | return -EAFNOSUPPORT; | ||
1036 | |||
1034 | /* | 1037 | /* |
1035 | * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do | 1038 | * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do |
1036 | * and gives you the full ELAP frame. Should be handy for CAP 8) | 1039 | * and gives you the full ELAP frame. Should be handy for CAP 8) |
@@ -1038,7 +1041,7 @@ static int atalk_create(struct socket *sock, int protocol) | |||
1038 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) | 1041 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) |
1039 | goto out; | 1042 | goto out; |
1040 | rc = -ENOMEM; | 1043 | rc = -ENOMEM; |
1041 | sk = sk_alloc(PF_APPLETALK, GFP_KERNEL, &ddp_proto, 1); | 1044 | sk = sk_alloc(net, PF_APPLETALK, GFP_KERNEL, &ddp_proto, 1); |
1042 | if (!sk) | 1045 | if (!sk) |
1043 | goto out; | 1046 | goto out; |
1044 | rc = 0; | 1047 | rc = 0; |
diff --git a/net/atm/common.c b/net/atm/common.c index 299ec1eb872a..e166d9e0ffd9 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -125,7 +125,7 @@ static struct proto vcc_proto = { | |||
125 | .obj_size = sizeof(struct atm_vcc), | 125 | .obj_size = sizeof(struct atm_vcc), |
126 | }; | 126 | }; |
127 | 127 | ||
128 | int vcc_create(struct socket *sock, int protocol, int family) | 128 | int vcc_create(struct net *net, struct socket *sock, int protocol, int family) |
129 | { | 129 | { |
130 | struct sock *sk; | 130 | struct sock *sk; |
131 | struct atm_vcc *vcc; | 131 | struct atm_vcc *vcc; |
@@ -133,7 +133,7 @@ int vcc_create(struct socket *sock, int protocol, int family) | |||
133 | sock->sk = NULL; | 133 | sock->sk = NULL; |
134 | if (sock->type == SOCK_STREAM) | 134 | if (sock->type == SOCK_STREAM) |
135 | return -EINVAL; | 135 | return -EINVAL; |
136 | sk = sk_alloc(family, GFP_KERNEL, &vcc_proto, 1); | 136 | sk = sk_alloc(net, family, GFP_KERNEL, &vcc_proto, 1); |
137 | if (!sk) | 137 | if (!sk) |
138 | return -ENOMEM; | 138 | return -ENOMEM; |
139 | sock_init_data(sock, sk); | 139 | sock_init_data(sock, sk); |
diff --git a/net/atm/common.h b/net/atm/common.h index ad78c9e1117d..16f32c1fa1c9 100644 --- a/net/atm/common.h +++ b/net/atm/common.h | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/poll.h> /* for poll_table */ | 10 | #include <linux/poll.h> /* for poll_table */ |
11 | 11 | ||
12 | 12 | ||
13 | int vcc_create(struct socket *sock, int protocol, int family); | 13 | int vcc_create(struct net *net, struct socket *sock, int protocol, int family); |
14 | int vcc_release(struct socket *sock); | 14 | int vcc_release(struct socket *sock); |
15 | int vcc_connect(struct socket *sock, int itf, short vpi, int vci); | 15 | int vcc_connect(struct socket *sock, int itf, short vpi, int vci); |
16 | int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | 16 | int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, |
diff --git a/net/atm/pvc.c b/net/atm/pvc.c index 848e6e191cc7..43e8bf5ed001 100644 --- a/net/atm/pvc.c +++ b/net/atm/pvc.c | |||
@@ -124,10 +124,13 @@ static const struct proto_ops pvc_proto_ops = { | |||
124 | }; | 124 | }; |
125 | 125 | ||
126 | 126 | ||
127 | static int pvc_create(struct socket *sock,int protocol) | 127 | static int pvc_create(struct net *net, struct socket *sock,int protocol) |
128 | { | 128 | { |
129 | if (net != &init_net) | ||
130 | return -EAFNOSUPPORT; | ||
131 | |||
129 | sock->ops = &pvc_proto_ops; | 132 | sock->ops = &pvc_proto_ops; |
130 | return vcc_create(sock, protocol, PF_ATMPVC); | 133 | return vcc_create(net, sock, protocol, PF_ATMPVC); |
131 | } | 134 | } |
132 | 135 | ||
133 | 136 | ||
diff --git a/net/atm/svc.c b/net/atm/svc.c index 53d04c7992cf..daf9a48a7db0 100644 --- a/net/atm/svc.c +++ b/net/atm/svc.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include "signaling.h" | 25 | #include "signaling.h" |
26 | #include "addr.h" | 26 | #include "addr.h" |
27 | 27 | ||
28 | static int svc_create(struct socket *sock,int protocol); | 28 | static int svc_create(struct net *net, struct socket *sock,int protocol); |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * Note: since all this is still nicely synchronized with the signaling demon, | 31 | * Note: since all this is still nicely synchronized with the signaling demon, |
@@ -326,7 +326,7 @@ static int svc_accept(struct socket *sock,struct socket *newsock,int flags) | |||
326 | 326 | ||
327 | lock_sock(sk); | 327 | lock_sock(sk); |
328 | 328 | ||
329 | error = svc_create(newsock,0); | 329 | error = svc_create(sk->sk_net, newsock,0); |
330 | if (error) | 330 | if (error) |
331 | goto out; | 331 | goto out; |
332 | 332 | ||
@@ -627,12 +627,15 @@ static const struct proto_ops svc_proto_ops = { | |||
627 | }; | 627 | }; |
628 | 628 | ||
629 | 629 | ||
630 | static int svc_create(struct socket *sock,int protocol) | 630 | static int svc_create(struct net *net, struct socket *sock,int protocol) |
631 | { | 631 | { |
632 | int error; | 632 | int error; |
633 | 633 | ||
634 | if (net != &init_net) | ||
635 | return -EAFNOSUPPORT; | ||
636 | |||
634 | sock->ops = &svc_proto_ops; | 637 | sock->ops = &svc_proto_ops; |
635 | error = vcc_create(sock, protocol, AF_ATMSVC); | 638 | error = vcc_create(net, sock, protocol, AF_ATMSVC); |
636 | if (error) return error; | 639 | if (error) return error; |
637 | ATM_SD(sock)->local.sas_family = AF_ATMSVC; | 640 | ATM_SD(sock)->local.sas_family = AF_ATMSVC; |
638 | ATM_SD(sock)->remote.sas_family = AF_ATMSVC; | 641 | ATM_SD(sock)->remote.sas_family = AF_ATMSVC; |
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 1d71f85680b8..def6c42ad165 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -780,11 +780,14 @@ static struct proto ax25_proto = { | |||
780 | .obj_size = sizeof(struct sock), | 780 | .obj_size = sizeof(struct sock), |
781 | }; | 781 | }; |
782 | 782 | ||
783 | static int ax25_create(struct socket *sock, int protocol) | 783 | static int ax25_create(struct net *net, struct socket *sock, int protocol) |
784 | { | 784 | { |
785 | struct sock *sk; | 785 | struct sock *sk; |
786 | ax25_cb *ax25; | 786 | ax25_cb *ax25; |
787 | 787 | ||
788 | if (net != &init_net) | ||
789 | return -EAFNOSUPPORT; | ||
790 | |||
788 | switch (sock->type) { | 791 | switch (sock->type) { |
789 | case SOCK_DGRAM: | 792 | case SOCK_DGRAM: |
790 | if (protocol == 0 || protocol == PF_AX25) | 793 | if (protocol == 0 || protocol == PF_AX25) |
@@ -830,7 +833,7 @@ static int ax25_create(struct socket *sock, int protocol) | |||
830 | return -ESOCKTNOSUPPORT; | 833 | return -ESOCKTNOSUPPORT; |
831 | } | 834 | } |
832 | 835 | ||
833 | if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL) | 836 | if ((sk = sk_alloc(net, PF_AX25, GFP_ATOMIC, &ax25_proto, 1)) == NULL) |
834 | return -ENOMEM; | 837 | return -ENOMEM; |
835 | 838 | ||
836 | ax25 = sk->sk_protinfo = ax25_create_cb(); | 839 | ax25 = sk->sk_protinfo = ax25_create_cb(); |
@@ -855,7 +858,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev) | |||
855 | struct sock *sk; | 858 | struct sock *sk; |
856 | ax25_cb *ax25, *oax25; | 859 | ax25_cb *ax25, *oax25; |
857 | 860 | ||
858 | if ((sk = sk_alloc(PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL) | 861 | if ((sk = sk_alloc(osk->sk_net, PF_AX25, GFP_ATOMIC, osk->sk_prot, 1)) == NULL) |
859 | return NULL; | 862 | return NULL; |
860 | 863 | ||
861 | if ((ax25 = ax25_create_cb()) == NULL) { | 864 | if ((ax25 = ax25_create_cb()) == NULL) { |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index d942b946ba07..1220d8a41eb5 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -95,10 +95,13 @@ int bt_sock_unregister(int proto) | |||
95 | } | 95 | } |
96 | EXPORT_SYMBOL(bt_sock_unregister); | 96 | EXPORT_SYMBOL(bt_sock_unregister); |
97 | 97 | ||
98 | static int bt_sock_create(struct socket *sock, int proto) | 98 | static int bt_sock_create(struct net *net, struct socket *sock, int proto) |
99 | { | 99 | { |
100 | int err; | 100 | int err; |
101 | 101 | ||
102 | if (net != &init_net) | ||
103 | return -EAFNOSUPPORT; | ||
104 | |||
102 | if (proto < 0 || proto >= BT_MAX_PROTO) | 105 | if (proto < 0 || proto >= BT_MAX_PROTO) |
103 | return -EINVAL; | 106 | return -EINVAL; |
104 | 107 | ||
@@ -113,7 +116,7 @@ static int bt_sock_create(struct socket *sock, int proto) | |||
113 | read_lock(&bt_proto_lock); | 116 | read_lock(&bt_proto_lock); |
114 | 117 | ||
115 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { | 118 | if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) { |
116 | err = bt_proto[proto]->create(sock, proto); | 119 | err = bt_proto[proto]->create(net, sock, proto); |
117 | module_put(bt_proto[proto]->owner); | 120 | module_put(bt_proto[proto]->owner); |
118 | } | 121 | } |
119 | 122 | ||
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index 10292e776046..f718965f296c 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c | |||
@@ -204,7 +204,7 @@ static struct proto bnep_proto = { | |||
204 | .obj_size = sizeof(struct bt_sock) | 204 | .obj_size = sizeof(struct bt_sock) |
205 | }; | 205 | }; |
206 | 206 | ||
207 | static int bnep_sock_create(struct socket *sock, int protocol) | 207 | static int bnep_sock_create(struct net *net, struct socket *sock, int protocol) |
208 | { | 208 | { |
209 | struct sock *sk; | 209 | struct sock *sk; |
210 | 210 | ||
@@ -213,7 +213,7 @@ static int bnep_sock_create(struct socket *sock, int protocol) | |||
213 | if (sock->type != SOCK_RAW) | 213 | if (sock->type != SOCK_RAW) |
214 | return -ESOCKTNOSUPPORT; | 214 | return -ESOCKTNOSUPPORT; |
215 | 215 | ||
216 | sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &bnep_proto, 1); | 216 | sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &bnep_proto, 1); |
217 | if (!sk) | 217 | if (!sk) |
218 | return -ENOMEM; | 218 | return -ENOMEM; |
219 | 219 | ||
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 19be7861e51e..cf700c20d11e 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c | |||
@@ -195,7 +195,7 @@ static struct proto cmtp_proto = { | |||
195 | .obj_size = sizeof(struct bt_sock) | 195 | .obj_size = sizeof(struct bt_sock) |
196 | }; | 196 | }; |
197 | 197 | ||
198 | static int cmtp_sock_create(struct socket *sock, int protocol) | 198 | static int cmtp_sock_create(struct net *net, struct socket *sock, int protocol) |
199 | { | 199 | { |
200 | struct sock *sk; | 200 | struct sock *sk; |
201 | 201 | ||
@@ -204,7 +204,7 @@ static int cmtp_sock_create(struct socket *sock, int protocol) | |||
204 | if (sock->type != SOCK_RAW) | 204 | if (sock->type != SOCK_RAW) |
205 | return -ESOCKTNOSUPPORT; | 205 | return -ESOCKTNOSUPPORT; |
206 | 206 | ||
207 | sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &cmtp_proto, 1); | 207 | sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &cmtp_proto, 1); |
208 | if (!sk) | 208 | if (!sk) |
209 | return -ENOMEM; | 209 | return -ENOMEM; |
210 | 210 | ||
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 5ccea5fbd236..43dd6373bff9 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -634,7 +634,7 @@ static struct proto hci_sk_proto = { | |||
634 | .obj_size = sizeof(struct hci_pinfo) | 634 | .obj_size = sizeof(struct hci_pinfo) |
635 | }; | 635 | }; |
636 | 636 | ||
637 | static int hci_sock_create(struct socket *sock, int protocol) | 637 | static int hci_sock_create(struct net *net, struct socket *sock, int protocol) |
638 | { | 638 | { |
639 | struct sock *sk; | 639 | struct sock *sk; |
640 | 640 | ||
@@ -645,7 +645,7 @@ static int hci_sock_create(struct socket *sock, int protocol) | |||
645 | 645 | ||
646 | sock->ops = &hci_sock_ops; | 646 | sock->ops = &hci_sock_ops; |
647 | 647 | ||
648 | sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto, 1); | 648 | sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto, 1); |
649 | if (!sk) | 649 | if (!sk) |
650 | return -ENOMEM; | 650 | return -ENOMEM; |
651 | 651 | ||
diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c index 0c185257e55b..1de2b6fbcac0 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c | |||
@@ -246,7 +246,7 @@ static struct proto hidp_proto = { | |||
246 | .obj_size = sizeof(struct bt_sock) | 246 | .obj_size = sizeof(struct bt_sock) |
247 | }; | 247 | }; |
248 | 248 | ||
249 | static int hidp_sock_create(struct socket *sock, int protocol) | 249 | static int hidp_sock_create(struct net *net, struct socket *sock, int protocol) |
250 | { | 250 | { |
251 | struct sock *sk; | 251 | struct sock *sk; |
252 | 252 | ||
@@ -255,7 +255,7 @@ static int hidp_sock_create(struct socket *sock, int protocol) | |||
255 | if (sock->type != SOCK_RAW) | 255 | if (sock->type != SOCK_RAW) |
256 | return -ESOCKTNOSUPPORT; | 256 | return -ESOCKTNOSUPPORT; |
257 | 257 | ||
258 | sk = sk_alloc(PF_BLUETOOTH, GFP_ATOMIC, &hidp_proto, 1); | 258 | sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hidp_proto, 1); |
259 | if (!sk) | 259 | if (!sk) |
260 | return -ENOMEM; | 260 | return -ENOMEM; |
261 | 261 | ||
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index c4e4ce4ebb2b..36ef27b625db 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -518,11 +518,11 @@ static struct proto l2cap_proto = { | |||
518 | .obj_size = sizeof(struct l2cap_pinfo) | 518 | .obj_size = sizeof(struct l2cap_pinfo) |
519 | }; | 519 | }; |
520 | 520 | ||
521 | static struct sock *l2cap_sock_alloc(struct socket *sock, int proto, gfp_t prio) | 521 | static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio) |
522 | { | 522 | { |
523 | struct sock *sk; | 523 | struct sock *sk; |
524 | 524 | ||
525 | sk = sk_alloc(PF_BLUETOOTH, prio, &l2cap_proto, 1); | 525 | sk = sk_alloc(net, PF_BLUETOOTH, prio, &l2cap_proto, 1); |
526 | if (!sk) | 526 | if (!sk) |
527 | return NULL; | 527 | return NULL; |
528 | 528 | ||
@@ -543,7 +543,7 @@ static struct sock *l2cap_sock_alloc(struct socket *sock, int proto, gfp_t prio) | |||
543 | return sk; | 543 | return sk; |
544 | } | 544 | } |
545 | 545 | ||
546 | static int l2cap_sock_create(struct socket *sock, int protocol) | 546 | static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol) |
547 | { | 547 | { |
548 | struct sock *sk; | 548 | struct sock *sk; |
549 | 549 | ||
@@ -560,7 +560,7 @@ static int l2cap_sock_create(struct socket *sock, int protocol) | |||
560 | 560 | ||
561 | sock->ops = &l2cap_sock_ops; | 561 | sock->ops = &l2cap_sock_ops; |
562 | 562 | ||
563 | sk = l2cap_sock_alloc(sock, protocol, GFP_ATOMIC); | 563 | sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC); |
564 | if (!sk) | 564 | if (!sk) |
565 | return -ENOMEM; | 565 | return -ENOMEM; |
566 | 566 | ||
@@ -1425,7 +1425,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
1425 | goto response; | 1425 | goto response; |
1426 | } | 1426 | } |
1427 | 1427 | ||
1428 | sk = l2cap_sock_alloc(NULL, BTPROTO_L2CAP, GFP_ATOMIC); | 1428 | sk = l2cap_sock_alloc(parent->sk_net, NULL, BTPROTO_L2CAP, GFP_ATOMIC); |
1429 | if (!sk) | 1429 | if (!sk) |
1430 | goto response; | 1430 | goto response; |
1431 | 1431 | ||
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 30586ab9e878..266b6972667d 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -282,12 +282,12 @@ static struct proto rfcomm_proto = { | |||
282 | .obj_size = sizeof(struct rfcomm_pinfo) | 282 | .obj_size = sizeof(struct rfcomm_pinfo) |
283 | }; | 283 | }; |
284 | 284 | ||
285 | static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, gfp_t prio) | 285 | static struct sock *rfcomm_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio) |
286 | { | 286 | { |
287 | struct rfcomm_dlc *d; | 287 | struct rfcomm_dlc *d; |
288 | struct sock *sk; | 288 | struct sock *sk; |
289 | 289 | ||
290 | sk = sk_alloc(PF_BLUETOOTH, prio, &rfcomm_proto, 1); | 290 | sk = sk_alloc(net, PF_BLUETOOTH, prio, &rfcomm_proto, 1); |
291 | if (!sk) | 291 | if (!sk) |
292 | return NULL; | 292 | return NULL; |
293 | 293 | ||
@@ -323,7 +323,7 @@ static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, gfp_t prio | |||
323 | return sk; | 323 | return sk; |
324 | } | 324 | } |
325 | 325 | ||
326 | static int rfcomm_sock_create(struct socket *sock, int protocol) | 326 | static int rfcomm_sock_create(struct net *net, struct socket *sock, int protocol) |
327 | { | 327 | { |
328 | struct sock *sk; | 328 | struct sock *sk; |
329 | 329 | ||
@@ -336,7 +336,7 @@ static int rfcomm_sock_create(struct socket *sock, int protocol) | |||
336 | 336 | ||
337 | sock->ops = &rfcomm_sock_ops; | 337 | sock->ops = &rfcomm_sock_ops; |
338 | 338 | ||
339 | sk = rfcomm_sock_alloc(sock, protocol, GFP_ATOMIC); | 339 | sk = rfcomm_sock_alloc(net, sock, protocol, GFP_ATOMIC); |
340 | if (!sk) | 340 | if (!sk) |
341 | return -ENOMEM; | 341 | return -ENOMEM; |
342 | 342 | ||
@@ -868,7 +868,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc * | |||
868 | goto done; | 868 | goto done; |
869 | } | 869 | } |
870 | 870 | ||
871 | sk = rfcomm_sock_alloc(NULL, BTPROTO_RFCOMM, GFP_ATOMIC); | 871 | sk = rfcomm_sock_alloc(parent->sk_net, NULL, BTPROTO_RFCOMM, GFP_ATOMIC); |
872 | if (!sk) | 872 | if (!sk) |
873 | goto done; | 873 | goto done; |
874 | 874 | ||
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 3f5163e725ed..65b6fb1c4154 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -414,11 +414,11 @@ static struct proto sco_proto = { | |||
414 | .obj_size = sizeof(struct sco_pinfo) | 414 | .obj_size = sizeof(struct sco_pinfo) |
415 | }; | 415 | }; |
416 | 416 | ||
417 | static struct sock *sco_sock_alloc(struct socket *sock, int proto, gfp_t prio) | 417 | static struct sock *sco_sock_alloc(struct net *net, struct socket *sock, int proto, gfp_t prio) |
418 | { | 418 | { |
419 | struct sock *sk; | 419 | struct sock *sk; |
420 | 420 | ||
421 | sk = sk_alloc(PF_BLUETOOTH, prio, &sco_proto, 1); | 421 | sk = sk_alloc(net, PF_BLUETOOTH, prio, &sco_proto, 1); |
422 | if (!sk) | 422 | if (!sk) |
423 | return NULL; | 423 | return NULL; |
424 | 424 | ||
@@ -439,7 +439,7 @@ static struct sock *sco_sock_alloc(struct socket *sock, int proto, gfp_t prio) | |||
439 | return sk; | 439 | return sk; |
440 | } | 440 | } |
441 | 441 | ||
442 | static int sco_sock_create(struct socket *sock, int protocol) | 442 | static int sco_sock_create(struct net *net, struct socket *sock, int protocol) |
443 | { | 443 | { |
444 | struct sock *sk; | 444 | struct sock *sk; |
445 | 445 | ||
@@ -452,7 +452,7 @@ static int sco_sock_create(struct socket *sock, int protocol) | |||
452 | 452 | ||
453 | sock->ops = &sco_sock_ops; | 453 | sock->ops = &sco_sock_ops; |
454 | 454 | ||
455 | sk = sco_sock_alloc(sock, protocol, GFP_ATOMIC); | 455 | sk = sco_sock_alloc(net, sock, protocol, GFP_ATOMIC); |
456 | if (!sk) | 456 | if (!sk) |
457 | return -ENOMEM; | 457 | return -ENOMEM; |
458 | 458 | ||
@@ -807,7 +807,7 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
807 | 807 | ||
808 | bh_lock_sock(parent); | 808 | bh_lock_sock(parent); |
809 | 809 | ||
810 | sk = sco_sock_alloc(NULL, BTPROTO_SCO, GFP_ATOMIC); | 810 | sk = sco_sock_alloc(parent->sk_net, NULL, BTPROTO_SCO, GFP_ATOMIC); |
811 | if (!sk) { | 811 | if (!sk) { |
812 | bh_unlock_sock(parent); | 812 | bh_unlock_sock(parent); |
813 | goto done; | 813 | goto done; |
diff --git a/net/core/sock.c b/net/core/sock.c index bbc726a49d87..a31455dc7024 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -873,7 +873,7 @@ static inline void sock_lock_init(struct sock *sk) | |||
873 | * @prot: struct proto associated with this new sock instance | 873 | * @prot: struct proto associated with this new sock instance |
874 | * @zero_it: if we should zero the newly allocated sock | 874 | * @zero_it: if we should zero the newly allocated sock |
875 | */ | 875 | */ |
876 | struct sock *sk_alloc(int family, gfp_t priority, | 876 | struct sock *sk_alloc(struct net *net, int family, gfp_t priority, |
877 | struct proto *prot, int zero_it) | 877 | struct proto *prot, int zero_it) |
878 | { | 878 | { |
879 | struct sock *sk = NULL; | 879 | struct sock *sk = NULL; |
@@ -894,6 +894,7 @@ struct sock *sk_alloc(int family, gfp_t priority, | |||
894 | */ | 894 | */ |
895 | sk->sk_prot = sk->sk_prot_creator = prot; | 895 | sk->sk_prot = sk->sk_prot_creator = prot; |
896 | sock_lock_init(sk); | 896 | sock_lock_init(sk); |
897 | sk->sk_net = get_net(net); | ||
897 | } | 898 | } |
898 | 899 | ||
899 | if (security_sk_alloc(sk, family, priority)) | 900 | if (security_sk_alloc(sk, family, priority)) |
@@ -933,6 +934,7 @@ void sk_free(struct sock *sk) | |||
933 | __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); | 934 | __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); |
934 | 935 | ||
935 | security_sk_free(sk); | 936 | security_sk_free(sk); |
937 | put_net(sk->sk_net); | ||
936 | if (sk->sk_prot_creator->slab != NULL) | 938 | if (sk->sk_prot_creator->slab != NULL) |
937 | kmem_cache_free(sk->sk_prot_creator->slab, sk); | 939 | kmem_cache_free(sk->sk_prot_creator->slab, sk); |
938 | else | 940 | else |
@@ -942,7 +944,7 @@ void sk_free(struct sock *sk) | |||
942 | 944 | ||
943 | struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | 945 | struct sock *sk_clone(const struct sock *sk, const gfp_t priority) |
944 | { | 946 | { |
945 | struct sock *newsk = sk_alloc(sk->sk_family, priority, sk->sk_prot, 0); | 947 | struct sock *newsk = sk_alloc(sk->sk_net, sk->sk_family, priority, sk->sk_prot, 0); |
946 | 948 | ||
947 | if (newsk != NULL) { | 949 | if (newsk != NULL) { |
948 | struct sk_filter *filter; | 950 | struct sk_filter *filter; |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 625d5955b8e2..aca4c4930eb6 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -471,10 +471,10 @@ static struct proto dn_proto = { | |||
471 | .obj_size = sizeof(struct dn_sock), | 471 | .obj_size = sizeof(struct dn_sock), |
472 | }; | 472 | }; |
473 | 473 | ||
474 | static struct sock *dn_alloc_sock(struct socket *sock, gfp_t gfp) | 474 | static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gfp) |
475 | { | 475 | { |
476 | struct dn_scp *scp; | 476 | struct dn_scp *scp; |
477 | struct sock *sk = sk_alloc(PF_DECnet, gfp, &dn_proto, 1); | 477 | struct sock *sk = sk_alloc(net, PF_DECnet, gfp, &dn_proto, 1); |
478 | 478 | ||
479 | if (!sk) | 479 | if (!sk) |
480 | goto out; | 480 | goto out; |
@@ -675,10 +675,13 @@ char *dn_addr2asc(__u16 addr, char *buf) | |||
675 | 675 | ||
676 | 676 | ||
677 | 677 | ||
678 | static int dn_create(struct socket *sock, int protocol) | 678 | static int dn_create(struct net *net, struct socket *sock, int protocol) |
679 | { | 679 | { |
680 | struct sock *sk; | 680 | struct sock *sk; |
681 | 681 | ||
682 | if (net != &init_net) | ||
683 | return -EAFNOSUPPORT; | ||
684 | |||
682 | switch(sock->type) { | 685 | switch(sock->type) { |
683 | case SOCK_SEQPACKET: | 686 | case SOCK_SEQPACKET: |
684 | if (protocol != DNPROTO_NSP) | 687 | if (protocol != DNPROTO_NSP) |
@@ -691,7 +694,7 @@ static int dn_create(struct socket *sock, int protocol) | |||
691 | } | 694 | } |
692 | 695 | ||
693 | 696 | ||
694 | if ((sk = dn_alloc_sock(sock, GFP_KERNEL)) == NULL) | 697 | if ((sk = dn_alloc_sock(net, sock, GFP_KERNEL)) == NULL) |
695 | return -ENOBUFS; | 698 | return -ENOBUFS; |
696 | 699 | ||
697 | sk->sk_protocol = protocol; | 700 | sk->sk_protocol = protocol; |
@@ -1091,7 +1094,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1091 | 1094 | ||
1092 | cb = DN_SKB_CB(skb); | 1095 | cb = DN_SKB_CB(skb); |
1093 | sk->sk_ack_backlog--; | 1096 | sk->sk_ack_backlog--; |
1094 | newsk = dn_alloc_sock(newsock, sk->sk_allocation); | 1097 | newsk = dn_alloc_sock(sk->sk_net, newsock, sk->sk_allocation); |
1095 | if (newsk == NULL) { | 1098 | if (newsk == NULL) { |
1096 | release_sock(sk); | 1099 | release_sock(sk); |
1097 | kfree_skb(skb); | 1100 | kfree_skb(skb); |
diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c index 35c96bcc0f32..a2429dbcb86e 100644 --- a/net/econet/af_econet.c +++ b/net/econet/af_econet.c | |||
@@ -608,12 +608,15 @@ static struct proto econet_proto = { | |||
608 | * Create an Econet socket | 608 | * Create an Econet socket |
609 | */ | 609 | */ |
610 | 610 | ||
611 | static int econet_create(struct socket *sock, int protocol) | 611 | static int econet_create(struct net *net, struct socket *sock, int protocol) |
612 | { | 612 | { |
613 | struct sock *sk; | 613 | struct sock *sk; |
614 | struct econet_sock *eo; | 614 | struct econet_sock *eo; |
615 | int err; | 615 | int err; |
616 | 616 | ||
617 | if (net != &init_net) | ||
618 | return -EAFNOSUPPORT; | ||
619 | |||
617 | /* Econet only provides datagram services. */ | 620 | /* Econet only provides datagram services. */ |
618 | if (sock->type != SOCK_DGRAM) | 621 | if (sock->type != SOCK_DGRAM) |
619 | return -ESOCKTNOSUPPORT; | 622 | return -ESOCKTNOSUPPORT; |
@@ -621,7 +624,7 @@ static int econet_create(struct socket *sock, int protocol) | |||
621 | sock->state = SS_UNCONNECTED; | 624 | sock->state = SS_UNCONNECTED; |
622 | 625 | ||
623 | err = -ENOBUFS; | 626 | err = -ENOBUFS; |
624 | sk = sk_alloc(PF_ECONET, GFP_KERNEL, &econet_proto, 1); | 627 | sk = sk_alloc(net, PF_ECONET, GFP_KERNEL, &econet_proto, 1); |
625 | if (sk == NULL) | 628 | if (sk == NULL) |
626 | goto out; | 629 | goto out; |
627 | 630 | ||
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index e68103475cca..110a19edacc8 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -241,7 +241,7 @@ EXPORT_SYMBOL(build_ehash_secret); | |||
241 | * Create an inet socket. | 241 | * Create an inet socket. |
242 | */ | 242 | */ |
243 | 243 | ||
244 | static int inet_create(struct socket *sock, int protocol) | 244 | static int inet_create(struct net *net, struct socket *sock, int protocol) |
245 | { | 245 | { |
246 | struct sock *sk; | 246 | struct sock *sk; |
247 | struct list_head *p; | 247 | struct list_head *p; |
@@ -253,6 +253,9 @@ static int inet_create(struct socket *sock, int protocol) | |||
253 | int try_loading_module = 0; | 253 | int try_loading_module = 0; |
254 | int err; | 254 | int err; |
255 | 255 | ||
256 | if (net != &init_net) | ||
257 | return -EAFNOSUPPORT; | ||
258 | |||
256 | if (sock->type != SOCK_RAW && | 259 | if (sock->type != SOCK_RAW && |
257 | sock->type != SOCK_DGRAM && | 260 | sock->type != SOCK_DGRAM && |
258 | !inet_ehash_secret) | 261 | !inet_ehash_secret) |
@@ -320,7 +323,7 @@ lookup_protocol: | |||
320 | BUG_TRAP(answer_prot->slab != NULL); | 323 | BUG_TRAP(answer_prot->slab != NULL); |
321 | 324 | ||
322 | err = -ENOBUFS; | 325 | err = -ENOBUFS; |
323 | sk = sk_alloc(PF_INET, GFP_KERNEL, answer_prot, 1); | 326 | sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot, 1); |
324 | if (sk == NULL) | 327 | if (sk == NULL) |
325 | goto out; | 328 | goto out; |
326 | 329 | ||
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index b5f96372ad73..21931c86e95b 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -81,7 +81,7 @@ static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) | |||
81 | return (struct ipv6_pinfo *)(((u8 *)sk) + offset); | 81 | return (struct ipv6_pinfo *)(((u8 *)sk) + offset); |
82 | } | 82 | } |
83 | 83 | ||
84 | static int inet6_create(struct socket *sock, int protocol) | 84 | static int inet6_create(struct net *net, struct socket *sock, int protocol) |
85 | { | 85 | { |
86 | struct inet_sock *inet; | 86 | struct inet_sock *inet; |
87 | struct ipv6_pinfo *np; | 87 | struct ipv6_pinfo *np; |
@@ -94,6 +94,9 @@ static int inet6_create(struct socket *sock, int protocol) | |||
94 | int try_loading_module = 0; | 94 | int try_loading_module = 0; |
95 | int err; | 95 | int err; |
96 | 96 | ||
97 | if (net != &init_net) | ||
98 | return -EAFNOSUPPORT; | ||
99 | |||
97 | if (sock->type != SOCK_RAW && | 100 | if (sock->type != SOCK_RAW && |
98 | sock->type != SOCK_DGRAM && | 101 | sock->type != SOCK_DGRAM && |
99 | !inet_ehash_secret) | 102 | !inet_ehash_secret) |
@@ -159,7 +162,7 @@ lookup_protocol: | |||
159 | BUG_TRAP(answer_prot->slab != NULL); | 162 | BUG_TRAP(answer_prot->slab != NULL); |
160 | 163 | ||
161 | err = -ENOBUFS; | 164 | err = -ENOBUFS; |
162 | sk = sk_alloc(PF_INET6, GFP_KERNEL, answer_prot, 1); | 165 | sk = sk_alloc(net, PF_INET6, GFP_KERNEL, answer_prot, 1); |
163 | if (sk == NULL) | 166 | if (sk == NULL) |
164 | goto out; | 167 | goto out; |
165 | 168 | ||
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 8400525177ab..ee28babad227 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c | |||
@@ -1360,11 +1360,14 @@ static struct proto ipx_proto = { | |||
1360 | .obj_size = sizeof(struct ipx_sock), | 1360 | .obj_size = sizeof(struct ipx_sock), |
1361 | }; | 1361 | }; |
1362 | 1362 | ||
1363 | static int ipx_create(struct socket *sock, int protocol) | 1363 | static int ipx_create(struct net *net, struct socket *sock, int protocol) |
1364 | { | 1364 | { |
1365 | int rc = -ESOCKTNOSUPPORT; | 1365 | int rc = -ESOCKTNOSUPPORT; |
1366 | struct sock *sk; | 1366 | struct sock *sk; |
1367 | 1367 | ||
1368 | if (net != &init_net) | ||
1369 | return -EAFNOSUPPORT; | ||
1370 | |||
1368 | /* | 1371 | /* |
1369 | * SPX support is not anymore in the kernel sources. If you want to | 1372 | * SPX support is not anymore in the kernel sources. If you want to |
1370 | * ressurrect it, completing it and making it understand shared skbs, | 1373 | * ressurrect it, completing it and making it understand shared skbs, |
@@ -1375,7 +1378,7 @@ static int ipx_create(struct socket *sock, int protocol) | |||
1375 | goto out; | 1378 | goto out; |
1376 | 1379 | ||
1377 | rc = -ENOMEM; | 1380 | rc = -ENOMEM; |
1378 | sk = sk_alloc(PF_IPX, GFP_KERNEL, &ipx_proto, 1); | 1381 | sk = sk_alloc(net, PF_IPX, GFP_KERNEL, &ipx_proto, 1); |
1379 | if (!sk) | 1382 | if (!sk) |
1380 | goto out; | 1383 | goto out; |
1381 | #ifdef IPX_REFCNT_DEBUG | 1384 | #ifdef IPX_REFCNT_DEBUG |
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index c80949a71923..0328ae2654f4 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -60,7 +60,7 @@ | |||
60 | 60 | ||
61 | #include <net/irda/af_irda.h> | 61 | #include <net/irda/af_irda.h> |
62 | 62 | ||
63 | static int irda_create(struct socket *sock, int protocol); | 63 | static int irda_create(struct net *net, struct socket *sock, int protocol); |
64 | 64 | ||
65 | static const struct proto_ops irda_stream_ops; | 65 | static const struct proto_ops irda_stream_ops; |
66 | static const struct proto_ops irda_seqpacket_ops; | 66 | static const struct proto_ops irda_seqpacket_ops; |
@@ -831,7 +831,7 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags) | |||
831 | 831 | ||
832 | IRDA_DEBUG(2, "%s()\n", __FUNCTION__); | 832 | IRDA_DEBUG(2, "%s()\n", __FUNCTION__); |
833 | 833 | ||
834 | err = irda_create(newsock, sk->sk_protocol); | 834 | err = irda_create(sk->sk_net, newsock, sk->sk_protocol); |
835 | if (err) | 835 | if (err) |
836 | return err; | 836 | return err; |
837 | 837 | ||
@@ -1057,13 +1057,16 @@ static struct proto irda_proto = { | |||
1057 | * Create IrDA socket | 1057 | * Create IrDA socket |
1058 | * | 1058 | * |
1059 | */ | 1059 | */ |
1060 | static int irda_create(struct socket *sock, int protocol) | 1060 | static int irda_create(struct net *net, struct socket *sock, int protocol) |
1061 | { | 1061 | { |
1062 | struct sock *sk; | 1062 | struct sock *sk; |
1063 | struct irda_sock *self; | 1063 | struct irda_sock *self; |
1064 | 1064 | ||
1065 | IRDA_DEBUG(2, "%s()\n", __FUNCTION__); | 1065 | IRDA_DEBUG(2, "%s()\n", __FUNCTION__); |
1066 | 1066 | ||
1067 | if (net != &init_net) | ||
1068 | return -EAFNOSUPPORT; | ||
1069 | |||
1067 | /* Check for valid socket type */ | 1070 | /* Check for valid socket type */ |
1068 | switch (sock->type) { | 1071 | switch (sock->type) { |
1069 | case SOCK_STREAM: /* For TTP connections with SAR disabled */ | 1072 | case SOCK_STREAM: /* For TTP connections with SAR disabled */ |
@@ -1075,7 +1078,7 @@ static int irda_create(struct socket *sock, int protocol) | |||
1075 | } | 1078 | } |
1076 | 1079 | ||
1077 | /* Allocate networking socket */ | 1080 | /* Allocate networking socket */ |
1078 | sk = sk_alloc(PF_IRDA, GFP_ATOMIC, &irda_proto, 1); | 1081 | sk = sk_alloc(net, PF_IRDA, GFP_ATOMIC, &irda_proto, 1); |
1079 | if (sk == NULL) | 1082 | if (sk == NULL) |
1080 | return -ENOMEM; | 1083 | return -ENOMEM; |
1081 | 1084 | ||
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 53ae14c35f70..53668585e947 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
@@ -213,7 +213,7 @@ static struct sock *iucv_sock_alloc(struct socket *sock, int proto, gfp_t prio) | |||
213 | { | 213 | { |
214 | struct sock *sk; | 214 | struct sock *sk; |
215 | 215 | ||
216 | sk = sk_alloc(PF_IUCV, prio, &iucv_proto, 1); | 216 | sk = sk_alloc(&init_net, PF_IUCV, prio, &iucv_proto, 1); |
217 | if (!sk) | 217 | if (!sk) |
218 | return NULL; | 218 | return NULL; |
219 | 219 | ||
@@ -240,7 +240,7 @@ static struct sock *iucv_sock_alloc(struct socket *sock, int proto, gfp_t prio) | |||
240 | } | 240 | } |
241 | 241 | ||
242 | /* Create an IUCV socket */ | 242 | /* Create an IUCV socket */ |
243 | static int iucv_sock_create(struct socket *sock, int protocol) | 243 | static int iucv_sock_create(struct net *net, struct socket *sock, int protocol) |
244 | { | 244 | { |
245 | struct sock *sk; | 245 | struct sock *sk; |
246 | 246 | ||
diff --git a/net/key/af_key.c b/net/key/af_key.c index 5b802bbb856e..ff5c3d03005e 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -136,11 +136,14 @@ static struct proto key_proto = { | |||
136 | .obj_size = sizeof(struct pfkey_sock), | 136 | .obj_size = sizeof(struct pfkey_sock), |
137 | }; | 137 | }; |
138 | 138 | ||
139 | static int pfkey_create(struct socket *sock, int protocol) | 139 | static int pfkey_create(struct net *net, struct socket *sock, int protocol) |
140 | { | 140 | { |
141 | struct sock *sk; | 141 | struct sock *sk; |
142 | int err; | 142 | int err; |
143 | 143 | ||
144 | if (net != &init_net) | ||
145 | return -EAFNOSUPPORT; | ||
146 | |||
144 | if (!capable(CAP_NET_ADMIN)) | 147 | if (!capable(CAP_NET_ADMIN)) |
145 | return -EPERM; | 148 | return -EPERM; |
146 | if (sock->type != SOCK_RAW) | 149 | if (sock->type != SOCK_RAW) |
@@ -149,7 +152,7 @@ static int pfkey_create(struct socket *sock, int protocol) | |||
149 | return -EPROTONOSUPPORT; | 152 | return -EPROTONOSUPPORT; |
150 | 153 | ||
151 | err = -ENOMEM; | 154 | err = -ENOMEM; |
152 | sk = sk_alloc(PF_KEY, GFP_KERNEL, &key_proto, 1); | 155 | sk = sk_alloc(net, PF_KEY, GFP_KERNEL, &key_proto, 1); |
153 | if (sk == NULL) | 156 | if (sk == NULL) |
154 | goto out; | 157 | goto out; |
155 | 158 | ||
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 6b8a103cf9e6..b48244156e75 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -150,14 +150,17 @@ static struct proto llc_proto = { | |||
150 | * socket type we have available. | 150 | * socket type we have available. |
151 | * Returns 0 upon success, negative upon failure. | 151 | * Returns 0 upon success, negative upon failure. |
152 | */ | 152 | */ |
153 | static int llc_ui_create(struct socket *sock, int protocol) | 153 | static int llc_ui_create(struct net *net, struct socket *sock, int protocol) |
154 | { | 154 | { |
155 | struct sock *sk; | 155 | struct sock *sk; |
156 | int rc = -ESOCKTNOSUPPORT; | 156 | int rc = -ESOCKTNOSUPPORT; |
157 | 157 | ||
158 | if (net != &init_net) | ||
159 | return -EAFNOSUPPORT; | ||
160 | |||
158 | if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) { | 161 | if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) { |
159 | rc = -ENOMEM; | 162 | rc = -ENOMEM; |
160 | sk = llc_sk_alloc(PF_LLC, GFP_KERNEL, &llc_proto); | 163 | sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto); |
161 | if (sk) { | 164 | if (sk) { |
162 | rc = 0; | 165 | rc = 0; |
163 | llc_ui_sk_init(sock, sk); | 166 | llc_ui_sk_init(sock, sk); |
diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c index 3b8cfbe029a7..8ebc2769dfda 100644 --- a/net/llc/llc_conn.c +++ b/net/llc/llc_conn.c | |||
@@ -700,7 +700,7 @@ static struct sock *llc_create_incoming_sock(struct sock *sk, | |||
700 | struct llc_addr *saddr, | 700 | struct llc_addr *saddr, |
701 | struct llc_addr *daddr) | 701 | struct llc_addr *daddr) |
702 | { | 702 | { |
703 | struct sock *newsk = llc_sk_alloc(sk->sk_family, GFP_ATOMIC, | 703 | struct sock *newsk = llc_sk_alloc(sk->sk_net, sk->sk_family, GFP_ATOMIC, |
704 | sk->sk_prot); | 704 | sk->sk_prot); |
705 | struct llc_sock *newllc, *llc = llc_sk(sk); | 705 | struct llc_sock *newllc, *llc = llc_sk(sk); |
706 | 706 | ||
@@ -867,9 +867,9 @@ static void llc_sk_init(struct sock* sk) | |||
867 | * Allocates a LLC sock and initializes it. Returns the new LLC sock | 867 | * Allocates a LLC sock and initializes it. Returns the new LLC sock |
868 | * or %NULL if there's no memory available for one | 868 | * or %NULL if there's no memory available for one |
869 | */ | 869 | */ |
870 | struct sock *llc_sk_alloc(int family, gfp_t priority, struct proto *prot) | 870 | struct sock *llc_sk_alloc(struct net *net, int family, gfp_t priority, struct proto *prot) |
871 | { | 871 | { |
872 | struct sock *sk = sk_alloc(family, priority, prot, 1); | 872 | struct sock *sk = sk_alloc(net, family, priority, prot, 1); |
873 | 873 | ||
874 | if (!sk) | 874 | if (!sk) |
875 | goto out; | 875 | goto out; |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 3982f13dab17..406a493300d8 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -384,15 +384,15 @@ static struct proto netlink_proto = { | |||
384 | .obj_size = sizeof(struct netlink_sock), | 384 | .obj_size = sizeof(struct netlink_sock), |
385 | }; | 385 | }; |
386 | 386 | ||
387 | static int __netlink_create(struct socket *sock, struct mutex *cb_mutex, | 387 | static int __netlink_create(struct net *net, struct socket *sock, |
388 | int protocol) | 388 | struct mutex *cb_mutex, int protocol) |
389 | { | 389 | { |
390 | struct sock *sk; | 390 | struct sock *sk; |
391 | struct netlink_sock *nlk; | 391 | struct netlink_sock *nlk; |
392 | 392 | ||
393 | sock->ops = &netlink_ops; | 393 | sock->ops = &netlink_ops; |
394 | 394 | ||
395 | sk = sk_alloc(PF_NETLINK, GFP_KERNEL, &netlink_proto, 1); | 395 | sk = sk_alloc(net, PF_NETLINK, GFP_KERNEL, &netlink_proto, 1); |
396 | if (!sk) | 396 | if (!sk) |
397 | return -ENOMEM; | 397 | return -ENOMEM; |
398 | 398 | ||
@@ -412,13 +412,16 @@ static int __netlink_create(struct socket *sock, struct mutex *cb_mutex, | |||
412 | return 0; | 412 | return 0; |
413 | } | 413 | } |
414 | 414 | ||
415 | static int netlink_create(struct socket *sock, int protocol) | 415 | static int netlink_create(struct net *net, struct socket *sock, int protocol) |
416 | { | 416 | { |
417 | struct module *module = NULL; | 417 | struct module *module = NULL; |
418 | struct mutex *cb_mutex; | 418 | struct mutex *cb_mutex; |
419 | struct netlink_sock *nlk; | 419 | struct netlink_sock *nlk; |
420 | int err = 0; | 420 | int err = 0; |
421 | 421 | ||
422 | if (net != &init_net) | ||
423 | return -EAFNOSUPPORT; | ||
424 | |||
422 | sock->state = SS_UNCONNECTED; | 425 | sock->state = SS_UNCONNECTED; |
423 | 426 | ||
424 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) | 427 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) |
@@ -441,7 +444,7 @@ static int netlink_create(struct socket *sock, int protocol) | |||
441 | cb_mutex = nl_table[protocol].cb_mutex; | 444 | cb_mutex = nl_table[protocol].cb_mutex; |
442 | netlink_unlock_table(); | 445 | netlink_unlock_table(); |
443 | 446 | ||
444 | if ((err = __netlink_create(sock, cb_mutex, protocol)) < 0) | 447 | if ((err = __netlink_create(net, sock, cb_mutex, protocol)) < 0) |
445 | goto out_module; | 448 | goto out_module; |
446 | 449 | ||
447 | nlk = nlk_sk(sock->sk); | 450 | nlk = nlk_sk(sock->sk); |
@@ -1318,7 +1321,7 @@ netlink_kernel_create(int unit, unsigned int groups, | |||
1318 | if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)) | 1321 | if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)) |
1319 | return NULL; | 1322 | return NULL; |
1320 | 1323 | ||
1321 | if (__netlink_create(sock, cb_mutex, unit) < 0) | 1324 | if (__netlink_create(&init_net, sock, cb_mutex, unit) < 0) |
1322 | goto out_sock_release; | 1325 | goto out_sock_release; |
1323 | 1326 | ||
1324 | if (groups < 32) | 1327 | if (groups < 32) |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 15c8a92bd719..e969d1bc765c 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -409,15 +409,18 @@ static struct proto nr_proto = { | |||
409 | .obj_size = sizeof(struct nr_sock), | 409 | .obj_size = sizeof(struct nr_sock), |
410 | }; | 410 | }; |
411 | 411 | ||
412 | static int nr_create(struct socket *sock, int protocol) | 412 | static int nr_create(struct net *net, struct socket *sock, int protocol) |
413 | { | 413 | { |
414 | struct sock *sk; | 414 | struct sock *sk; |
415 | struct nr_sock *nr; | 415 | struct nr_sock *nr; |
416 | 416 | ||
417 | if (net != &init_net) | ||
418 | return -EAFNOSUPPORT; | ||
419 | |||
417 | if (sock->type != SOCK_SEQPACKET || protocol != 0) | 420 | if (sock->type != SOCK_SEQPACKET || protocol != 0) |
418 | return -ESOCKTNOSUPPORT; | 421 | return -ESOCKTNOSUPPORT; |
419 | 422 | ||
420 | if ((sk = sk_alloc(PF_NETROM, GFP_ATOMIC, &nr_proto, 1)) == NULL) | 423 | if ((sk = sk_alloc(net, PF_NETROM, GFP_ATOMIC, &nr_proto, 1)) == NULL) |
421 | return -ENOMEM; | 424 | return -ENOMEM; |
422 | 425 | ||
423 | nr = nr_sk(sk); | 426 | nr = nr_sk(sk); |
@@ -459,7 +462,7 @@ static struct sock *nr_make_new(struct sock *osk) | |||
459 | if (osk->sk_type != SOCK_SEQPACKET) | 462 | if (osk->sk_type != SOCK_SEQPACKET) |
460 | return NULL; | 463 | return NULL; |
461 | 464 | ||
462 | if ((sk = sk_alloc(PF_NETROM, GFP_ATOMIC, osk->sk_prot, 1)) == NULL) | 465 | if ((sk = sk_alloc(osk->sk_net, PF_NETROM, GFP_ATOMIC, osk->sk_prot, 1)) == NULL) |
463 | return NULL; | 466 | return NULL; |
464 | 467 | ||
465 | nr = nr_sk(sk); | 468 | nr = nr_sk(sk); |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 56502292f24c..766b5faaed21 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -977,13 +977,16 @@ static struct proto packet_proto = { | |||
977 | * Create a packet of type SOCK_PACKET. | 977 | * Create a packet of type SOCK_PACKET. |
978 | */ | 978 | */ |
979 | 979 | ||
980 | static int packet_create(struct socket *sock, int protocol) | 980 | static int packet_create(struct net *net, struct socket *sock, int protocol) |
981 | { | 981 | { |
982 | struct sock *sk; | 982 | struct sock *sk; |
983 | struct packet_sock *po; | 983 | struct packet_sock *po; |
984 | __be16 proto = (__force __be16)protocol; /* weird, but documented */ | 984 | __be16 proto = (__force __be16)protocol; /* weird, but documented */ |
985 | int err; | 985 | int err; |
986 | 986 | ||
987 | if (net != &init_net) | ||
988 | return -EAFNOSUPPORT; | ||
989 | |||
987 | if (!capable(CAP_NET_RAW)) | 990 | if (!capable(CAP_NET_RAW)) |
988 | return -EPERM; | 991 | return -EPERM; |
989 | if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW && | 992 | if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW && |
@@ -993,7 +996,7 @@ static int packet_create(struct socket *sock, int protocol) | |||
993 | sock->state = SS_UNCONNECTED; | 996 | sock->state = SS_UNCONNECTED; |
994 | 997 | ||
995 | err = -ENOBUFS; | 998 | err = -ENOBUFS; |
996 | sk = sk_alloc(PF_PACKET, GFP_KERNEL, &packet_proto, 1); | 999 | sk = sk_alloc(net, PF_PACKET, GFP_KERNEL, &packet_proto, 1); |
997 | if (sk == NULL) | 1000 | if (sk == NULL) |
998 | goto out; | 1001 | goto out; |
999 | 1002 | ||
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 48319f7991ac..67e06ab7f854 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -499,15 +499,18 @@ static struct proto rose_proto = { | |||
499 | .obj_size = sizeof(struct rose_sock), | 499 | .obj_size = sizeof(struct rose_sock), |
500 | }; | 500 | }; |
501 | 501 | ||
502 | static int rose_create(struct socket *sock, int protocol) | 502 | static int rose_create(struct net *net, struct socket *sock, int protocol) |
503 | { | 503 | { |
504 | struct sock *sk; | 504 | struct sock *sk; |
505 | struct rose_sock *rose; | 505 | struct rose_sock *rose; |
506 | 506 | ||
507 | if (net != &init_net) | ||
508 | return -EAFNOSUPPORT; | ||
509 | |||
507 | if (sock->type != SOCK_SEQPACKET || protocol != 0) | 510 | if (sock->type != SOCK_SEQPACKET || protocol != 0) |
508 | return -ESOCKTNOSUPPORT; | 511 | return -ESOCKTNOSUPPORT; |
509 | 512 | ||
510 | if ((sk = sk_alloc(PF_ROSE, GFP_ATOMIC, &rose_proto, 1)) == NULL) | 513 | if ((sk = sk_alloc(net, PF_ROSE, GFP_ATOMIC, &rose_proto, 1)) == NULL) |
511 | return -ENOMEM; | 514 | return -ENOMEM; |
512 | 515 | ||
513 | rose = rose_sk(sk); | 516 | rose = rose_sk(sk); |
@@ -545,7 +548,7 @@ static struct sock *rose_make_new(struct sock *osk) | |||
545 | if (osk->sk_type != SOCK_SEQPACKET) | 548 | if (osk->sk_type != SOCK_SEQPACKET) |
546 | return NULL; | 549 | return NULL; |
547 | 550 | ||
548 | if ((sk = sk_alloc(PF_ROSE, GFP_ATOMIC, &rose_proto, 1)) == NULL) | 551 | if ((sk = sk_alloc(osk->sk_net, PF_ROSE, GFP_ATOMIC, &rose_proto, 1)) == NULL) |
549 | return NULL; | 552 | return NULL; |
550 | 553 | ||
551 | rose = rose_sk(sk); | 554 | rose = rose_sk(sk); |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 122d55d992e1..0803f305ed08 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -606,13 +606,16 @@ static unsigned int rxrpc_poll(struct file *file, struct socket *sock, | |||
606 | /* | 606 | /* |
607 | * create an RxRPC socket | 607 | * create an RxRPC socket |
608 | */ | 608 | */ |
609 | static int rxrpc_create(struct socket *sock, int protocol) | 609 | static int rxrpc_create(struct net *net, struct socket *sock, int protocol) |
610 | { | 610 | { |
611 | struct rxrpc_sock *rx; | 611 | struct rxrpc_sock *rx; |
612 | struct sock *sk; | 612 | struct sock *sk; |
613 | 613 | ||
614 | _enter("%p,%d", sock, protocol); | 614 | _enter("%p,%d", sock, protocol); |
615 | 615 | ||
616 | if (net != &init_net) | ||
617 | return -EAFNOSUPPORT; | ||
618 | |||
616 | /* we support transport protocol UDP only */ | 619 | /* we support transport protocol UDP only */ |
617 | if (protocol != PF_INET) | 620 | if (protocol != PF_INET) |
618 | return -EPROTONOSUPPORT; | 621 | return -EPROTONOSUPPORT; |
@@ -623,7 +626,7 @@ static int rxrpc_create(struct socket *sock, int protocol) | |||
623 | sock->ops = &rxrpc_rpc_ops; | 626 | sock->ops = &rxrpc_rpc_ops; |
624 | sock->state = SS_UNCONNECTED; | 627 | sock->state = SS_UNCONNECTED; |
625 | 628 | ||
626 | sk = sk_alloc(PF_RXRPC, GFP_KERNEL, &rxrpc_proto, 1); | 629 | sk = sk_alloc(net, PF_RXRPC, GFP_KERNEL, &rxrpc_proto, 1); |
627 | if (!sk) | 630 | if (!sk) |
628 | return -ENOMEM; | 631 | return -ENOMEM; |
629 | 632 | ||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index ec29b97dbab9..ddeb4882ec75 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -631,7 +631,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk, | |||
631 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); | 631 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); |
632 | struct sctp6_sock *newsctp6sk; | 632 | struct sctp6_sock *newsctp6sk; |
633 | 633 | ||
634 | newsk = sk_alloc(PF_INET6, GFP_KERNEL, sk->sk_prot, 1); | 634 | newsk = sk_alloc(sk->sk_net, PF_INET6, GFP_KERNEL, sk->sk_prot, 1); |
635 | if (!newsk) | 635 | if (!newsk) |
636 | goto out; | 636 | goto out; |
637 | 637 | ||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 30929e3ca05a..af67c839ef98 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -552,7 +552,7 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk, | |||
552 | { | 552 | { |
553 | struct inet_sock *inet = inet_sk(sk); | 553 | struct inet_sock *inet = inet_sk(sk); |
554 | struct inet_sock *newinet; | 554 | struct inet_sock *newinet; |
555 | struct sock *newsk = sk_alloc(PF_INET, GFP_KERNEL, sk->sk_prot, 1); | 555 | struct sock *newsk = sk_alloc(sk->sk_net, PF_INET, GFP_KERNEL, sk->sk_prot, 1); |
556 | 556 | ||
557 | if (!newsk) | 557 | if (!newsk) |
558 | goto out; | 558 | goto out; |
diff --git a/net/socket.c b/net/socket.c index b09eb9036a17..a714c6d4e4a1 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -84,6 +84,7 @@ | |||
84 | #include <linux/kmod.h> | 84 | #include <linux/kmod.h> |
85 | #include <linux/audit.h> | 85 | #include <linux/audit.h> |
86 | #include <linux/wireless.h> | 86 | #include <linux/wireless.h> |
87 | #include <linux/nsproxy.h> | ||
87 | 88 | ||
88 | #include <asm/uaccess.h> | 89 | #include <asm/uaccess.h> |
89 | #include <asm/unistd.h> | 90 | #include <asm/unistd.h> |
@@ -1071,7 +1072,7 @@ call_kill: | |||
1071 | return 0; | 1072 | return 0; |
1072 | } | 1073 | } |
1073 | 1074 | ||
1074 | static int __sock_create(int family, int type, int protocol, | 1075 | static int __sock_create(struct net *net, int family, int type, int protocol, |
1075 | struct socket **res, int kern) | 1076 | struct socket **res, int kern) |
1076 | { | 1077 | { |
1077 | int err; | 1078 | int err; |
@@ -1147,7 +1148,7 @@ static int __sock_create(int family, int type, int protocol, | |||
1147 | /* Now protected by module ref count */ | 1148 | /* Now protected by module ref count */ |
1148 | rcu_read_unlock(); | 1149 | rcu_read_unlock(); |
1149 | 1150 | ||
1150 | err = pf->create(sock, protocol); | 1151 | err = pf->create(net, sock, protocol); |
1151 | if (err < 0) | 1152 | if (err < 0) |
1152 | goto out_module_put; | 1153 | goto out_module_put; |
1153 | 1154 | ||
@@ -1186,12 +1187,12 @@ out_release: | |||
1186 | 1187 | ||
1187 | int sock_create(int family, int type, int protocol, struct socket **res) | 1188 | int sock_create(int family, int type, int protocol, struct socket **res) |
1188 | { | 1189 | { |
1189 | return __sock_create(family, type, protocol, res, 0); | 1190 | return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0); |
1190 | } | 1191 | } |
1191 | 1192 | ||
1192 | int sock_create_kern(int family, int type, int protocol, struct socket **res) | 1193 | int sock_create_kern(int family, int type, int protocol, struct socket **res) |
1193 | { | 1194 | { |
1194 | return __sock_create(family, type, protocol, res, 1); | 1195 | return __sock_create(&init_net, family, type, protocol, res, 1); |
1195 | } | 1196 | } |
1196 | 1197 | ||
1197 | asmlinkage long sys_socket(int family, int type, int protocol) | 1198 | asmlinkage long sys_socket(int family, int type, int protocol) |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 84110172031e..e36b4b5a5222 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -162,13 +162,16 @@ static void advance_queue(struct tipc_sock *tsock) | |||
162 | * | 162 | * |
163 | * Returns 0 on success, errno otherwise | 163 | * Returns 0 on success, errno otherwise |
164 | */ | 164 | */ |
165 | static int tipc_create(struct socket *sock, int protocol) | 165 | static int tipc_create(struct net *net, struct socket *sock, int protocol) |
166 | { | 166 | { |
167 | struct tipc_sock *tsock; | 167 | struct tipc_sock *tsock; |
168 | struct tipc_port *port; | 168 | struct tipc_port *port; |
169 | struct sock *sk; | 169 | struct sock *sk; |
170 | u32 ref; | 170 | u32 ref; |
171 | 171 | ||
172 | if (net != &init_net) | ||
173 | return -EAFNOSUPPORT; | ||
174 | |||
172 | if (unlikely(protocol != 0)) | 175 | if (unlikely(protocol != 0)) |
173 | return -EPROTONOSUPPORT; | 176 | return -EPROTONOSUPPORT; |
174 | 177 | ||
@@ -198,7 +201,7 @@ static int tipc_create(struct socket *sock, int protocol) | |||
198 | return -EPROTOTYPE; | 201 | return -EPROTOTYPE; |
199 | } | 202 | } |
200 | 203 | ||
201 | sk = sk_alloc(AF_TIPC, GFP_KERNEL, &tipc_proto, 1); | 204 | sk = sk_alloc(net, AF_TIPC, GFP_KERNEL, &tipc_proto, 1); |
202 | if (!sk) { | 205 | if (!sk) { |
203 | tipc_deleteport(ref); | 206 | tipc_deleteport(ref); |
204 | return -ENOMEM; | 207 | return -ENOMEM; |
@@ -1372,7 +1375,7 @@ static int accept(struct socket *sock, struct socket *newsock, int flags) | |||
1372 | } | 1375 | } |
1373 | buf = skb_peek(&sock->sk->sk_receive_queue); | 1376 | buf = skb_peek(&sock->sk->sk_receive_queue); |
1374 | 1377 | ||
1375 | res = tipc_create(newsock, 0); | 1378 | res = tipc_create(sock->sk->sk_net, newsock, 0); |
1376 | if (!res) { | 1379 | if (!res) { |
1377 | struct tipc_sock *new_tsock = tipc_sk(newsock->sk); | 1380 | struct tipc_sock *new_tsock = tipc_sk(newsock->sk); |
1378 | struct tipc_portid id; | 1381 | struct tipc_portid id; |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 2386090c3a16..10e73122c34c 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -594,7 +594,7 @@ static struct proto unix_proto = { | |||
594 | */ | 594 | */ |
595 | static struct lock_class_key af_unix_sk_receive_queue_lock_key; | 595 | static struct lock_class_key af_unix_sk_receive_queue_lock_key; |
596 | 596 | ||
597 | static struct sock * unix_create1(struct socket *sock) | 597 | static struct sock * unix_create1(struct net *net, struct socket *sock) |
598 | { | 598 | { |
599 | struct sock *sk = NULL; | 599 | struct sock *sk = NULL; |
600 | struct unix_sock *u; | 600 | struct unix_sock *u; |
@@ -602,7 +602,7 @@ static struct sock * unix_create1(struct socket *sock) | |||
602 | if (atomic_read(&unix_nr_socks) >= 2*get_max_files()) | 602 | if (atomic_read(&unix_nr_socks) >= 2*get_max_files()) |
603 | goto out; | 603 | goto out; |
604 | 604 | ||
605 | sk = sk_alloc(PF_UNIX, GFP_KERNEL, &unix_proto, 1); | 605 | sk = sk_alloc(net, PF_UNIX, GFP_KERNEL, &unix_proto, 1); |
606 | if (!sk) | 606 | if (!sk) |
607 | goto out; | 607 | goto out; |
608 | 608 | ||
@@ -628,8 +628,11 @@ out: | |||
628 | return sk; | 628 | return sk; |
629 | } | 629 | } |
630 | 630 | ||
631 | static int unix_create(struct socket *sock, int protocol) | 631 | static int unix_create(struct net *net, struct socket *sock, int protocol) |
632 | { | 632 | { |
633 | if (net != &init_net) | ||
634 | return -EAFNOSUPPORT; | ||
635 | |||
633 | if (protocol && protocol != PF_UNIX) | 636 | if (protocol && protocol != PF_UNIX) |
634 | return -EPROTONOSUPPORT; | 637 | return -EPROTONOSUPPORT; |
635 | 638 | ||
@@ -655,7 +658,7 @@ static int unix_create(struct socket *sock, int protocol) | |||
655 | return -ESOCKTNOSUPPORT; | 658 | return -ESOCKTNOSUPPORT; |
656 | } | 659 | } |
657 | 660 | ||
658 | return unix_create1(sock) ? 0 : -ENOMEM; | 661 | return unix_create1(net, sock) ? 0 : -ENOMEM; |
659 | } | 662 | } |
660 | 663 | ||
661 | static int unix_release(struct socket *sock) | 664 | static int unix_release(struct socket *sock) |
@@ -1039,7 +1042,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, | |||
1039 | err = -ENOMEM; | 1042 | err = -ENOMEM; |
1040 | 1043 | ||
1041 | /* create new sock for complete connection */ | 1044 | /* create new sock for complete connection */ |
1042 | newsk = unix_create1(NULL); | 1045 | newsk = unix_create1(sk->sk_net, NULL); |
1043 | if (newsk == NULL) | 1046 | if (newsk == NULL) |
1044 | goto out; | 1047 | goto out; |
1045 | 1048 | ||
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index 479927cb45ca..2e9931571a4d 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -466,10 +466,10 @@ static struct proto x25_proto = { | |||
466 | .obj_size = sizeof(struct x25_sock), | 466 | .obj_size = sizeof(struct x25_sock), |
467 | }; | 467 | }; |
468 | 468 | ||
469 | static struct sock *x25_alloc_socket(void) | 469 | static struct sock *x25_alloc_socket(struct net *net) |
470 | { | 470 | { |
471 | struct x25_sock *x25; | 471 | struct x25_sock *x25; |
472 | struct sock *sk = sk_alloc(AF_X25, GFP_ATOMIC, &x25_proto, 1); | 472 | struct sock *sk = sk_alloc(net, AF_X25, GFP_ATOMIC, &x25_proto, 1); |
473 | 473 | ||
474 | if (!sk) | 474 | if (!sk) |
475 | goto out; | 475 | goto out; |
@@ -485,17 +485,20 @@ out: | |||
485 | return sk; | 485 | return sk; |
486 | } | 486 | } |
487 | 487 | ||
488 | static int x25_create(struct socket *sock, int protocol) | 488 | static int x25_create(struct net *net, struct socket *sock, int protocol) |
489 | { | 489 | { |
490 | struct sock *sk; | 490 | struct sock *sk; |
491 | struct x25_sock *x25; | 491 | struct x25_sock *x25; |
492 | int rc = -ESOCKTNOSUPPORT; | 492 | int rc = -ESOCKTNOSUPPORT; |
493 | 493 | ||
494 | if (net != &init_net) | ||
495 | return -EAFNOSUPPORT; | ||
496 | |||
494 | if (sock->type != SOCK_SEQPACKET || protocol) | 497 | if (sock->type != SOCK_SEQPACKET || protocol) |
495 | goto out; | 498 | goto out; |
496 | 499 | ||
497 | rc = -ENOMEM; | 500 | rc = -ENOMEM; |
498 | if ((sk = x25_alloc_socket()) == NULL) | 501 | if ((sk = x25_alloc_socket(net)) == NULL) |
499 | goto out; | 502 | goto out; |
500 | 503 | ||
501 | x25 = x25_sk(sk); | 504 | x25 = x25_sk(sk); |
@@ -543,7 +546,7 @@ static struct sock *x25_make_new(struct sock *osk) | |||
543 | if (osk->sk_type != SOCK_SEQPACKET) | 546 | if (osk->sk_type != SOCK_SEQPACKET) |
544 | goto out; | 547 | goto out; |
545 | 548 | ||
546 | if ((sk = x25_alloc_socket()) == NULL) | 549 | if ((sk = x25_alloc_socket(osk->sk_net)) == NULL) |
547 | goto out; | 550 | goto out; |
548 | 551 | ||
549 | x25 = x25_sk(sk); | 552 | x25 = x25_sk(sk); |