aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/xfrm.h3
-rw-r--r--net/xfrm/xfrm_policy.c11
-rw-r--r--net/xfrm/xfrm_proc.c26
3 files changed, 21 insertions, 19 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
index 78ec3e8a95ed..1554ccd0c940 100644
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@ -1306,7 +1306,8 @@ static inline void xfrm6_fini(void)
1306#endif 1306#endif
1307 1307
1308#ifdef CONFIG_XFRM_STATISTICS 1308#ifdef CONFIG_XFRM_STATISTICS
1309extern int xfrm_proc_init(void); 1309extern int xfrm_proc_init(struct net *net);
1310extern void xfrm_proc_fini(struct net *net);
1310#endif 1311#endif
1311 1312
1312extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto); 1313extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index e239a25e571c..38822b34ba7d 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -2377,14 +2377,20 @@ static struct notifier_block xfrm_dev_notifier = {
2377#ifdef CONFIG_XFRM_STATISTICS 2377#ifdef CONFIG_XFRM_STATISTICS
2378static int __net_init xfrm_statistics_init(struct net *net) 2378static int __net_init xfrm_statistics_init(struct net *net)
2379{ 2379{
2380 int rv;
2381
2380 if (snmp_mib_init((void **)net->mib.xfrm_statistics, 2382 if (snmp_mib_init((void **)net->mib.xfrm_statistics,
2381 sizeof(struct linux_xfrm_mib)) < 0) 2383 sizeof(struct linux_xfrm_mib)) < 0)
2382 return -ENOMEM; 2384 return -ENOMEM;
2383 return 0; 2385 rv = xfrm_proc_init(net);
2386 if (rv < 0)
2387 snmp_mib_free((void **)net->mib.xfrm_statistics);
2388 return rv;
2384} 2389}
2385 2390
2386static void xfrm_statistics_fini(struct net *net) 2391static void xfrm_statistics_fini(struct net *net)
2387{ 2392{
2393 xfrm_proc_fini(net);
2388 snmp_mib_free((void **)net->mib.xfrm_statistics); 2394 snmp_mib_free((void **)net->mib.xfrm_statistics);
2389} 2395}
2390#else 2396#else
@@ -2524,9 +2530,6 @@ void __init xfrm_init(void)
2524{ 2530{
2525 register_pernet_subsys(&xfrm_net_ops); 2531 register_pernet_subsys(&xfrm_net_ops);
2526 xfrm_input_init(); 2532 xfrm_input_init();
2527#ifdef CONFIG_XFRM_STATISTICS
2528 xfrm_proc_init();
2529#endif
2530} 2533}
2531 2534
2532#ifdef CONFIG_AUDITSYSCALL 2535#ifdef CONFIG_AUDITSYSCALL
diff --git a/net/xfrm/xfrm_proc.c b/net/xfrm/xfrm_proc.c
index 27a2ab92d874..284eaef1dbf2 100644
--- a/net/xfrm/xfrm_proc.c
+++ b/net/xfrm/xfrm_proc.c
@@ -59,17 +59,18 @@ fold_field(void *mib[], int offt)
59 59
60static int xfrm_statistics_seq_show(struct seq_file *seq, void *v) 60static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
61{ 61{
62 struct net *net = seq->private;
62 int i; 63 int i;
63 for (i=0; xfrm_mib_list[i].name; i++) 64 for (i=0; xfrm_mib_list[i].name; i++)
64 seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name, 65 seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name,
65 fold_field((void **)init_net.mib.xfrm_statistics, 66 fold_field((void **)net->mib.xfrm_statistics,
66 xfrm_mib_list[i].entry)); 67 xfrm_mib_list[i].entry));
67 return 0; 68 return 0;
68} 69}
69 70
70static int xfrm_statistics_seq_open(struct inode *inode, struct file *file) 71static int xfrm_statistics_seq_open(struct inode *inode, struct file *file)
71{ 72{
72 return single_open(file, xfrm_statistics_seq_show, NULL); 73 return single_open_net(inode, file, xfrm_statistics_seq_show);
73} 74}
74 75
75static struct file_operations xfrm_statistics_seq_fops = { 76static struct file_operations xfrm_statistics_seq_fops = {
@@ -77,21 +78,18 @@ static struct file_operations xfrm_statistics_seq_fops = {
77 .open = xfrm_statistics_seq_open, 78 .open = xfrm_statistics_seq_open,
78 .read = seq_read, 79 .read = seq_read,
79 .llseek = seq_lseek, 80 .llseek = seq_lseek,
80 .release = single_release, 81 .release = single_release_net,
81}; 82};
82 83
83int __init xfrm_proc_init(void) 84int __net_init xfrm_proc_init(struct net *net)
84{ 85{
85 int rc = 0; 86 if (!proc_net_fops_create(net, "xfrm_stat", S_IRUGO,
86
87 if (!proc_net_fops_create(&init_net, "xfrm_stat", S_IRUGO,
88 &xfrm_statistics_seq_fops)) 87 &xfrm_statistics_seq_fops))
89 goto stat_fail; 88 return -ENOMEM;
90 89 return 0;
91 out: 90}
92 return rc;
93 91
94 stat_fail: 92void xfrm_proc_fini(struct net *net)
95 rc = -ENOMEM; 93{
96 goto out; 94 proc_net_remove(net, "xfrm_stat");
97} 95}