netns xfrm: /proc/net/xfrm_stat in netns
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
59c9940ed0
Коммит
c68cd1a01b
|
@ -1306,7 +1306,8 @@ static inline void xfrm6_fini(void)
|
|||
#endif
|
||||
|
||||
#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
|
||||
|
||||
extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
|
||||
|
|
|
@ -2377,14 +2377,20 @@ static struct notifier_block xfrm_dev_notifier = {
|
|||
#ifdef CONFIG_XFRM_STATISTICS
|
||||
static int __net_init xfrm_statistics_init(struct net *net)
|
||||
{
|
||||
int rv;
|
||||
|
||||
if (snmp_mib_init((void **)net->mib.xfrm_statistics,
|
||||
sizeof(struct linux_xfrm_mib)) < 0)
|
||||
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)
|
||||
{
|
||||
xfrm_proc_fini(net);
|
||||
snmp_mib_free((void **)net->mib.xfrm_statistics);
|
||||
}
|
||||
#else
|
||||
|
@ -2524,9 +2530,6 @@ void __init xfrm_init(void)
|
|||
{
|
||||
register_pernet_subsys(&xfrm_net_ops);
|
||||
xfrm_input_init();
|
||||
#ifdef CONFIG_XFRM_STATISTICS
|
||||
xfrm_proc_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
|
|
|
@ -59,17 +59,18 @@ fold_field(void *mib[], int offt)
|
|||
|
||||
static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct net *net = seq->private;
|
||||
int i;
|
||||
for (i=0; xfrm_mib_list[i].name; i++)
|
||||
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));
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 = {
|
||||
|
@ -77,21 +78,18 @@ static struct file_operations xfrm_statistics_seq_fops = {
|
|||
.open = xfrm_statistics_seq_open,
|
||||
.read = seq_read,
|
||||
.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(&init_net, "xfrm_stat", S_IRUGO,
|
||||
if (!proc_net_fops_create(net, "xfrm_stat", S_IRUGO,
|
||||
&xfrm_statistics_seq_fops))
|
||||
goto stat_fail;
|
||||
|
||||
out:
|
||||
return rc;
|
||||
|
||||
stat_fail:
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void xfrm_proc_fini(struct net *net)
|
||||
{
|
||||
proc_net_remove(net, "xfrm_stat");
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче