Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
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
{
26
atomic_t
count
;
27
struct
uts_namespace
*
uts_ns
;
28
struct
ipc_namespace
*
ipc_ns
;
29
struct
mnt_namespace
*
mnt_ns
;
30
struct
pid_namespace
*
pid_ns
;
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
Generated on Thu Jan 10 2013 14:52:14 for Linux Kernel by
1.8.2