diff options
Diffstat (limited to 'ipc/namespace.c')
| -rw-r--r-- | ipc/namespace.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/ipc/namespace.c b/ipc/namespace.c index 8054c8e5faf..ce0a647869b 100644 --- a/ipc/namespace.c +++ b/ipc/namespace.c @@ -12,6 +12,7 @@  #include <linux/fs.h>  #include <linux/mount.h>  #include <linux/user_namespace.h> +#include <linux/proc_fs.h>  #include "util.h" @@ -140,3 +141,39 @@ void put_ipc_ns(struct ipc_namespace *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, +};  |