diff options
Diffstat (limited to 'kernel/nsproxy.c')
-rw-r--r-- | kernel/nsproxy.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index e981c61304f1..c8ef7c2992ed 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c | |||
@@ -26,19 +26,6 @@ static struct kmem_cache *nsproxy_cachep; | |||
26 | 26 | ||
27 | struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy); | 27 | struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy); |
28 | 28 | ||
29 | static inline void get_nsproxy(struct nsproxy *ns) | ||
30 | { | ||
31 | atomic_inc(&ns->count); | ||
32 | } | ||
33 | |||
34 | void get_task_namespaces(struct task_struct *tsk) | ||
35 | { | ||
36 | struct nsproxy *ns = tsk->nsproxy; | ||
37 | if (ns) { | ||
38 | get_nsproxy(ns); | ||
39 | } | ||
40 | } | ||
41 | |||
42 | /* | 29 | /* |
43 | * creates a copy of "orig" with refcount 1. | 30 | * creates a copy of "orig" with refcount 1. |
44 | */ | 31 | */ |
@@ -216,6 +203,33 @@ out: | |||
216 | return err; | 203 | return err; |
217 | } | 204 | } |
218 | 205 | ||
206 | void switch_task_namespaces(struct task_struct *p, struct nsproxy *new) | ||
207 | { | ||
208 | struct nsproxy *ns; | ||
209 | |||
210 | might_sleep(); | ||
211 | |||
212 | ns = p->nsproxy; | ||
213 | |||
214 | rcu_assign_pointer(p->nsproxy, new); | ||
215 | |||
216 | if (ns && atomic_dec_and_test(&ns->count)) { | ||
217 | /* | ||
218 | * wait for others to get what they want from this nsproxy. | ||
219 | * | ||
220 | * cannot release this nsproxy via the call_rcu() since | ||
221 | * put_mnt_ns() will want to sleep | ||
222 | */ | ||
223 | synchronize_rcu(); | ||
224 | free_nsproxy(ns); | ||
225 | } | ||
226 | } | ||
227 | |||
228 | void exit_task_namespaces(struct task_struct *p) | ||
229 | { | ||
230 | switch_task_namespaces(p, NULL); | ||
231 | } | ||
232 | |||
219 | static int __init nsproxy_cache_init(void) | 233 | static int __init nsproxy_cache_init(void) |
220 | { | 234 | { |
221 | nsproxy_cachep = KMEM_CACHE(nsproxy, SLAB_PANIC); | 235 | nsproxy_cachep = KMEM_CACHE(nsproxy, SLAB_PANIC); |