2006-10-02 03:18:06 -06:00
|
|
|
#ifndef _LINUX_NSPROXY_H
|
|
|
|
#define _LINUX_NSPROXY_H
|
|
|
|
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <linux/sched.h>
|
|
|
|
|
2006-12-08 03:37:56 -07:00
|
|
|
struct mnt_namespace;
|
2006-10-02 03:18:14 -06:00
|
|
|
struct uts_namespace;
|
2006-10-02 03:18:19 -06:00
|
|
|
struct ipc_namespace;
|
2006-12-08 03:37:59 -07:00
|
|
|
struct pid_namespace;
|
2006-10-02 03:18:08 -06:00
|
|
|
|
2006-10-02 03:18:06 -06: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 03:18:14 -06:00
|
|
|
struct uts_namespace *uts_ns;
|
2006-10-02 03:18:19 -06:00
|
|
|
struct ipc_namespace *ipc_ns;
|
2006-12-08 03:37:56 -07:00
|
|
|
struct mnt_namespace *mnt_ns;
|
2006-12-08 03:37:59 -07:00
|
|
|
struct pid_namespace *pid_ns;
|
2006-10-02 03:18:06 -06:00
|
|
|
};
|
|
|
|
extern struct nsproxy init_nsproxy;
|
|
|
|
|
|
|
|
struct nsproxy *dup_namespaces(struct nsproxy *orig);
|
|
|
|
int copy_namespaces(int flags, struct task_struct *tsk);
|
|
|
|
void get_task_namespaces(struct task_struct *tsk);
|
|
|
|
void free_nsproxy(struct nsproxy *ns);
|
2007-01-29 14:19:40 -07:00
|
|
|
struct nsproxy *put_nsproxy(struct nsproxy *ns);
|
2006-10-02 03:18:06 -06:00
|
|
|
|
2007-01-29 14:19:40 -07:00
|
|
|
static inline void finalize_put_nsproxy(struct nsproxy *ns)
|
2006-10-02 03:18:06 -06:00
|
|
|
{
|
2007-01-29 14:19:40 -07:00
|
|
|
if (ns)
|
2006-10-02 03:18:06 -06:00
|
|
|
free_nsproxy(ns);
|
|
|
|
}
|
|
|
|
|
2007-01-29 14:19:40 -07:00
|
|
|
static inline void put_and_finalize_nsproxy(struct nsproxy *ns)
|
2006-10-02 03:18:06 -06:00
|
|
|
{
|
2007-01-29 14:19:40 -07:00
|
|
|
finalize_put_nsproxy(put_nsproxy(ns));
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline struct nsproxy *preexit_task_namespaces(struct task_struct *p)
|
|
|
|
{
|
|
|
|
return put_nsproxy(p->nsproxy);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void exit_task_namespaces(struct task_struct *p,
|
|
|
|
struct nsproxy *ns)
|
|
|
|
{
|
|
|
|
task_lock(p);
|
|
|
|
p->nsproxy = NULL;
|
|
|
|
task_unlock(p);
|
|
|
|
finalize_put_nsproxy(ns);
|
2006-10-02 03:18:06 -06:00
|
|
|
}
|
|
|
|
#endif
|