ns proc: Add support for the ipc namespace
Acked-by: Daniel Lezcano <daniel.lezcano@free.fr> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
This commit is contained in:
parent
34482e89a5
commit
a00eaf11a2
|
@ -22,6 +22,9 @@ static const struct proc_ns_operations *ns_entries[] = {
|
||||||
#ifdef CONFIG_UTS_NS
|
#ifdef CONFIG_UTS_NS
|
||||||
&utsns_operations,
|
&utsns_operations,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_IPC_NS
|
||||||
|
&ipcns_operations,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct file_operations ns_file_operations = {
|
static const struct file_operations ns_file_operations = {
|
||||||
|
|
|
@ -267,6 +267,7 @@ struct proc_ns_operations {
|
||||||
};
|
};
|
||||||
extern const struct proc_ns_operations netns_operations;
|
extern const struct proc_ns_operations netns_operations;
|
||||||
extern const struct proc_ns_operations utsns_operations;
|
extern const struct proc_ns_operations utsns_operations;
|
||||||
|
extern const struct proc_ns_operations ipcns_operations;
|
||||||
|
|
||||||
union proc_op {
|
union proc_op {
|
||||||
int (*proc_get_link)(struct inode *, struct path *);
|
int (*proc_get_link)(struct inode *, struct path *);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/mount.h>
|
#include <linux/mount.h>
|
||||||
#include <linux/user_namespace.h>
|
#include <linux/user_namespace.h>
|
||||||
|
#include <linux/proc_fs.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
@ -140,3 +141,39 @@ void put_ipc_ns(struct ipc_namespace *ns)
|
||||||
free_ipc_ns(ns);
|
free_ipc_ns(ns);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *ipcns_get(struct task_struct *task)
|
||||||
|
{
|
||||||
|
struct ipc_namespace *ns = NULL;
|
||||||
|
struct nsproxy *nsproxy;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
nsproxy = task_nsproxy(task);
|
||||||
|
if (nsproxy)
|
||||||
|
ns = get_ipc_ns(nsproxy->ipc_ns);
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
return ns;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipcns_put(void *ns)
|
||||||
|
{
|
||||||
|
return put_ipc_ns(ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ipcns_install(struct nsproxy *nsproxy, void *ns)
|
||||||
|
{
|
||||||
|
/* Ditch state from the old ipc namespace */
|
||||||
|
exit_sem(current);
|
||||||
|
put_ipc_ns(nsproxy->ipc_ns);
|
||||||
|
nsproxy->ipc_ns = get_ipc_ns(ns);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct proc_ns_operations ipcns_operations = {
|
||||||
|
.name = "ipc",
|
||||||
|
.type = CLONE_NEWIPC,
|
||||||
|
.get = ipcns_get,
|
||||||
|
.put = ipcns_put,
|
||||||
|
.install = ipcns_install,
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue