diff options
| author | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-25 10:40:14 -0400 |
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-25 10:40:14 -0400 |
| commit | ff877ea80efa2015b6263766f78ee42c2a1b32f9 (patch) | |
| tree | 85205005c611ab774702148558321c6fb92f1ccd /net/sysctl_net.c | |
| parent | 30821fee4f0cb3e6d241d9f7ddc37742212e3eb7 (diff) | |
| parent | d37e6bf68fc1eb34a4ad21d9ae8890ed37ea80e7 (diff) | |
Merge branch 'linux-next' of git://git.infradead.org/~dedekind/ubi-2.6
Diffstat (limited to 'net/sysctl_net.c')
| -rw-r--r-- | net/sysctl_net.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/net/sysctl_net.c b/net/sysctl_net.c index b4f0525f91af..007c1a6708ee 100644 --- a/net/sysctl_net.c +++ b/net/sysctl_net.c | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | * Begun April 1, 1996, Mike Shaver. | 4 | * Begun April 1, 1996, Mike Shaver. |
| 5 | * Added /proc/sys/net directories for each protocol family. [MS] | 5 | * Added /proc/sys/net directories for each protocol family. [MS] |
| 6 | * | 6 | * |
| 7 | * $Log: sysctl_net.c,v $ | ||
| 8 | * Revision 1.2 1996/05/08 20:24:40 shaver | 7 | * Revision 1.2 1996/05/08 20:24:40 shaver |
| 9 | * Added bits for NET_BRIDGE and the NET_IPV4_ARP stuff and | 8 | * Added bits for NET_BRIDGE and the NET_IPV4_ARP stuff and |
| 10 | * NET_IPV4_IP_FORWARD. | 9 | * NET_IPV4_IP_FORWARD. |
| @@ -40,6 +39,27 @@ static struct ctl_table_root net_sysctl_root = { | |||
| 40 | .lookup = net_ctl_header_lookup, | 39 | .lookup = net_ctl_header_lookup, |
| 41 | }; | 40 | }; |
| 42 | 41 | ||
| 42 | static LIST_HEAD(net_sysctl_ro_tables); | ||
| 43 | static struct list_head *net_ctl_ro_header_lookup(struct ctl_table_root *root, | ||
| 44 | struct nsproxy *namespaces) | ||
| 45 | { | ||
| 46 | return &net_sysctl_ro_tables; | ||
| 47 | } | ||
| 48 | |||
| 49 | static int net_ctl_ro_header_perms(struct ctl_table_root *root, | ||
| 50 | struct nsproxy *namespaces, struct ctl_table *table) | ||
| 51 | { | ||
| 52 | if (namespaces->net_ns == &init_net) | ||
| 53 | return table->mode; | ||
| 54 | else | ||
| 55 | return table->mode & ~0222; | ||
| 56 | } | ||
| 57 | |||
| 58 | static struct ctl_table_root net_sysctl_ro_root = { | ||
| 59 | .lookup = net_ctl_ro_header_lookup, | ||
| 60 | .permissions = net_ctl_ro_header_perms, | ||
| 61 | }; | ||
| 62 | |||
| 43 | static int sysctl_net_init(struct net *net) | 63 | static int sysctl_net_init(struct net *net) |
| 44 | { | 64 | { |
| 45 | INIT_LIST_HEAD(&net->sysctl_table_headers); | 65 | INIT_LIST_HEAD(&net->sysctl_table_headers); |
| @@ -64,6 +84,7 @@ static __init int sysctl_init(void) | |||
| 64 | if (ret) | 84 | if (ret) |
| 65 | goto out; | 85 | goto out; |
| 66 | register_sysctl_root(&net_sysctl_root); | 86 | register_sysctl_root(&net_sysctl_root); |
| 87 | register_sysctl_root(&net_sysctl_ro_root); | ||
| 67 | out: | 88 | out: |
| 68 | return ret; | 89 | return ret; |
| 69 | } | 90 | } |
| @@ -80,6 +101,14 @@ struct ctl_table_header *register_net_sysctl_table(struct net *net, | |||
| 80 | } | 101 | } |
| 81 | EXPORT_SYMBOL_GPL(register_net_sysctl_table); | 102 | EXPORT_SYMBOL_GPL(register_net_sysctl_table); |
| 82 | 103 | ||
| 104 | struct ctl_table_header *register_net_sysctl_rotable(const | ||
| 105 | struct ctl_path *path, struct ctl_table *table) | ||
| 106 | { | ||
| 107 | return __register_sysctl_paths(&net_sysctl_ro_root, | ||
| 108 | &init_nsproxy, path, table); | ||
| 109 | } | ||
| 110 | EXPORT_SYMBOL_GPL(register_net_sysctl_rotable); | ||
| 111 | |||
| 83 | void unregister_net_sysctl_table(struct ctl_table_header *header) | 112 | void unregister_net_sysctl_table(struct ctl_table_header *header) |
| 84 | { | 113 | { |
| 85 | unregister_sysctl_table(header); | 114 | unregister_sysctl_table(header); |
