2006-10-02 16:18:06 +07:00
|
|
|
#ifndef _LINUX_NSPROXY_H
|
|
|
|
#define _LINUX_NSPROXY_H
|
|
|
|
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <linux/sched.h>
|
|
|
|
|
2006-12-08 17:37:56 +07:00
|
|
|
struct mnt_namespace;
|
2006-10-02 16:18:14 +07:00
|
|
|
struct uts_namespace;
|
2006-10-02 16:18:19 +07:00
|
|
|
struct ipc_namespace;
|
2006-12-08 17:37:59 +07:00
|
|
|
struct pid_namespace;
|
2006-10-02 16:18:08 +07:00
|
|
|
|
2006-10-02 16:18:06 +07:00
|
|
|
/*
|
|
|
|
* A structure to contain pointers to all per-process
|
|
|
|
* namespaces - fs (mount), uts, network, sysvipc, etc.
|
|
|
|
*
|
|
|
|
* 'count' is the number of tasks holding a reference.
|
|
|
|
* The count for each namespace, then, will be the number
|
|
|
|
* of nsproxies pointing to it, not the number of tasks.
|
|
|
|
*
|
|
|
|
* The nsproxy is shared by tasks which share all namespaces.
|
|
|
|
* As soon as a single namespace is cloned or unshared, the
|
|
|
|
* nsproxy is copied.
|
|
|
|
*/
|
|
|
|
struct nsproxy {
|
|
|
|
atomic_t count;
|
|
|
|
spinlock_t nslock;
|
2006-10-02 16:18:14 +07:00
|
|
|
struct uts_namespace *uts_ns;
|
2006-10-02 16:18:19 +07:00
|
|
|
struct ipc_namespace *ipc_ns;
|
2006-12-08 17:37:56 +07:00
|
|
|
struct mnt_namespace *mnt_ns;
|
2006-12-08 17:37:59 +07:00
|
|
|
struct pid_namespace *pid_ns;
|
2007-07-16 13:40:59 +07:00
|
|
|
struct user_namespace *user_ns;
|
2006-10-02 16:18:06 +07:00
|
|
|
};
|
|
|
|
extern struct nsproxy init_nsproxy;
|
|
|
|
|
2007-07-16 13:41:15 +07:00
|
|
|
int copy_namespaces(unsigned long flags, struct task_struct *tsk);
|
2006-10-02 16:18:06 +07:00
|
|
|
void get_task_namespaces(struct task_struct *tsk);
|
|
|
|
void free_nsproxy(struct nsproxy *ns);
|
2007-05-08 14:25:21 +07:00
|
|
|
int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **,
|
|
|
|
struct fs_struct *);
|
2006-10-02 16:18:06 +07:00
|
|
|
|
2007-01-31 04:35:18 +07:00
|
|
|
static inline void put_nsproxy(struct nsproxy *ns)
|
2006-10-02 16:18:06 +07:00
|
|
|
{
|
2007-01-31 04:35:18 +07:00
|
|
|
if (atomic_dec_and_test(&ns->count)) {
|
2006-10-02 16:18:06 +07:00
|
|
|
free_nsproxy(ns);
|
2007-01-31 04:35:18 +07:00
|
|
|
}
|
2006-10-02 16:18:06 +07:00
|
|
|
}
|
|
|
|
|
2007-01-31 04:35:18 +07:00
|
|
|
static inline void exit_task_namespaces(struct task_struct *p)
|
2006-10-02 16:18:06 +07:00
|
|
|
{
|
2007-01-31 04:35:18 +07:00
|
|
|
struct nsproxy *ns = p->nsproxy;
|
|
|
|
if (ns) {
|
|
|
|
task_lock(p);
|
|
|
|
p->nsproxy = NULL;
|
|
|
|
task_unlock(p);
|
|
|
|
put_nsproxy(ns);
|
|
|
|
}
|
2006-10-02 16:18:06 +07:00
|
|
|
}
|
|
|
|
#endif
|