Commit 7013ec30 authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by David S. Miller

netns PF_KEY: per-netns /proc/pfkey

Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 07fb0f17
...@@ -3673,7 +3673,7 @@ static int pfkey_seq_show(struct seq_file *f, void *v) ...@@ -3673,7 +3673,7 @@ static int pfkey_seq_show(struct seq_file *f, void *v)
static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos) static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos)
{ {
struct net *net = &init_net; struct net *net = seq_file_net(f);
struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
struct sock *s; struct sock *s;
struct hlist_node *node; struct hlist_node *node;
...@@ -3692,7 +3692,7 @@ static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos) ...@@ -3692,7 +3692,7 @@ static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos)
static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos) static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos)
{ {
struct net *net = &init_net; struct net *net = seq_file_net(f);
struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
++*ppos; ++*ppos;
...@@ -3715,38 +3715,39 @@ static struct seq_operations pfkey_seq_ops = { ...@@ -3715,38 +3715,39 @@ static struct seq_operations pfkey_seq_ops = {
static int pfkey_seq_open(struct inode *inode, struct file *file) static int pfkey_seq_open(struct inode *inode, struct file *file)
{ {
return seq_open(file, &pfkey_seq_ops); return seq_open_net(inode, file, &pfkey_seq_ops,
sizeof(struct seq_net_private));
} }
static struct file_operations pfkey_proc_ops = { static struct file_operations pfkey_proc_ops = {
.open = pfkey_seq_open, .open = pfkey_seq_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = seq_release, .release = seq_release_net,
}; };
static int pfkey_init_proc(void) static int __net_init pfkey_init_proc(struct net *net)
{ {
struct proc_dir_entry *e; struct proc_dir_entry *e;
e = proc_net_fops_create(&init_net, "pfkey", 0, &pfkey_proc_ops); e = proc_net_fops_create(net, "pfkey", 0, &pfkey_proc_ops);
if (e == NULL) if (e == NULL)
return -ENOMEM; return -ENOMEM;
return 0; return 0;
} }
static void pfkey_exit_proc(void) static void pfkey_exit_proc(struct net *net)
{ {
proc_net_remove(&init_net, "pfkey"); proc_net_remove(net, "pfkey");
} }
#else #else
static inline int pfkey_init_proc(void) static int __net_init pfkey_init_proc(struct net *net)
{ {
return 0; return 0;
} }
static inline void pfkey_exit_proc(void) static void pfkey_exit_proc(struct net *net)
{ {
} }
#endif #endif
...@@ -3777,8 +3778,12 @@ static int __net_init pfkey_net_init(struct net *net) ...@@ -3777,8 +3778,12 @@ static int __net_init pfkey_net_init(struct net *net)
rv = net_assign_generic(net, pfkey_net_id, net_pfkey); rv = net_assign_generic(net, pfkey_net_id, net_pfkey);
if (rv < 0) if (rv < 0)
goto out_assign; goto out_assign;
rv = pfkey_init_proc(net);
if (rv < 0)
goto out_proc;
return 0; return 0;
out_proc:
out_assign: out_assign:
kfree(net_pfkey); kfree(net_pfkey);
out_kmalloc: out_kmalloc:
...@@ -3789,6 +3794,7 @@ static void __net_exit pfkey_net_exit(struct net *net) ...@@ -3789,6 +3794,7 @@ static void __net_exit pfkey_net_exit(struct net *net)
{ {
struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id); struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
pfkey_exit_proc(net);
BUG_ON(!hlist_empty(&net_pfkey->table)); BUG_ON(!hlist_empty(&net_pfkey->table));
kfree(net_pfkey); kfree(net_pfkey);
} }
...@@ -3802,7 +3808,6 @@ static void __exit ipsec_pfkey_exit(void) ...@@ -3802,7 +3808,6 @@ static void __exit ipsec_pfkey_exit(void)
{ {
unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops); unregister_pernet_gen_subsys(pfkey_net_id, &pfkey_net_ops);
xfrm_unregister_km(&pfkeyv2_mgr); xfrm_unregister_km(&pfkeyv2_mgr);
pfkey_exit_proc();
sock_unregister(PF_KEY); sock_unregister(PF_KEY);
proto_unregister(&key_proto); proto_unregister(&key_proto);
} }
...@@ -3817,12 +3822,9 @@ static int __init ipsec_pfkey_init(void) ...@@ -3817,12 +3822,9 @@ static int __init ipsec_pfkey_init(void)
err = sock_register(&pfkey_family_ops); err = sock_register(&pfkey_family_ops);
if (err != 0) if (err != 0)
goto out_unregister_key_proto; goto out_unregister_key_proto;
err = pfkey_init_proc();
if (err != 0)
goto out_sock_unregister;
err = xfrm_register_km(&pfkeyv2_mgr); err = xfrm_register_km(&pfkeyv2_mgr);
if (err != 0) if (err != 0)
goto out_remove_proc_entry; goto out_sock_unregister;
err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops); err = register_pernet_gen_subsys(&pfkey_net_id, &pfkey_net_ops);
if (err != 0) if (err != 0)
goto out_xfrm_unregister_km; goto out_xfrm_unregister_km;
...@@ -3830,8 +3832,6 @@ static int __init ipsec_pfkey_init(void) ...@@ -3830,8 +3832,6 @@ static int __init ipsec_pfkey_init(void)
return err; return err;
out_xfrm_unregister_km: out_xfrm_unregister_km:
xfrm_unregister_km(&pfkeyv2_mgr); xfrm_unregister_km(&pfkeyv2_mgr);
out_remove_proc_entry:
pfkey_exit_proc();
out_sock_unregister: out_sock_unregister:
sock_unregister(PF_KEY); sock_unregister(PF_KEY);
out_unregister_key_proto: out_unregister_key_proto:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment