Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
nsproxy.h
Go to the documentation of this file.
1 #ifndef _LINUX_NSPROXY_H
2 #define _LINUX_NSPROXY_H
3 
4 #include <linux/spinlock.h>
5 #include <linux/sched.h>
6 
7 struct mnt_namespace;
8 struct uts_namespace;
9 struct ipc_namespace;
10 struct pid_namespace;
11 struct fs_struct;
12 
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 {
31  struct net *net_ns;
32 };
33 extern struct nsproxy init_nsproxy;
34 
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 
65 int copy_namespaces(unsigned long flags, struct task_struct *tsk);
66 void exit_task_namespaces(struct task_struct *tsk);
67 void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new);
68 void free_nsproxy(struct nsproxy *ns);
69 int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **,
70  struct fs_struct *);
71 int __init nsproxy_cache_init(void);
72 
73 static inline void put_nsproxy(struct nsproxy *ns)
74 {
75  if (atomic_dec_and_test(&ns->count)) {
76  free_nsproxy(ns);
77  }
78 }
79 
80 static inline void get_nsproxy(struct nsproxy *ns)
81 {
82  atomic_inc(&ns->count);
83 }
84 
85 #endif