aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlexey Dobriyan <adobriyan@gmail.com>2008-11-25 20:59:00 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-25 20:59:00 -0500
commit7013ec30e0e2bc5b1e602e19a4e0668f9b7c0a72 (patch)
tree7d46a9330d52d8cd9b4b737ffda7ea291c831446 /net
parent07fb0f1799dcb6b3df527909811fd6704278842e (diff)
netns PF_KEY: per-netns /proc/pfkey
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/key/af_key.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c
index bb78ef972d1b..f8bd8df5e257 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -3673,7 +3673,7 @@ static int pfkey_seq_show(struct seq_file *f, void *v)
3673 3673
3674static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos) 3674static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos)
3675{ 3675{
3676 struct net *net = &init_net; 3676 struct net *net = seq_file_net(f);
3677 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3677 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3678 struct sock *s; 3678 struct sock *s;
3679 struct hlist_node *node; 3679 struct hlist_node *node;
@@ -3692,7 +3692,7 @@ static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos)
3692 3692
3693static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos) 3693static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos)
3694{ 3694{
3695 struct net *net = &init_net; 3695 struct net *net = seq_file_net(f);
3696 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3696 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3697 3697
3698 ++*ppos; 3698 ++*ppos;
@@ -3715,38 +3715,39 @@ static struct seq_operations pfkey_seq_ops = {
3715 3715
3716static int pfkey_seq_open(struct inode *inode, struct file *file) 3716static int pfkey_seq_open(struct inode *inode, struct file *file)
3717{ 3717{
3718 return seq_open(file, &pfkey_seq_ops); 3718 return seq_open_net(inode, file, &pfkey_seq_ops,
3719 sizeof(struct seq_net_private));
3719} 3720}
3720 3721
3721static struct file_operations pfkey_proc_ops = { 3722static struct file_operations pfkey_proc_ops = {
3722 .open = pfkey_seq_open, 3723 .open = pfkey_seq_open,
3723 .read = seq_read, 3724 .read = seq_read,
3724 .llseek = seq_lseek, 3725 .llseek = seq_lseek,
3725 .release = seq_release, 3726 .release = seq_release_net,
3726}; 3727};
3727 3728
3728static int pfkey_init_proc(void) 3729static int __net_init pfkey_init_proc(struct net *net)
3729{ 3730{
3730 struct proc_dir_entry *e; 3731 struct proc_dir_entry *e;
3731 3732
3732 e = proc_net_fops_create(&init_net, "pfkey", 0, &pfkey_proc_ops); 3733 e = proc_net_fops_create(net, "pfkey", 0, &pfkey_proc_ops);
3733 if (e == NULL) 3734 if (e == NULL)
3734 return -ENOMEM; 3735 return -ENOMEM;
3735 3736
3736 return 0; 3737 return 0;
3737} 3738}
3738 3739
3739static void pfkey_exit_proc(void) 3740static void pfkey_exit_proc(struct net *net)
3740{ 3741{
3741 proc_net_remove(&init_net, "pfkey"); 3742 proc_net_remove(net, "pfkey");
3742} 3743}
3743#else 3744#else
3744static inline int pfkey_init_proc(void) 3745static int __net_init pfkey_init_proc(struct net *net)
3745{ 3746{
3746 return 0; 3747 return 0;
3747} 3748}
3748 3749
3749static inline void pfkey_exit_proc(void) 3750static void pfkey_exit_proc(struct net *net)
3750{ 3751{
3751} 3752}
3752#endif 3753#endif
@@ -3777,8 +3778,12 @@ static int __net_init pfkey_net_init(struct net *net)
3777 rv = net_assign_generic(net, pfkey_net_id, net_pfkey); 3778 rv = net_assign_generic(net, pfkey_net_id, net_pfkey);
3778 if (rv < 0) 3779 if (rv < 0)
3779 goto out_assign; 3780 goto out_assign;
3781 rv = pfkey_init_proc(net);
3782 if (rv < 0)
3783 goto out_proc;
3780 return 0; 3784 return 0;
3781 3785
3786out_proc:
3782out_assign: 3787out_assign:
3783 kfree(net_pfkey); 3788 kfree(net_pfkey);
3784out_kmalloc: 3789out_kmalloc:
@@ -3789,6 +3794,7 @@ static void __net_exit pfkey_net_exit(struct net *net)
3789{ 3794{
3790 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3795 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3791 3796
3797 pfkey_exit_proc(net);
3792 BUG_ON(!hlist_empty(&net_pfkey->table)); 3798 BUG_ON(!hlist_empty(&net_pfkey->table));
3793 kfree(net_pfkey); 3799 kfree(net_pfkey);
3794} 3800}
@@ -3802,7 +3808,6 @@ static void __exit ipsec_pfkey_exit(void)
3802{ 3808{
3803 unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops); 3809 unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops);
3804 xfrm_unregister_km(&pfkeyv2_mgr); 3810 xfrm_unregister_km(&pfkeyv2_mgr);
3805 pfkey_exit_proc();
3806 sock_unregister(PF_KEY); 3811 sock_unregister(PF_KEY);
3807 proto_unregister(&key_proto); 3812 proto_unregister(&key_proto);
3808} 3813}
@@ -3817,12 +3822,9 @@ static int __init ipsec_pfkey_init(void)
3817 err = sock_register(&pfkey_family_ops); 3822 err = sock_register(&pfkey_family_ops);
3818 if (err != 0) 3823 if (err != 0)
3819 goto out_unregister_key_proto; 3824 goto out_unregister_key_proto;
3820 err = pfkey_init_proc();
3821 if (err != 0)
3822 goto out_sock_unregister;
3823 err = xfrm_register_km(&pfkeyv2_mgr); 3825 err = xfrm_register_km(&pfkeyv2_mgr);
3824 if (err != 0) 3826 if (err != 0)
3825 goto out_remove_proc_entry; 3827 goto out_sock_unregister;
3826 err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops); 3828 err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops);
3827 if (err != 0) 3829 if (err != 0)
3828 goto out_xfrm_unregister_km; 3830 goto out_xfrm_unregister_km;
@@ -3830,8 +3832,6 @@ out:
3830 return err; 3832 return err;
3831out_xfrm_unregister_km: 3833out_xfrm_unregister_km:
3832 xfrm_unregister_km(&pfkeyv2_mgr); 3834 xfrm_unregister_km(&pfkeyv2_mgr);
3833out_remove_proc_entry:
3834 pfkey_exit_proc();
3835out_sock_unregister: 3835out_sock_unregister:
3836 sock_unregister(PF_KEY); 3836 sock_unregister(PF_KEY);
3837out_unregister_key_proto: 3837out_unregister_key_proto: