| 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; | 
| Al Viro | 5ad4e53 | 2009-03-29 19:50:06 -0400 | [diff] [blame] | 11 | struct fs_struct; | 
| Serge E. Hallyn | 1651e14 | 2006-10-02 02:18:08 -0700 | [diff] [blame] | 12 |  | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 13 | /* | 
|  | 14 | * A structure to contain pointers to all per-process | 
|  | 15 | * namespaces - fs (mount), uts, network, sysvipc, etc. | 
|  | 16 | * | 
|  | 17 | * 'count' is the number of tasks holding a reference. | 
|  | 18 | * The count for each namespace, then, will be the number | 
|  | 19 | * of nsproxies pointing to it, not the number of tasks. | 
|  | 20 | * | 
|  | 21 | * The nsproxy is shared by tasks which share all namespaces. | 
|  | 22 | * As soon as a single namespace is cloned or unshared, the | 
|  | 23 | * nsproxy is copied. | 
|  | 24 | */ | 
|  | 25 | struct nsproxy { | 
|  | 26 | atomic_t count; | 
| Serge E. Hallyn | 4865ecf | 2006-10-02 02:18:14 -0700 | [diff] [blame] | 27 | struct uts_namespace *uts_ns; | 
| Kirill Korotaev | 25b21cb | 2006-10-02 02:18:19 -0700 | [diff] [blame] | 28 | struct ipc_namespace *ipc_ns; | 
| Kirill Korotaev | 6b3286e | 2006-12-08 02:37:56 -0800 | [diff] [blame] | 29 | struct mnt_namespace *mnt_ns; | 
| Cedric Le Goater | 9a575a9 | 2006-12-08 02:37:59 -0800 | [diff] [blame] | 30 | struct pid_namespace *pid_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 *); | 
| Al Viro | 6657719 | 2011-06-28 15:41:10 -0400 | [diff] [blame] | 71 | int __init nsproxy_cache_init(void); | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 72 |  | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 73 | static inline void put_nsproxy(struct nsproxy *ns) | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 74 | { | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 75 | if (atomic_dec_and_test(&ns->count)) { | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 76 | free_nsproxy(ns); | 
| Linus Torvalds | 444f378 | 2007-01-30 13:35:18 -0800 | [diff] [blame] | 77 | } | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 78 | } | 
|  | 79 |  | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 80 | static inline void get_nsproxy(struct nsproxy *ns) | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 81 | { | 
| Pavel Emelyanov | cf7b708 | 2007-10-18 23:39:54 -0700 | [diff] [blame] | 82 | atomic_inc(&ns->count); | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 83 | } | 
| Serge E. Hallyn | 858d72e | 2007-10-18 23:39:45 -0700 | [diff] [blame] | 84 |  | 
| Serge E. Hallyn | ab51601 | 2006-10-02 02:18:06 -0700 | [diff] [blame] | 85 | #endif |