diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2007-09-12 06:01:34 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:49:06 -0400 |
commit | 457c4cbc5a3dde259d2a1f15d5f9785290397267 (patch) | |
tree | a2ceee88780cbce27433b9a4434b3e9251efd81a /net/core | |
parent | 07feaebfcc10cd35e745c7073667935246494bee (diff) |
[NET]: Make /proc/net per network namespace
This patch makes /proc/net per network namespace. It modifies the global
variables proc_net and proc_net_stat to be per network namespace.
The proc_net file helpers are modified to take a network namespace argument,
and all of their callers are fixed to pass &init_net for that argument.
This ensures that all of the /proc/net files are only visible and
usable in the initial network namespace until the code behind them
has been updated to be handle multiple network namespaces.
Making /proc/net per namespace is necessary as at least some files
in /proc/net depend upon the set of network devices which is per
network namespace, and even more files in /proc/net have contents
that are relevant to a single network namespace.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 19 | ||||
-rw-r--r-- | net/core/dev_mcast.c | 3 | ||||
-rw-r--r-- | net/core/neighbour.c | 3 | ||||
-rw-r--r-- | net/core/pktgen.c | 9 | ||||
-rw-r--r-- | net/core/sock.c | 3 |
5 files changed, 21 insertions, 16 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 29cf00c5d865..618fb1c1dd47 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -92,6 +92,7 @@ | |||
92 | #include <linux/etherdevice.h> | 92 | #include <linux/etherdevice.h> |
93 | #include <linux/notifier.h> | 93 | #include <linux/notifier.h> |
94 | #include <linux/skbuff.h> | 94 | #include <linux/skbuff.h> |
95 | #include <net/net_namespace.h> | ||
95 | #include <net/sock.h> | 96 | #include <net/sock.h> |
96 | #include <linux/rtnetlink.h> | 97 | #include <linux/rtnetlink.h> |
97 | #include <linux/proc_fs.h> | 98 | #include <linux/proc_fs.h> |
@@ -2556,24 +2557,24 @@ static int __init dev_proc_init(void) | |||
2556 | { | 2557 | { |
2557 | int rc = -ENOMEM; | 2558 | int rc = -ENOMEM; |
2558 | 2559 | ||
2559 | if (!proc_net_fops_create("dev", S_IRUGO, &dev_seq_fops)) | 2560 | if (!proc_net_fops_create(&init_net, "dev", S_IRUGO, &dev_seq_fops)) |
2560 | goto out; | 2561 | goto out; |
2561 | if (!proc_net_fops_create("softnet_stat", S_IRUGO, &softnet_seq_fops)) | 2562 | if (!proc_net_fops_create(&init_net, "softnet_stat", S_IRUGO, &softnet_seq_fops)) |
2562 | goto out_dev; | 2563 | goto out_dev; |
2563 | if (!proc_net_fops_create("ptype", S_IRUGO, &ptype_seq_fops)) | 2564 | if (!proc_net_fops_create(&init_net, "ptype", S_IRUGO, &ptype_seq_fops)) |
2564 | goto out_dev2; | 2565 | goto out_softnet; |
2565 | 2566 | ||
2566 | if (wext_proc_init()) | 2567 | if (wext_proc_init()) |
2567 | goto out_softnet; | 2568 | goto out_ptype; |
2568 | rc = 0; | 2569 | rc = 0; |
2569 | out: | 2570 | out: |
2570 | return rc; | 2571 | return rc; |
2572 | out_ptype: | ||
2573 | proc_net_remove(&init_net, "ptype"); | ||
2571 | out_softnet: | 2574 | out_softnet: |
2572 | proc_net_remove("ptype"); | 2575 | proc_net_remove(&init_net, "softnet_stat"); |
2573 | out_dev2: | ||
2574 | proc_net_remove("softnet_stat"); | ||
2575 | out_dev: | 2576 | out_dev: |
2576 | proc_net_remove("dev"); | 2577 | proc_net_remove(&init_net, "dev"); |
2577 | goto out; | 2578 | goto out; |
2578 | } | 2579 | } |
2579 | #else | 2580 | #else |
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index 20330c572610..8e069fc207cb 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/proc_fs.h> | 41 | #include <linux/proc_fs.h> |
42 | #include <linux/seq_file.h> | 42 | #include <linux/seq_file.h> |
43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
44 | #include <net/net_namespace.h> | ||
44 | #include <net/ip.h> | 45 | #include <net/ip.h> |
45 | #include <net/route.h> | 46 | #include <net/route.h> |
46 | #include <linux/skbuff.h> | 47 | #include <linux/skbuff.h> |
@@ -254,7 +255,7 @@ static const struct file_operations dev_mc_seq_fops = { | |||
254 | 255 | ||
255 | void __init dev_mcast_init(void) | 256 | void __init dev_mcast_init(void) |
256 | { | 257 | { |
257 | proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops); | 258 | proc_net_fops_create(&init_net, "dev_mcast", 0, &dev_mc_seq_fops); |
258 | } | 259 | } |
259 | 260 | ||
260 | EXPORT_SYMBOL(dev_mc_add); | 261 | EXPORT_SYMBOL(dev_mc_add); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index ecd43c4a2221..5f25f4f79b8c 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/sysctl.h> | 25 | #include <linux/sysctl.h> |
26 | #endif | 26 | #endif |
27 | #include <linux/times.h> | 27 | #include <linux/times.h> |
28 | #include <net/net_namespace.h> | ||
28 | #include <net/neighbour.h> | 29 | #include <net/neighbour.h> |
29 | #include <net/dst.h> | 30 | #include <net/dst.h> |
30 | #include <net/sock.h> | 31 | #include <net/sock.h> |
@@ -1350,7 +1351,7 @@ void neigh_table_init_no_netlink(struct neigh_table *tbl) | |||
1350 | panic("cannot create neighbour cache statistics"); | 1351 | panic("cannot create neighbour cache statistics"); |
1351 | 1352 | ||
1352 | #ifdef CONFIG_PROC_FS | 1353 | #ifdef CONFIG_PROC_FS |
1353 | tbl->pde = create_proc_entry(tbl->id, 0, proc_net_stat); | 1354 | tbl->pde = create_proc_entry(tbl->id, 0, init_net.proc_net_stat); |
1354 | if (!tbl->pde) | 1355 | if (!tbl->pde) |
1355 | panic("cannot create neighbour proc dir entry"); | 1356 | panic("cannot create neighbour proc dir entry"); |
1356 | tbl->pde->proc_fops = &neigh_stat_seq_fops; | 1357 | tbl->pde->proc_fops = &neigh_stat_seq_fops; |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 84c0edeedf6d..33d7247fb19d 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -152,6 +152,7 @@ | |||
152 | #include <linux/wait.h> | 152 | #include <linux/wait.h> |
153 | #include <linux/etherdevice.h> | 153 | #include <linux/etherdevice.h> |
154 | #include <linux/kthread.h> | 154 | #include <linux/kthread.h> |
155 | #include <net/net_namespace.h> | ||
155 | #include <net/checksum.h> | 156 | #include <net/checksum.h> |
156 | #include <net/ipv6.h> | 157 | #include <net/ipv6.h> |
157 | #include <net/addrconf.h> | 158 | #include <net/addrconf.h> |
@@ -3808,7 +3809,7 @@ static int __init pg_init(void) | |||
3808 | 3809 | ||
3809 | printk(KERN_INFO "%s", version); | 3810 | printk(KERN_INFO "%s", version); |
3810 | 3811 | ||
3811 | pg_proc_dir = proc_mkdir(PG_PROC_DIR, proc_net); | 3812 | pg_proc_dir = proc_mkdir(PG_PROC_DIR, init_net.proc_net); |
3812 | if (!pg_proc_dir) | 3813 | if (!pg_proc_dir) |
3813 | return -ENODEV; | 3814 | return -ENODEV; |
3814 | pg_proc_dir->owner = THIS_MODULE; | 3815 | pg_proc_dir->owner = THIS_MODULE; |
@@ -3817,7 +3818,7 @@ static int __init pg_init(void) | |||
3817 | if (pe == NULL) { | 3818 | if (pe == NULL) { |
3818 | printk(KERN_ERR "pktgen: ERROR: cannot create %s " | 3819 | printk(KERN_ERR "pktgen: ERROR: cannot create %s " |
3819 | "procfs entry.\n", PGCTRL); | 3820 | "procfs entry.\n", PGCTRL); |
3820 | proc_net_remove(PG_PROC_DIR); | 3821 | proc_net_remove(&init_net, PG_PROC_DIR); |
3821 | return -EINVAL; | 3822 | return -EINVAL; |
3822 | } | 3823 | } |
3823 | 3824 | ||
@@ -3841,7 +3842,7 @@ static int __init pg_init(void) | |||
3841 | "all threads\n"); | 3842 | "all threads\n"); |
3842 | unregister_netdevice_notifier(&pktgen_notifier_block); | 3843 | unregister_netdevice_notifier(&pktgen_notifier_block); |
3843 | remove_proc_entry(PGCTRL, pg_proc_dir); | 3844 | remove_proc_entry(PGCTRL, pg_proc_dir); |
3844 | proc_net_remove(PG_PROC_DIR); | 3845 | proc_net_remove(&init_net, PG_PROC_DIR); |
3845 | return -ENODEV; | 3846 | return -ENODEV; |
3846 | } | 3847 | } |
3847 | 3848 | ||
@@ -3868,7 +3869,7 @@ static void __exit pg_cleanup(void) | |||
3868 | 3869 | ||
3869 | /* Clean up proc file system */ | 3870 | /* Clean up proc file system */ |
3870 | remove_proc_entry(PGCTRL, pg_proc_dir); | 3871 | remove_proc_entry(PGCTRL, pg_proc_dir); |
3871 | proc_net_remove(PG_PROC_DIR); | 3872 | proc_net_remove(&init_net, PG_PROC_DIR); |
3872 | } | 3873 | } |
3873 | 3874 | ||
3874 | module_init(pg_init); | 3875 | module_init(pg_init); |
diff --git a/net/core/sock.c b/net/core/sock.c index beb924c248e8..bbc726a49d87 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -119,6 +119,7 @@ | |||
119 | #include <linux/netdevice.h> | 119 | #include <linux/netdevice.h> |
120 | #include <net/protocol.h> | 120 | #include <net/protocol.h> |
121 | #include <linux/skbuff.h> | 121 | #include <linux/skbuff.h> |
122 | #include <net/net_namespace.h> | ||
122 | #include <net/request_sock.h> | 123 | #include <net/request_sock.h> |
123 | #include <net/sock.h> | 124 | #include <net/sock.h> |
124 | #include <net/xfrm.h> | 125 | #include <net/xfrm.h> |
@@ -1973,7 +1974,7 @@ static const struct file_operations proto_seq_fops = { | |||
1973 | static int __init proto_init(void) | 1974 | static int __init proto_init(void) |
1974 | { | 1975 | { |
1975 | /* register /proc/net/protocols */ | 1976 | /* register /proc/net/protocols */ |
1976 | return proc_net_fops_create("protocols", S_IRUGO, &proto_seq_fops) == NULL ? -ENOBUFS : 0; | 1977 | return proc_net_fops_create(&init_net, "protocols", S_IRUGO, &proto_seq_fops) == NULL ? -ENOBUFS : 0; |
1977 | } | 1978 | } |
1978 | 1979 | ||
1979 | subsys_initcall(proto_init); | 1980 | subsys_initcall(proto_init); |