[patch 1/2][NETNS49][IPV4][IGMP] make igmp proc per namespace
Daniel Lezcano
dlezcano at fr.ibm.com
Fri Oct 12 10:10:14 PDT 2007
This patch makes the proc files: "igmp" and "mcfilter" per namespace.
Signed-off-by: Daniel Lezcano <dlezcano at fr.ibm.com>
---
net/ipv4/igmp.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 60 insertions(+), 8 deletions(-)
Index: linux-2.6-netns/net/ipv4/igmp.c
===================================================================
--- linux-2.6-netns.orig/net/ipv4/igmp.c
+++ linux-2.6-netns/net/ipv4/igmp.c
@@ -2291,6 +2291,7 @@ int ip_check_mc(struct in_device *in_dev
struct igmp_mc_iter_state {
struct net_device *dev;
struct in_device *in_dev;
+ struct net *net;
};
#define igmp_mc_seq_private(seq) ((struct igmp_mc_iter_state *)(seq)->private)
@@ -2299,9 +2300,10 @@ static inline struct ip_mc_list *igmp_mc
{
struct ip_mc_list *im = NULL;
struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
+ struct net *net = state->net;
state->in_dev = NULL;
- for_each_netdev(&init_net, state->dev) {
+ for_each_netdev(net, state->dev) {
struct in_device *in_dev;
in_dev = in_dev_get(state->dev);
if (!in_dev)
@@ -2426,31 +2428,47 @@ static int igmp_mc_seq_open(struct inode
if (!s)
goto out;
+
+ s->net = get_proc_net(inode);
+ if (!s->net)
+ goto out_kfree;
+
rc = seq_open(file, &igmp_mc_seq_ops);
if (rc)
- goto out_kfree;
+ goto out_put_net;
seq = file->private_data;
seq->private = s;
out:
return rc;
+out_put_net:
+ put_net(s->net);
out_kfree:
kfree(s);
goto out;
}
+static int igmp_mc_seq_release(struct inode *inode, struct file *file)
+{
+ struct seq_file *seq = file->private_data;
+ struct igmp_mc_iter_state *state = seq->private;
+ put_net(state->net);
+ return seq_release_private(inode, file);
+}
+
static const struct file_operations igmp_mc_seq_fops = {
.owner = THIS_MODULE,
.open = igmp_mc_seq_open,
.read = seq_read,
.llseek = seq_lseek,
- .release = seq_release_private,
+ .release = igmp_mc_seq_release,
};
struct igmp_mcf_iter_state {
struct net_device *dev;
struct in_device *idev;
struct ip_mc_list *im;
+ struct net *net;
};
#define igmp_mcf_seq_private(seq) ((struct igmp_mcf_iter_state *)(seq)->private)
@@ -2460,10 +2478,11 @@ static inline struct ip_sf_list *igmp_mc
struct ip_sf_list *psf = NULL;
struct ip_mc_list *im = NULL;
struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
+ struct net *net = state->net;
state->idev = NULL;
state->im = NULL;
- for_each_netdev(&init_net, state->dev) {
+ for_each_netdev(net, state->dev) {
struct in_device *idev;
idev = in_dev_get(state->dev);
if (unlikely(idev == NULL))
@@ -2600,31 +2619,64 @@ static int igmp_mcf_seq_open(struct inod
if (!s)
goto out;
+
+ s->net = get_proc_net(inode);
+ if (!s->net)
+ goto out_kfree;
+
rc = seq_open(file, &igmp_mcf_seq_ops);
if (rc)
- goto out_kfree;
+ goto out_put_net;
seq = file->private_data;
seq->private = s;
out:
return rc;
+out_put_net:
+ put_net(s->net);
out_kfree:
kfree(s);
goto out;
}
+static int igmp_mcf_seq_release(struct inode *inode, struct file *file)
+{
+ struct seq_file *seq = file->private_data;
+ struct igmp_mcf_iter_state *state = seq->private;
+ put_net(state->net);
+ return seq_release_private(inode, file);
+
+}
+
static const struct file_operations igmp_mcf_seq_fops = {
.owner = THIS_MODULE,
.open = igmp_mcf_seq_open,
.read = seq_read,
.llseek = seq_lseek,
- .release = seq_release_private,
+ .release = igmp_mcf_seq_release,
+};
+
+static int igmp_mc_net_init(struct net *net)
+{
+ proc_net_fops_create(net, "igmp", S_IRUGO, &igmp_mc_seq_fops);
+ proc_net_fops_create(net, "mcfilter", S_IRUGO, &igmp_mcf_seq_fops);
+ return 0;
+}
+
+static void igmp_mc_net_exit(struct net *net)
+{
+ proc_net_remove(net, "igmp");
+ proc_net_remove(net, "mcfilter");
+}
+
+struct pernet_operations igmp_mc_net_ops = {
+ .init = igmp_mc_net_init,
+ .exit = igmp_mc_net_exit,
};
int __init igmp_mc_proc_init(void)
{
- proc_net_fops_create(&init_net, "igmp", S_IRUGO, &igmp_mc_seq_fops);
- proc_net_fops_create(&init_net, "mcfilter", S_IRUGO, &igmp_mcf_seq_fops);
+ register_pernet_subsys(&igmp_mc_net_ops);
return 0;
}
#endif
--
More information about the Containers
mailing list