]>
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; | |
4865ecf1 | 26 | struct uts_namespace *uts_ns; |
25b21cb2 | 27 | struct ipc_namespace *ipc_ns; |
6b3286ed | 28 | struct mnt_namespace *mnt_ns; |
9a575a92 | 29 | struct pid_namespace *pid_ns; |
acce292c | 30 | struct user_namespace *user_ns; |
772698f6 | 31 | struct net *net_ns; |
ab516013 SH |
32 | }; |
33 | extern struct nsproxy init_nsproxy; | |
34 | ||
cf7b708c PE |
35 | /* |
36 | * the namespaces access rules are: | |
37 | * | |
38 | * 1. only current task is allowed to change tsk->nsproxy pointer or | |
39 | * any pointer on the nsproxy itself | |
40 | * | |
41 | * 2. when accessing (i.e. reading) current task's namespaces - no | |
42 | * precautions should be taken - just dereference the pointers | |
43 | * | |
44 | * 3. the access to other task namespaces is performed like this | |
45 | * rcu_read_lock(); | |
46 | * nsproxy = task_nsproxy(tsk); | |
47 | * if (nsproxy != NULL) { | |
48 | * / * | |
49 | * * work with the namespaces here | |
50 | * * e.g. get the reference on one of them | |
51 | * * / | |
52 | * } / * | |
53 | * * NULL task_nsproxy() means that this task is | |
54 | * * almost dead (zombie) | |
55 | * * / | |
56 | * rcu_read_unlock(); | |
57 | * | |
58 | */ | |
59 | ||
60 | static inline struct nsproxy *task_nsproxy(struct task_struct *tsk) | |
61 | { | |
62 | return rcu_dereference(tsk->nsproxy); | |
63 | } | |
64 | ||
213dd266 | 65 | int copy_namespaces(unsigned long flags, struct task_struct *tsk); |
cf7b708c PE |
66 | void exit_task_namespaces(struct task_struct *tsk); |
67 | void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new); | |
ab516013 | 68 | void free_nsproxy(struct nsproxy *ns); |
e3222c4e BP |
69 | int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **, |
70 | struct fs_struct *); | |
ab516013 | 71 | |
444f378b | 72 | static inline void put_nsproxy(struct nsproxy *ns) |
ab516013 | 73 | { |
444f378b | 74 | if (atomic_dec_and_test(&ns->count)) { |
ab516013 | 75 | free_nsproxy(ns); |
444f378b | 76 | } |
ab516013 SH |
77 | } |
78 | ||
cf7b708c | 79 | static inline void get_nsproxy(struct nsproxy *ns) |
ab516013 | 80 | { |
cf7b708c | 81 | atomic_inc(&ns->count); |
ab516013 | 82 | } |
858d72ea SH |
83 | |
84 | #ifdef CONFIG_CGROUP_NS | |
85 | int ns_cgroup_clone(struct task_struct *tsk); | |
86 | #else | |
87 | static inline int ns_cgroup_clone(struct task_struct *tsk) { return 0; } | |
88 | #endif | |
89 | ||
ab516013 | 90 | #endif |