Skip to content

Commit

Permalink
[PATCH] to nsproxy
Browse files Browse the repository at this point in the history
Add the pid namespace framework to the nsproxy object.  The copy of the pid
namespace only increases the refcount on the global pid namespace,
init_pid_ns, and unshare is not implemented.

There is no configuration option to activate or deactivate this feature
because this not relevant for the moment.

Signed-off-by: Cedric Le Goater <[email protected]>
Cc: Kirill Korotaev <[email protected]>
Cc: Eric W. Biederman <[email protected]>
Cc: Herbert Poetzl <[email protected]>
Cc: Sukadev Bhattiprolu <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Cedric Le Goater authored and Linus Torvalds committed Dec 8, 2006
1 parent 61a58c6 commit 9a575a9
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 9 deletions.
2 changes: 2 additions & 0 deletions include/linux/init_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <linux/utsname.h>
#include <linux/lockdep.h>
#include <linux/ipc.h>
#include <linux/pid_namespace.h>

#define INIT_FDTABLE \
{ \
Expand Down Expand Up @@ -73,6 +74,7 @@

extern struct nsproxy init_nsproxy;
#define INIT_NSPROXY(nsproxy) { \
.pid_ns = &init_pid_ns, \
.count = ATOMIC_INIT(1), \
.nslock = __SPIN_LOCK_UNLOCKED(nsproxy.nslock), \
.id = 0, \
Expand Down
2 changes: 2 additions & 0 deletions include/linux/nsproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
struct mnt_namespace;
struct uts_namespace;
struct ipc_namespace;
struct pid_namespace;

/*
* A structure to contain pointers to all per-process
Expand All @@ -27,6 +28,7 @@ struct nsproxy {
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns;
};
extern struct nsproxy init_nsproxy;

Expand Down
20 changes: 18 additions & 2 deletions include/linux/pid_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <linux/mm.h>
#include <linux/threads.h>
#include <linux/pid.h>
#include <linux/nsproxy.h>
#include <linux/kref.h>

struct pidmap {
atomic_t nr_free;
Expand All @@ -14,10 +16,24 @@ struct pidmap {
#define PIDMAP_ENTRIES ((PID_MAX_LIMIT + 8*PAGE_SIZE - 1)/PAGE_SIZE/8)

struct pid_namespace {
struct pidmap pidmap[PIDMAP_ENTRIES];
int last_pid;
struct kref kref;
struct pidmap pidmap[PIDMAP_ENTRIES];
int last_pid;
};

extern struct pid_namespace init_pid_ns;

static inline void get_pid_ns(struct pid_namespace *ns)
{
kref_get(&ns->kref);
}

extern int copy_pid_ns(int flags, struct task_struct *tsk);
extern void free_pid_ns(struct kref *kref);

static inline void put_pid_ns(struct pid_namespace *ns)
{
kref_put(&ns->kref, free_pid_ns);
}

#endif /* _LINUX_PID_NS_H */
26 changes: 19 additions & 7 deletions kernel/nsproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <linux/init_task.h>
#include <linux/mnt_namespace.h>
#include <linux/utsname.h>
#include <linux/pid_namespace.h>

struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy);

Expand Down Expand Up @@ -68,6 +69,8 @@ struct nsproxy *dup_namespaces(struct nsproxy *orig)
get_uts_ns(ns->uts_ns);
if (ns->ipc_ns)
get_ipc_ns(ns->ipc_ns);
if (ns->pid_ns)
get_pid_ns(ns->pid_ns);
}

return ns;
Expand Down Expand Up @@ -111,10 +114,17 @@ int copy_namespaces(int flags, struct task_struct *tsk)
if (err)
goto out_ipc;

err = copy_pid_ns(flags, tsk);
if (err)
goto out_pid;

out:
put_nsproxy(old_ns);
return err;

out_pid:
if (new_ns->ipc_ns)
put_ipc_ns(new_ns->ipc_ns);
out_ipc:
if (new_ns->uts_ns)
put_uts_ns(new_ns->uts_ns);
Expand All @@ -129,11 +139,13 @@ int copy_namespaces(int flags, struct task_struct *tsk)

void free_nsproxy(struct nsproxy *ns)
{
if (ns->mnt_ns)
put_mnt_ns(ns->mnt_ns);
if (ns->uts_ns)
put_uts_ns(ns->uts_ns);
if (ns->ipc_ns)
put_ipc_ns(ns->ipc_ns);
kfree(ns);
if (ns->mnt_ns)
put_mnt_ns(ns->mnt_ns);
if (ns->uts_ns)
put_uts_ns(ns->uts_ns);
if (ns->ipc_ns)
put_ipc_ns(ns->ipc_ns);
if (ns->pid_ns)
put_pid_ns(ns->pid_ns);
kfree(ns);
}
23 changes: 23 additions & 0 deletions kernel/pid.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ static inline int mk_pid(struct pid_namespace *pid_ns,
* the scheme scales to up to 4 million PIDs, runtime.
*/
struct pid_namespace init_pid_ns = {
.kref = {
.refcount = ATOMIC_INIT(2),
},
.pidmap = {
[ 0 ... PIDMAP_ENTRIES-1] = { ATOMIC_INIT(BITS_PER_PAGE), NULL }
},
Expand Down Expand Up @@ -356,6 +359,26 @@ struct pid *find_ge_pid(int nr)
}
EXPORT_SYMBOL_GPL(find_get_pid);

int copy_pid_ns(int flags, struct task_struct *tsk)
{
struct pid_namespace *old_ns = tsk->nsproxy->pid_ns;
int err = 0;

if (!old_ns)
return 0;

get_pid_ns(old_ns);
return err;
}

void free_pid_ns(struct kref *kref)
{
struct pid_namespace *ns;

ns = container_of(kref, struct pid_namespace, kref);
kfree(ns);
}

/*
* The pid hash table is scaled according to the amount of memory in the
* machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or
Expand Down

0 comments on commit 9a575a9

Please sign in to comment.