blob: 27f37c1ec1d978fdf3ad7ae55ec50fbf39d070f8 [file] [log] [blame]
Serge E. Hallynab516012006-10-02 02:18:06 -07001#ifndef _LINUX_NSPROXY_H
2#define _LINUX_NSPROXY_H
3
4#include <linux/spinlock.h>
5#include <linux/sched.h>
6
Kirill Korotaev6b3286e2006-12-08 02:37:56 -08007struct mnt_namespace;
Serge E. Hallyn4865ecf2006-10-02 02:18:14 -07008struct uts_namespace;
Kirill Korotaev25b21cb2006-10-02 02:18:19 -07009struct ipc_namespace;
Serge E. Hallyn1651e142006-10-02 02:18:08 -070010
Serge E. Hallynab516012006-10-02 02:18:06 -070011/*
12 * A structure to contain pointers to all per-process
13 * namespaces - fs (mount), uts, network, sysvipc, etc.
14 *
15 * 'count' is the number of tasks holding a reference.
16 * The count for each namespace, then, will be the number
17 * of nsproxies pointing to it, not the number of tasks.
18 *
19 * The nsproxy is shared by tasks which share all namespaces.
20 * As soon as a single namespace is cloned or unshared, the
21 * nsproxy is copied.
22 */
23struct nsproxy {
24 atomic_t count;
25 spinlock_t nslock;
Cedric Le Goater373beb32006-12-08 02:37:57 -080026 unsigned long id;
Serge E. Hallyn4865ecf2006-10-02 02:18:14 -070027 struct uts_namespace *uts_ns;
Kirill Korotaev25b21cb2006-10-02 02:18:19 -070028 struct ipc_namespace *ipc_ns;
Kirill Korotaev6b3286e2006-12-08 02:37:56 -080029 struct mnt_namespace *mnt_ns;
Serge E. Hallynab516012006-10-02 02:18:06 -070030};
31extern struct nsproxy init_nsproxy;
32
33struct nsproxy *dup_namespaces(struct nsproxy *orig);
34int copy_namespaces(int flags, struct task_struct *tsk);
35void get_task_namespaces(struct task_struct *tsk);
36void free_nsproxy(struct nsproxy *ns);
37
38static inline void put_nsproxy(struct nsproxy *ns)
39{
40 if (atomic_dec_and_test(&ns->count)) {
41 free_nsproxy(ns);
42 }
43}
44
45static inline void exit_task_namespaces(struct task_struct *p)
46{
47 struct nsproxy *ns = p->nsproxy;
48 if (ns) {
Vasily Tarasov701e0542006-11-25 11:09:22 -080049 task_lock(p);
Serge E. Hallynab516012006-10-02 02:18:06 -070050 p->nsproxy = NULL;
Vasily Tarasov701e0542006-11-25 11:09:22 -080051 task_unlock(p);
52 put_nsproxy(ns);
Serge E. Hallynab516012006-10-02 02:18:06 -070053 }
54}
55#endif