diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2010-03-07 21:14:23 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2011-05-10 17:34:26 -0400 |
commit | 13b6f57623bc485e116344fe91fbcb29f149242b (patch) | |
tree | f2d43576e248ac61b967734a6ccd313b971fb430 | |
parent | 0663c6f8fa37d777ede74ff991a0cba3a42fcbd7 (diff) |
ns proc: Add support for the network namespace.
Implementing file descriptors for the network namespace
is simple and straight forward.
Acked-by: David S. Miller <davem@davemloft.net>
Acked-by: Daniel Lezcano <daniel.lezcano@free.fr>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
-rw-r--r-- | fs/proc/namespaces.c | 3 | ||||
-rw-r--r-- | include/linux/proc_fs.h | 1 | ||||
-rw-r--r-- | net/core/net_namespace.c | 31 |
3 files changed, 35 insertions, 0 deletions
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index 6ae9f07d59ee..dcbd483e9915 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c | |||
@@ -16,6 +16,9 @@ | |||
16 | 16 | ||
17 | 17 | ||
18 | static const struct proc_ns_operations *ns_entries[] = { | 18 | static const struct proc_ns_operations *ns_entries[] = { |
19 | #ifdef CONFIG_NET_NS | ||
20 | &netns_operations, | ||
21 | #endif | ||
19 | }; | 22 | }; |
20 | 23 | ||
21 | static const struct file_operations ns_file_operations = { | 24 | static const struct file_operations ns_file_operations = { |
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index a6d2c6da5e5a..62126ec6ede9 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
@@ -265,6 +265,7 @@ struct proc_ns_operations { | |||
265 | void (*put)(void *ns); | 265 | void (*put)(void *ns); |
266 | int (*install)(struct nsproxy *nsproxy, void *ns); | 266 | int (*install)(struct nsproxy *nsproxy, void *ns); |
267 | }; | 267 | }; |
268 | extern const struct proc_ns_operations netns_operations; | ||
268 | 269 | ||
269 | union proc_op { | 270 | union proc_op { |
270 | int (*proc_get_link)(struct inode *, struct path *); | 271 | int (*proc_get_link)(struct inode *, struct path *); |
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 3f860261c5ee..bf7707e09a80 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
@@ -573,3 +573,34 @@ void unregister_pernet_device(struct pernet_operations *ops) | |||
573 | mutex_unlock(&net_mutex); | 573 | mutex_unlock(&net_mutex); |
574 | } | 574 | } |
575 | EXPORT_SYMBOL_GPL(unregister_pernet_device); | 575 | EXPORT_SYMBOL_GPL(unregister_pernet_device); |
576 | |||
577 | #ifdef CONFIG_NET_NS | ||
578 | static void *netns_get(struct task_struct *task) | ||
579 | { | ||
580 | struct net *net; | ||
581 | rcu_read_lock(); | ||
582 | net = get_net(task->nsproxy->net_ns); | ||
583 | rcu_read_unlock(); | ||
584 | return net; | ||
585 | } | ||
586 | |||
587 | static void netns_put(void *ns) | ||
588 | { | ||
589 | put_net(ns); | ||
590 | } | ||
591 | |||
592 | static int netns_install(struct nsproxy *nsproxy, void *ns) | ||
593 | { | ||
594 | put_net(nsproxy->net_ns); | ||
595 | nsproxy->net_ns = get_net(ns); | ||
596 | return 0; | ||
597 | } | ||
598 | |||
599 | const struct proc_ns_operations netns_operations = { | ||
600 | .name = "net", | ||
601 | .type = CLONE_NEWNET, | ||
602 | .get = netns_get, | ||
603 | .put = netns_put, | ||
604 | .install = netns_install, | ||
605 | }; | ||
606 | #endif | ||