提交 c68cd1a0 编写于 作者: A Alexey Dobriyan 提交者: David S. Miller

netns xfrm: /proc/net/xfrm_stat in netns

Signed-off-by: NAlexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 59c9940e
...@@ -1306,7 +1306,8 @@ static inline void xfrm6_fini(void) ...@@ -1306,7 +1306,8 @@ static inline void xfrm6_fini(void)
#endif #endif
#ifdef CONFIG_XFRM_STATISTICS #ifdef CONFIG_XFRM_STATISTICS
extern int xfrm_proc_init(void); extern int xfrm_proc_init(struct net *net);
extern void xfrm_proc_fini(struct net *net);
#endif #endif
extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto); extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
......
...@@ -2377,14 +2377,20 @@ static struct notifier_block xfrm_dev_notifier = { ...@@ -2377,14 +2377,20 @@ static struct notifier_block xfrm_dev_notifier = {
#ifdef CONFIG_XFRM_STATISTICS #ifdef CONFIG_XFRM_STATISTICS
static int __net_init xfrm_statistics_init(struct net *net) static int __net_init xfrm_statistics_init(struct net *net)
{ {
int rv;
if (snmp_mib_init((void **)net->mib.xfrm_statistics, if (snmp_mib_init((void **)net->mib.xfrm_statistics,
sizeof(struct linux_xfrm_mib)) < 0) sizeof(struct linux_xfrm_mib)) < 0)
return -ENOMEM; return -ENOMEM;
return 0; rv = xfrm_proc_init(net);
if (rv < 0)
snmp_mib_free((void **)net->mib.xfrm_statistics);
return rv;
} }
static void xfrm_statistics_fini(struct net *net) static void xfrm_statistics_fini(struct net *net)
{ {
xfrm_proc_fini(net);
snmp_mib_free((void **)net->mib.xfrm_statistics); snmp_mib_free((void **)net->mib.xfrm_statistics);
} }
#else #else
...@@ -2524,9 +2530,6 @@ void __init xfrm_init(void) ...@@ -2524,9 +2530,6 @@ void __init xfrm_init(void)
{ {
register_pernet_subsys(&xfrm_net_ops); register_pernet_subsys(&xfrm_net_ops);
xfrm_input_init(); xfrm_input_init();
#ifdef CONFIG_XFRM_STATISTICS
xfrm_proc_init();
#endif
} }
#ifdef CONFIG_AUDITSYSCALL #ifdef CONFIG_AUDITSYSCALL
......
...@@ -59,17 +59,18 @@ fold_field(void *mib[], int offt) ...@@ -59,17 +59,18 @@ fold_field(void *mib[], int offt)
static int xfrm_statistics_seq_show(struct seq_file *seq, void *v) static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
{ {
struct net *net = seq->private;
int i; int i;
for (i=0; xfrm_mib_list[i].name; i++) for (i=0; xfrm_mib_list[i].name; i++)
seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name, seq_printf(seq, "%-24s\t%lu\n", xfrm_mib_list[i].name,
fold_field((void **)init_net.mib.xfrm_statistics, fold_field((void **)net->mib.xfrm_statistics,
xfrm_mib_list[i].entry)); xfrm_mib_list[i].entry));
return 0; return 0;
} }
static int xfrm_statistics_seq_open(struct inode *inode, struct file *file) static int xfrm_statistics_seq_open(struct inode *inode, struct file *file)
{ {
return single_open(file, xfrm_statistics_seq_show, NULL); return single_open_net(inode, file, xfrm_statistics_seq_show);
} }
static struct file_operations xfrm_statistics_seq_fops = { static struct file_operations xfrm_statistics_seq_fops = {
...@@ -77,21 +78,18 @@ static struct file_operations xfrm_statistics_seq_fops = { ...@@ -77,21 +78,18 @@ static struct file_operations xfrm_statistics_seq_fops = {
.open = xfrm_statistics_seq_open, .open = xfrm_statistics_seq_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = single_release, .release = single_release_net,
}; };
int __init xfrm_proc_init(void) int __net_init xfrm_proc_init(struct net *net)
{ {
int rc = 0; if (!proc_net_fops_create(net, "xfrm_stat", S_IRUGO,
if (!proc_net_fops_create(&init_net, "xfrm_stat", S_IRUGO,
&xfrm_statistics_seq_fops)) &xfrm_statistics_seq_fops))
goto stat_fail; return -ENOMEM;
return 0;
out: }
return rc;
stat_fail: void xfrm_proc_fini(struct net *net)
rc = -ENOMEM; {
goto out; proc_net_remove(net, "xfrm_stat");
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册