| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_NSPROXY_H | 
 | 2 | #define _LINUX_NSPROXY_H | 
 | 3 |  | 
 | 4 | #include <linux/spinlock.h> | 
 | 5 | #include <linux/sched.h> | 
 | 6 |  | 
| Kirill Korotaev | 6b3286e | 2006-12-08 02:37:56 -0800 | [diff] [blame] | 7 | struct mnt_namespace; | 
| Serge E. Hallyn | 4865ecf | 2006-10-02 02:18:14 -0700 | [diff] [blame] | 8 | struct uts_namespace; | 
| Kirill Korotaev | 25b21cb | 2006-10-02 02:18:19 -0700 | [diff] [blame] | 9 | struct ipc_namespace; | 
| Cedric Le Goater | 9a575a9 | 2006-12-08 02:37:59 -0800 | [diff] [blame] | 10 | struct pid_namespace; | 
| Serge E. Hallyn | 1651e14 | 2006-10-02 02:18:08 -0700 | [diff] [blame] | 11 |  | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 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; | 
| Serge E. Hallyn | 4865ecf | 2006-10-02 02:18:14 -0700 | [diff] [blame] | 26 | 	struct uts_namespace *uts_ns; | 
| Kirill Korotaev | 25b21cb | 2006-10-02 02:18:19 -0700 | [diff] [blame] | 27 | 	struct ipc_namespace *ipc_ns; | 
| Kirill Korotaev | 6b3286e | 2006-12-08 02:37:56 -0800 | [diff] [blame] | 28 | 	struct mnt_namespace *mnt_ns; | 
| Cedric Le Goater | 9a575a9 | 2006-12-08 02:37:59 -0800 | [diff] [blame] | 29 | 	struct pid_namespace *pid_ns; | 
| Cedric Le Goater | acce292 | 2007-07-15 23:40:59 -0700 | [diff] [blame] | 30 | 	struct user_namespace *user_ns; | 
| Eric W. Biederman | 772698f | 2007-09-12 11:55:17 +0200 | [diff] [blame] | 31 | 	struct net 	     *net_ns; | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 32 | }; | 
 | 33 | extern struct nsproxy init_nsproxy; | 
 | 34 |  | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 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 |  | 
| Eric W. Biederman | 213dd26 | 2007-07-15 23:41:15 -0700 | [diff] [blame] | 65 | int copy_namespaces(unsigned long flags, struct task_struct *tsk); | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 66 | void exit_task_namespaces(struct task_struct *tsk); | 
 | 67 | void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new); | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 68 | void free_nsproxy(struct nsproxy *ns); | 
| Badari Pulavarty | e3222c4 | 2007-05-08 00:25:21 -0700 | [diff] [blame] | 69 | int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **, | 
 | 70 | 	struct fs_struct *); | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 71 |  | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 72 | static inline void put_nsproxy(struct nsproxy *ns) | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 73 | { | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 74 | 	if (atomic_dec_and_test(&ns->count)) { | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 75 | 		free_nsproxy(ns); | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 76 | 	} | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 77 | } | 
 | 78 |  | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 79 | static inline void get_nsproxy(struct nsproxy *ns) | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 80 | { | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 81 | 	atomic_inc(&ns->count); | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 82 | } | 
| Serge E. Hallyn | 858d72e | 2007-10-18 23:39:45 -0700 | [diff] [blame] | 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 |  | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 90 | #endif |