Commit | Line | Data |
---|---|---|
ab516013 SH |
1 | #ifndef _LINUX_NSPROXY_H |
2 | #define _LINUX_NSPROXY_H | |
3 | ||
4 | #include <linux/spinlock.h> | |
5 | #include <linux/sched.h> | |
6 | ||
6b3286ed | 7 | struct mnt_namespace; |
4865ecf1 | 8 | struct uts_namespace; |
25b21cb2 | 9 | struct ipc_namespace; |
9a575a92 | 10 | struct pid_namespace; |
1651e14e | 11 | |
ab516013 SH |
12 | /* |
13 | * A structure to contain pointers to all per-process | |
14 | * namespaces - fs (mount), uts, network, sysvipc, etc. | |
15 | * | |
16 | * 'count' is the number of tasks holding a reference. | |
17 | * The count for each namespace, then, will be the number | |
18 | * of nsproxies pointing to it, not the number of tasks. | |
19 | * | |
20 | * The nsproxy is shared by tasks which share all namespaces. | |
21 | * As soon as a single namespace is cloned or unshared, the | |
22 | * nsproxy is copied. | |
23 | */ | |
24 | struct nsproxy { | |
25 | atomic_t count; | |
26 | spinlock_t nslock; | |
4865ecf1 | 27 | struct uts_namespace *uts_ns; |
25b21cb2 | 28 | struct ipc_namespace *ipc_ns; |
6b3286ed | 29 | struct mnt_namespace *mnt_ns; |
9a575a92 | 30 | struct pid_namespace *pid_ns; |
ab516013 SH |
31 | }; |
32 | extern struct nsproxy init_nsproxy; | |
33 | ||
34 | struct nsproxy *dup_namespaces(struct nsproxy *orig); | |
35 | int copy_namespaces(int flags, struct task_struct *tsk); | |
36 | void get_task_namespaces(struct task_struct *tsk); | |
37 | void free_nsproxy(struct nsproxy *ns); | |
7a238fcb | 38 | struct nsproxy *put_nsproxy(struct nsproxy *ns); |
ab516013 | 39 | |
7a238fcb | 40 | static inline void finalize_put_nsproxy(struct nsproxy *ns) |
ab516013 | 41 | { |
7a238fcb | 42 | if (ns) |
ab516013 | 43 | free_nsproxy(ns); |
ab516013 SH |
44 | } |
45 | ||
7a238fcb | 46 | static inline void put_and_finalize_nsproxy(struct nsproxy *ns) |
ab516013 | 47 | { |
7a238fcb SH |
48 | finalize_put_nsproxy(put_nsproxy(ns)); |
49 | } | |
50 | ||
51 | static inline struct nsproxy *preexit_task_namespaces(struct task_struct *p) | |
52 | { | |
53 | return put_nsproxy(p->nsproxy); | |
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); | |
ab516013 SH |
63 | } |
64 | #endif |