Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netns PF_KEY: per-netns /proc/pfkey

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Alexey Dobriyan and committed by
David S. Miller
7013ec30 07fb0f17

+17 -17
+17 -17
net/key/af_key.c
··· 3673 3673 3674 3674 static 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 3677 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3678 3678 struct sock *s; 3679 3679 struct hlist_node *node; ··· 3692 3692 3693 3693 static 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 3696 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3697 3697 3698 3698 ++*ppos; ··· 3715 3715 3716 3716 static 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 3721 3722 static struct file_operations pfkey_proc_ops = { 3722 3723 .open = pfkey_seq_open, 3723 3724 .read = seq_read, 3724 3725 .llseek = seq_lseek, 3725 - .release = seq_release, 3726 + .release = seq_release_net, 3726 3727 }; 3727 3728 3728 - static int pfkey_init_proc(void) 3729 + static int __net_init pfkey_init_proc(struct net *net) 3729 3730 { 3730 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 3734 if (e == NULL) 3734 3735 return -ENOMEM; 3735 3736 3736 3737 return 0; 3737 3738 } 3738 3739 3739 - static void pfkey_exit_proc(void) 3740 + static 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 3744 #else 3744 - static inline int pfkey_init_proc(void) 3745 + static int __net_init pfkey_init_proc(struct net *net) 3745 3746 { 3746 3747 return 0; 3747 3748 } 3748 3749 3749 - static inline void pfkey_exit_proc(void) 3750 + static void pfkey_exit_proc(struct net *net) 3750 3751 { 3751 3752 } 3752 3753 #endif ··· 3778 3777 rv = net_assign_generic(net, pfkey_net_id, net_pfkey); 3779 3778 if (rv < 0) 3780 3779 goto out_assign; 3780 + rv = pfkey_init_proc(net); 3781 + if (rv < 0) 3782 + goto out_proc; 3781 3783 return 0; 3782 3784 3785 + out_proc: 3783 3786 out_assign: 3784 3787 kfree(net_pfkey); 3785 3788 out_kmalloc: ··· 3794 3789 { 3795 3790 struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); 3796 3791 3792 + pfkey_exit_proc(net); 3797 3793 BUG_ON(!hlist_empty(&net_pfkey->table)); 3798 3794 kfree(net_pfkey); 3799 3795 } ··· 3808 3802 { 3809 3803 unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops); 3810 3804 xfrm_unregister_km(&pfkeyv2_mgr); 3811 - pfkey_exit_proc(); 3812 3805 sock_unregister(PF_KEY); 3813 3806 proto_unregister(&key_proto); 3814 3807 } ··· 3822 3817 err = sock_register(&pfkey_family_ops); 3823 3818 if (err != 0) 3824 3819 goto out_unregister_key_proto; 3825 - err = pfkey_init_proc(); 3826 - if (err != 0) 3827 - goto out_sock_unregister; 3828 3820 err = xfrm_register_km(&pfkeyv2_mgr); 3829 3821 if (err != 0) 3830 - goto out_remove_proc_entry; 3822 + goto out_sock_unregister; 3831 3823 err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops); 3832 3824 if (err != 0) 3833 3825 goto out_xfrm_unregister_km; ··· 3832 3830 return err; 3833 3831 out_xfrm_unregister_km: 3834 3832 xfrm_unregister_km(&pfkeyv2_mgr); 3835 - out_remove_proc_entry: 3836 - pfkey_exit_proc(); 3837 3833 out_sock_unregister: 3838 3834 sock_unregister(PF_KEY); 3839 3835 out_unregister_key_proto: