diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/nsproxy.h | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index 0b9f0dc30d61..678e1d38effb 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h | |||
@@ -35,22 +35,30 @@ struct nsproxy *dup_namespaces(struct nsproxy *orig); | |||
35 | int copy_namespaces(int flags, struct task_struct *tsk); | 35 | int copy_namespaces(int flags, struct task_struct *tsk); |
36 | void get_task_namespaces(struct task_struct *tsk); | 36 | void get_task_namespaces(struct task_struct *tsk); |
37 | void free_nsproxy(struct nsproxy *ns); | 37 | void free_nsproxy(struct nsproxy *ns); |
38 | struct nsproxy *put_nsproxy(struct nsproxy *ns); | ||
38 | 39 | ||
39 | static inline void put_nsproxy(struct nsproxy *ns) | 40 | static inline void finalize_put_nsproxy(struct nsproxy *ns) |
40 | { | 41 | { |
41 | if (atomic_dec_and_test(&ns->count)) { | 42 | if (ns) |
42 | free_nsproxy(ns); | 43 | free_nsproxy(ns); |
43 | } | ||
44 | } | 44 | } |
45 | 45 | ||
46 | static inline void exit_task_namespaces(struct task_struct *p) | 46 | static inline void put_and_finalize_nsproxy(struct nsproxy *ns) |
47 | { | 47 | { |
48 | struct nsproxy *ns = p->nsproxy; | 48 | finalize_put_nsproxy(put_nsproxy(ns)); |
49 | if (ns) { | 49 | } |
50 | task_lock(p); | 50 | |
51 | p->nsproxy = NULL; | 51 | static inline struct nsproxy *preexit_task_namespaces(struct task_struct *p) |
52 | task_unlock(p); | 52 | { |
53 | put_nsproxy(ns); | 53 | return put_nsproxy(p->nsproxy); |
54 | } | 54 | } |
55 | |||
56 | static inline void exit_task_namespaces(struct task_struct *p, | ||
57 | struct nsproxy *ns) | ||
58 | { | ||
59 | task_lock(p); | ||
60 | p->nsproxy = NULL; | ||
61 | task_unlock(p); | ||
62 | finalize_put_nsproxy(ns); | ||
55 | } | 63 | } |
56 | #endif | 64 | #endif |