|
@@ -1119,14 +1119,15 @@ static struct proto netlink_proto = {
|
|
};
|
|
};
|
|
|
|
|
|
static int __netlink_create(struct net *net, struct socket *sock,
|
|
static int __netlink_create(struct net *net, struct socket *sock,
|
|
- struct mutex *cb_mutex, int protocol)
|
|
|
|
|
|
+ struct mutex *cb_mutex, int protocol,
|
|
|
|
+ int kern)
|
|
{
|
|
{
|
|
struct sock *sk;
|
|
struct sock *sk;
|
|
struct netlink_sock *nlk;
|
|
struct netlink_sock *nlk;
|
|
|
|
|
|
sock->ops = &netlink_ops;
|
|
sock->ops = &netlink_ops;
|
|
|
|
|
|
- sk = sk_alloc(net, PF_NETLINK, GFP_KERNEL, &netlink_proto);
|
|
|
|
|
|
+ sk = sk_alloc(net, PF_NETLINK, GFP_KERNEL, &netlink_proto, kern);
|
|
if (!sk)
|
|
if (!sk)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
@@ -1188,7 +1189,7 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol,
|
|
if (err < 0)
|
|
if (err < 0)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- err = __netlink_create(net, sock, cb_mutex, protocol);
|
|
|
|
|
|
+ err = __netlink_create(net, sock, cb_mutex, protocol, kern);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
goto out_module;
|
|
goto out_module;
|
|
|
|
|
|
@@ -2515,14 +2516,12 @@ __netlink_kernel_create(struct net *net, int unit, struct module *module,
|
|
|
|
|
|
if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
|
|
if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock))
|
|
return NULL;
|
|
return NULL;
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* We have to just have a reference on the net from sk, but don't
|
|
* We have to just have a reference on the net from sk, but don't
|
|
* get_net it. Besides, we cannot get and then put the net here.
|
|
* get_net it. Besides, we cannot get and then put the net here.
|
|
* So we create one inside init_net and the move it to net.
|
|
* So we create one inside init_net and the move it to net.
|
|
*/
|
|
*/
|
|
-
|
|
|
|
- if (__netlink_create(&init_net, sock, cb_mutex, unit) < 0)
|
|
|
|
|
|
+ if (__netlink_create(&init_net, sock, cb_mutex, unit, 0) < 0)
|
|
goto out_sock_release_nosk;
|
|
goto out_sock_release_nosk;
|
|
|
|
|
|
sk = sock->sk;
|
|
sk = sock->sk;
|