diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-01-30 16:35:18 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-01-30 16:35:18 -0500 |
| commit | 444f378b237a0f728f5c4aba752c08d13c209344 (patch) | |
| tree | 248fd00bb2e60cb0890fce38b6a66fed65f977e4 /include | |
| parent | 8c8c4bafc3a20a6fb9078315ff865bc42276f9ba (diff) | |
Revert "[PATCH] namespaces: fix exit race by splitting exit"
This reverts commit 7a238fcba0629b6f2edbcd37458bae56fcf36be5 in
preparation for a better and simpler fix proposed by Eric Biederman
(and fixed up by Serge Hallyn)
Acked-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/nsproxy.h | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index 678e1d38effb..0b9f0dc30d61 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h | |||
| @@ -35,30 +35,22 @@ 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); | ||
| 39 | 38 | ||
| 40 | static inline void finalize_put_nsproxy(struct nsproxy *ns) | 39 | static inline void put_nsproxy(struct nsproxy *ns) |
| 41 | { | 40 | { |
| 42 | if (ns) | 41 | if (atomic_dec_and_test(&ns->count)) { |
| 43 | free_nsproxy(ns); | 42 | free_nsproxy(ns); |
| 43 | } | ||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline void put_and_finalize_nsproxy(struct nsproxy *ns) | 46 | static inline void exit_task_namespaces(struct task_struct *p) |
| 47 | { | 47 | { |
| 48 | finalize_put_nsproxy(put_nsproxy(ns)); | 48 | struct nsproxy *ns = p->nsproxy; |
| 49 | } | 49 | if (ns) { |
| 50 | 50 | task_lock(p); | |
| 51 | static inline struct nsproxy *preexit_task_namespaces(struct task_struct *p) | 51 | p->nsproxy = NULL; |
| 52 | { | 52 | task_unlock(p); |
| 53 | return put_nsproxy(p->nsproxy); | 53 | put_nsproxy(ns); |
| 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); | ||
| 63 | } | 55 | } |
| 64 | #endif | 56 | #endif |
