aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorSerge E. Hallyn <serue@us.ibm.com>2006-10-02 05:18:14 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-02 10:57:21 -0400
commit4865ecf1315b450ab3317a745a6678c04d311e40 (patch)
tree6cf5d3028f8642eba2a8094eb413db080cc9219c /kernel
parent96b644bdec977b97a45133e5b4466ba47a7a5e65 (diff)
[PATCH] namespaces: utsname: implement utsname namespaces
This patch defines the uts namespace and some manipulators. Adds the uts namespace to task_struct, and initializes a system-wide init namespace. It leaves a #define for system_utsname so sysctl will compile. This define will be removed in a separate patch. [akpm@osdl.org: build fix, cleanup] Signed-off-by: Serge Hallyn <serue@us.ibm.com> Cc: Kirill Korotaev <dev@openvz.org> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Herbert Poetzl <herbert@13thfloor.at> Cc: Andrey Savochkin <saw@sw.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/nsproxy.c14
-rw-r--r--kernel/utsname.c42
3 files changed, 57 insertions, 0 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 6ec53009b866..d948ca12acf0 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -48,6 +48,7 @@ obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
48obj-$(CONFIG_SECCOMP) += seccomp.o 48obj-$(CONFIG_SECCOMP) += seccomp.o
49obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o 49obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o
50obj-$(CONFIG_RELAY) += relay.o 50obj-$(CONFIG_RELAY) += relay.o
51obj-$(CONFIG_UTS_NS) += utsname.o
51obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o 52obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
52obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o 53obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
53 54
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c
index e10385c17f73..47c19280c55b 100644
--- a/kernel/nsproxy.c
+++ b/kernel/nsproxy.c
@@ -14,6 +14,7 @@
14#include <linux/nsproxy.h> 14#include <linux/nsproxy.h>
15#include <linux/init_task.h> 15#include <linux/init_task.h>
16#include <linux/namespace.h> 16#include <linux/namespace.h>
17#include <linux/utsname.h>
17 18
18struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy); 19struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy);
19 20
@@ -59,6 +60,8 @@ struct nsproxy *dup_namespaces(struct nsproxy *orig)
59 if (ns) { 60 if (ns) {
60 if (ns->namespace) 61 if (ns->namespace)
61 get_namespace(ns->namespace); 62 get_namespace(ns->namespace);
63 if (ns->uts_ns)
64 get_uts_ns(ns->uts_ns);
62 } 65 }
63 66
64 return ns; 67 return ns;
@@ -97,6 +100,15 @@ int copy_namespaces(int flags, struct task_struct *tsk)
97 goto out; 100 goto out;
98 } 101 }
99 102
103 err = copy_utsname(flags, tsk);
104 if (err) {
105 if (new_ns->namespace)
106 put_namespace(new_ns->namespace);
107 tsk->nsproxy = old_ns;
108 put_nsproxy(new_ns);
109 goto out;
110 }
111
100out: 112out:
101 put_nsproxy(old_ns); 113 put_nsproxy(old_ns);
102 return err; 114 return err;
@@ -106,5 +118,7 @@ void free_nsproxy(struct nsproxy *ns)
106{ 118{
107 if (ns->namespace) 119 if (ns->namespace)
108 put_namespace(ns->namespace); 120 put_namespace(ns->namespace);
121 if (ns->uts_ns)
122 put_uts_ns(ns->uts_ns);
109 kfree(ns); 123 kfree(ns);
110} 124}
diff --git a/kernel/utsname.c b/kernel/utsname.c
new file mode 100644
index 000000000000..1824384ecfa3
--- /dev/null
+++ b/kernel/utsname.c
@@ -0,0 +1,42 @@
1/*
2 * Copyright (C) 2004 IBM Corporation
3 *
4 * Author: Serge Hallyn <serue@us.ibm.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2 of the
9 * License.
10 */
11
12#include <linux/module.h>
13#include <linux/uts.h>
14#include <linux/utsname.h>
15#include <linux/version.h>
16
17/*
18 * Copy task tsk's utsname namespace, or clone it if flags
19 * specifies CLONE_NEWUTS. In latter case, changes to the
20 * utsname of this process won't be seen by parent, and vice
21 * versa.
22 */
23int copy_utsname(int flags, struct task_struct *tsk)
24{
25 struct uts_namespace *old_ns = tsk->nsproxy->uts_ns;
26 int err = 0;
27
28 if (!old_ns)
29 return 0;
30
31 get_uts_ns(old_ns);
32
33 return err;
34}
35
36void free_uts_ns(struct kref *kref)
37{
38 struct uts_namespace *ns;
39
40 ns = container_of(kref, struct uts_namespace, kref);
41 kfree(ns);
42}