mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 13:41:30 +00:00
[PATCH] namespaces: add nsproxy
This patch adds a nsproxy structure to the task struct. Later patches will move the fs namespace pointer into this structure, and introduce a new utsname namespace into the nsproxy. The vserver and openvz functionality, then, would be implemented in large part by virtualizing/isolating more and more resources into namespaces, each contained in the nsproxy. [akpm@osdl.org: build fix] Signed-off-by: Serge Hallyn <serue@us.ibm.com> Cc: Kirill Korotaev <dev@openvz.org> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Herbert Poetzl <herbert@13thfloor.at> Cc: Andrey Savochkin <saw@sw.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
b1ba4ddde0
commit
ab516013ad
27 changed files with 196 additions and 2 deletions
45
include/linux/nsproxy.h
Normal file
45
include/linux/nsproxy.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
#ifndef _LINUX_NSPROXY_H
|
||||
#define _LINUX_NSPROXY_H
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/*
|
||||
* 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;
|
||||
};
|
||||
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);
|
||||
|
||||
static inline void put_nsproxy(struct nsproxy *ns)
|
||||
{
|
||||
if (atomic_dec_and_test(&ns->count)) {
|
||||
free_nsproxy(ns);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void exit_task_namespaces(struct task_struct *p)
|
||||
{
|
||||
struct nsproxy *ns = p->nsproxy;
|
||||
if (ns) {
|
||||
put_nsproxy(ns);
|
||||
p->nsproxy = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue