diff options
author | Kirill Korotaev <dev@openvz.org> | 2006-10-02 05:18:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:22 -0400 |
commit | 25b21cb2f6d69b0475b134e0a3e8e269137270fa (patch) | |
tree | cd9c3966408c0ca5903249437c35ff35961de544 /include | |
parent | c0b2fc316599d6cd875b6b8cafa67f03b9512b4d (diff) |
[PATCH] IPC namespace core
This patch set allows to unshare IPCs and have a private set of IPC objects
(sem, shm, msg) inside namespace. Basically, it is another building block of
containers functionality.
This patch implements core IPC namespace changes:
- ipc_namespace structure
- new config option CONFIG_IPC_NS
- adds CLONE_NEWIPC flag
- unshare support
[clg@fr.ibm.com: small fix for unshare of ipc namespace]
[akpm@osdl.org: build fix]
Signed-off-by: Pavel Emelianov <xemul@openvz.org>
Signed-off-by: Kirill Korotaev <dev@openvz.org>
Signed-off-by: Cedric Le Goater <clg@fr.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/init_task.h | 1 | ||||
-rw-r--r-- | include/linux/ipc.h | 36 | ||||
-rw-r--r-- | include/linux/nsproxy.h | 2 | ||||
-rw-r--r-- | include/linux/sched.h | 1 |
4 files changed, 40 insertions, 0 deletions
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index e08531ec32f0..ceecf69dfa39 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -74,6 +74,7 @@ extern struct nsproxy init_nsproxy; | |||
74 | .count = ATOMIC_INIT(1), \ | 74 | .count = ATOMIC_INIT(1), \ |
75 | .nslock = SPIN_LOCK_UNLOCKED, \ | 75 | .nslock = SPIN_LOCK_UNLOCKED, \ |
76 | .uts_ns = &init_uts_ns, \ | 76 | .uts_ns = &init_uts_ns, \ |
77 | .ipc_ns = &init_ipc_ns, \ | ||
77 | .namespace = NULL, \ | 78 | .namespace = NULL, \ |
78 | } | 79 | } |
79 | 80 | ||
diff --git a/include/linux/ipc.h b/include/linux/ipc.h index b291189737e7..36027b10f283 100644 --- a/include/linux/ipc.h +++ b/include/linux/ipc.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _LINUX_IPC_H | 2 | #define _LINUX_IPC_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <linux/kref.h> | ||
5 | 6 | ||
6 | #define IPC_PRIVATE ((__kernel_key_t) 0) | 7 | #define IPC_PRIVATE ((__kernel_key_t) 0) |
7 | 8 | ||
@@ -68,6 +69,41 @@ struct kern_ipc_perm | |||
68 | void *security; | 69 | void *security; |
69 | }; | 70 | }; |
70 | 71 | ||
72 | struct ipc_ids; | ||
73 | struct ipc_namespace { | ||
74 | struct kref kref; | ||
75 | struct ipc_ids *ids[3]; | ||
76 | |||
77 | int sem_ctls[4]; | ||
78 | int used_sems; | ||
79 | |||
80 | int msg_ctlmax; | ||
81 | int msg_ctlmnb; | ||
82 | int msg_ctlmni; | ||
83 | |||
84 | size_t shm_ctlmax; | ||
85 | size_t shm_ctlall; | ||
86 | int shm_ctlmni; | ||
87 | int shm_tot; | ||
88 | }; | ||
89 | |||
90 | extern struct ipc_namespace init_ipc_ns; | ||
91 | extern void free_ipc_ns(struct kref *kref); | ||
92 | extern int copy_ipcs(unsigned long flags, struct task_struct *tsk); | ||
93 | extern int unshare_ipcs(unsigned long flags, struct ipc_namespace **ns); | ||
94 | |||
95 | static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) | ||
96 | { | ||
97 | if (ns) | ||
98 | kref_get(&ns->kref); | ||
99 | return ns; | ||
100 | } | ||
101 | |||
102 | static inline void put_ipc_ns(struct ipc_namespace *ns) | ||
103 | { | ||
104 | kref_put(&ns->kref, free_ipc_ns); | ||
105 | } | ||
106 | |||
71 | #endif /* __KERNEL__ */ | 107 | #endif /* __KERNEL__ */ |
72 | 108 | ||
73 | #endif /* _LINUX_IPC_H */ | 109 | #endif /* _LINUX_IPC_H */ |
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index 9c2e0ad508db..f6baecdeecd6 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | struct namespace; | 7 | struct namespace; |
8 | struct uts_namespace; | 8 | struct uts_namespace; |
9 | struct ipc_namespace; | ||
9 | 10 | ||
10 | /* | 11 | /* |
11 | * A structure to contain pointers to all per-process | 12 | * A structure to contain pointers to all per-process |
@@ -23,6 +24,7 @@ struct nsproxy { | |||
23 | atomic_t count; | 24 | atomic_t count; |
24 | spinlock_t nslock; | 25 | spinlock_t nslock; |
25 | struct uts_namespace *uts_ns; | 26 | struct uts_namespace *uts_ns; |
27 | struct ipc_namespace *ipc_ns; | ||
26 | struct namespace *namespace; | 28 | struct namespace *namespace; |
27 | }; | 29 | }; |
28 | extern struct nsproxy init_nsproxy; | 30 | extern struct nsproxy init_nsproxy; |
diff --git a/include/linux/sched.h b/include/linux/sched.h index a973e7012315..9ba959e34266 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */ | 25 | #define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */ |
26 | #define CLONE_STOPPED 0x02000000 /* Start in stopped state */ | 26 | #define CLONE_STOPPED 0x02000000 /* Start in stopped state */ |
27 | #define CLONE_NEWUTS 0x04000000 /* New utsname group? */ | 27 | #define CLONE_NEWUTS 0x04000000 /* New utsname group? */ |
28 | #define CLONE_NEWIPC 0x08000000 /* New ipcs */ | ||
28 | 29 | ||
29 | /* | 30 | /* |
30 | * Scheduling policies | 31 | * Scheduling policies |