diff options
Diffstat (limited to 'net/key/af_key.c')
-rw-r--r-- | net/key/af_key.c | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c index 4e98193dfa0f..84209fbbeb17 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x)) | 35 | #define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x)) |
36 | #define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x)) | 36 | #define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x)) |
37 | 37 | ||
38 | static int pfkey_net_id; | 38 | static int pfkey_net_id __read_mostly; |
39 | struct netns_pfkey { | 39 | struct netns_pfkey { |
40 | /* List of all pfkey sockets. */ | 40 | /* List of all pfkey sockets. */ |
41 | struct hlist_head table; | 41 | struct hlist_head table; |
@@ -177,7 +177,8 @@ static struct proto key_proto = { | |||
177 | .obj_size = sizeof(struct pfkey_sock), | 177 | .obj_size = sizeof(struct pfkey_sock), |
178 | }; | 178 | }; |
179 | 179 | ||
180 | static int pfkey_create(struct net *net, struct socket *sock, int protocol) | 180 | static int pfkey_create(struct net *net, struct socket *sock, int protocol, |
181 | int kern) | ||
181 | { | 182 | { |
182 | struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); | 183 | struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); |
183 | struct sock *sk; | 184 | struct sock *sk; |
@@ -3606,7 +3607,7 @@ static int pfkey_recvmsg(struct kiocb *kiocb, | |||
3606 | if (err) | 3607 | if (err) |
3607 | goto out_free; | 3608 | goto out_free; |
3608 | 3609 | ||
3609 | sock_recv_timestamp(msg, sk, skb); | 3610 | sock_recv_ts_and_drops(msg, sk, skb); |
3610 | 3611 | ||
3611 | err = (flags & MSG_TRUNC) ? skb->len : copied; | 3612 | err = (flags & MSG_TRUNC) ? skb->len : copied; |
3612 | 3613 | ||
@@ -3644,7 +3645,7 @@ static const struct proto_ops pfkey_ops = { | |||
3644 | .recvmsg = pfkey_recvmsg, | 3645 | .recvmsg = pfkey_recvmsg, |
3645 | }; | 3646 | }; |
3646 | 3647 | ||
3647 | static struct net_proto_family pfkey_family_ops = { | 3648 | static const struct net_proto_family pfkey_family_ops = { |
3648 | .family = PF_KEY, | 3649 | .family = PF_KEY, |
3649 | .create = pfkey_create, | 3650 | .create = pfkey_create, |
3650 | .owner = THIS_MODULE, | 3651 | .owner = THIS_MODULE, |
@@ -3764,28 +3765,14 @@ static struct xfrm_mgr pfkeyv2_mgr = | |||
3764 | 3765 | ||
3765 | static int __net_init pfkey_net_init(struct net *net) | 3766 | static int __net_init pfkey_net_init(struct net *net) |
3766 | { | 3767 | { |
3767 | struct netns_pfkey *net_pfkey; | 3768 | struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); |
3768 | int rv; | 3769 | int rv; |
3769 | 3770 | ||
3770 | net_pfkey = kmalloc(sizeof(struct netns_pfkey), GFP_KERNEL); | ||
3771 | if (!net_pfkey) { | ||
3772 | rv = -ENOMEM; | ||
3773 | goto out_kmalloc; | ||
3774 | } | ||
3775 | INIT_HLIST_HEAD(&net_pfkey->table); | 3771 | INIT_HLIST_HEAD(&net_pfkey->table); |
3776 | atomic_set(&net_pfkey->socks_nr, 0); | 3772 | atomic_set(&net_pfkey->socks_nr, 0); |
3777 | rv = net_assign_generic(net, pfkey_net_id, net_pfkey); | 3773 | |
3778 | if (rv < 0) | ||
3779 | goto out_assign; | ||
3780 | rv = pfkey_init_proc(net); | 3774 | rv = pfkey_init_proc(net); |
3781 | if (rv < 0) | ||
3782 | goto out_proc; | ||
3783 | return 0; | ||
3784 | 3775 | ||
3785 | out_proc: | ||
3786 | out_assign: | ||
3787 | kfree(net_pfkey); | ||
3788 | out_kmalloc: | ||
3789 | return rv; | 3776 | return rv; |
3790 | } | 3777 | } |
3791 | 3778 | ||
@@ -3795,17 +3782,18 @@ static void __net_exit pfkey_net_exit(struct net *net) | |||
3795 | 3782 | ||
3796 | pfkey_exit_proc(net); | 3783 | pfkey_exit_proc(net); |
3797 | BUG_ON(!hlist_empty(&net_pfkey->table)); | 3784 | BUG_ON(!hlist_empty(&net_pfkey->table)); |
3798 | kfree(net_pfkey); | ||
3799 | } | 3785 | } |
3800 | 3786 | ||
3801 | static struct pernet_operations pfkey_net_ops = { | 3787 | static struct pernet_operations pfkey_net_ops = { |
3802 | .init = pfkey_net_init, | 3788 | .init = pfkey_net_init, |
3803 | .exit = pfkey_net_exit, | 3789 | .exit = pfkey_net_exit, |
3790 | .id = &pfkey_net_id, | ||
3791 | .size = sizeof(struct netns_pfkey), | ||
3804 | }; | 3792 | }; |
3805 | 3793 | ||
3806 | static void __exit ipsec_pfkey_exit(void) | 3794 | static void __exit ipsec_pfkey_exit(void) |
3807 | { | 3795 | { |
3808 | unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops); | 3796 | unregister_pernet_subsys(&pfkey_net_ops); |
3809 | xfrm_unregister_km(&pfkeyv2_mgr); | 3797 | xfrm_unregister_km(&pfkeyv2_mgr); |
3810 | sock_unregister(PF_KEY); | 3798 | sock_unregister(PF_KEY); |
3811 | proto_unregister(&key_proto); | 3799 | proto_unregister(&key_proto); |
@@ -3824,7 +3812,7 @@ static int __init ipsec_pfkey_init(void) | |||
3824 | err = xfrm_register_km(&pfkeyv2_mgr); | 3812 | err = xfrm_register_km(&pfkeyv2_mgr); |
3825 | if (err != 0) | 3813 | if (err != 0) |
3826 | goto out_sock_unregister; | 3814 | goto out_sock_unregister; |
3827 | err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops); | 3815 | err = register_pernet_subsys(&pfkey_net_ops); |
3828 | if (err != 0) | 3816 | if (err != 0) |
3829 | goto out_xfrm_unregister_km; | 3817 | goto out_xfrm_unregister_km; |
3830 | out: | 3818 | out: |