For usermode helpers to execute within a namspace a slightly different entry point to setns() that takes a namspace inode is needed.
Signed-off-by: Ian Kent <ik...@redhat.com> Cc: Benjamin Coddington <bcodd...@redhat.com> Cc: Al Viro <v...@zeniv.linux.org.uk> Cc: J. Bruce Fields <bfie...@fieldses.org> Cc: David Howells <dhowe...@redhat.com> Cc: Trond Myklebust <trond.mykleb...@primarydata.com> Cc: Oleg Nesterov <onest...@redhat.com> Cc: Eric W. Biederman <ebied...@xmission.com> Cc: Jeff Layton <jeff.lay...@primarydata.com> --- include/linux/nsproxy.h | 1 + kernel/nsproxy.c | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h index 35fa08f..c75bf12 100644 --- a/include/linux/nsproxy.h +++ b/include/linux/nsproxy.h @@ -62,6 +62,7 @@ extern struct nsproxy init_nsproxy; * */ +int setns_inode(struct inode *inode, int nstype); int copy_namespaces(unsigned long flags, struct task_struct *tsk); void exit_task_namespaces(struct task_struct *tsk); void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new); diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index 49746c8..27cc544 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c @@ -218,20 +218,15 @@ void exit_task_namespaces(struct task_struct *p) switch_task_namespaces(p, NULL); } -SYSCALL_DEFINE2(setns, int, fd, int, nstype) +int setns_inode(struct inode *inode, int nstype) { struct task_struct *tsk = current; struct nsproxy *new_nsproxy; - struct file *file; struct ns_common *ns; int err; - file = proc_ns_fget(fd); - if (IS_ERR(file)) - return PTR_ERR(file); - err = -EINVAL; - ns = get_proc_ns(file_inode(file)); + ns = get_proc_ns(inode); if (nstype && (ns->ops->type != nstype)) goto out; @@ -248,6 +243,18 @@ SYSCALL_DEFINE2(setns, int, fd, int, nstype) } switch_task_namespaces(tsk, new_nsproxy); out: + return err; +} + +SYSCALL_DEFINE2(setns, int, fd, int, nstype) +{ + struct file *file; + int err; + + file = proc_ns_fget(fd); + if (IS_ERR(file)) + return PTR_ERR(file); + err = setns_inode(file_inode(file), nstype); fput(file); return err; } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/