X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=kernel%2Fnsproxy.c;h=6ebdb82a0ce43a5211e3862008959cb5091febcd;hb=74c37e8c9f626ed000388bebdc781a8e35ee4ab7;hp=e10385c17f73766e9373992d6e4497192b664b95;hpb=1651e14e28a2d9f446018ef522882e0709a2ce4f;p=powerpc.git diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index e10385c17f..6ebdb82a0c 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c @@ -7,6 +7,10 @@ * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, version 2 of the * License. + * + * Jun 2006 - namespaces support + * OpenVZ, SWsoft Inc. + * Pavel Emelianov */ #include @@ -14,6 +18,7 @@ #include #include #include +#include struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy); @@ -59,6 +64,10 @@ struct nsproxy *dup_namespaces(struct nsproxy *orig) if (ns) { if (ns->namespace) get_namespace(ns->namespace); + if (ns->uts_ns) + get_uts_ns(ns->uts_ns); + if (ns->ipc_ns) + get_ipc_ns(ns->ipc_ns); } return ns; @@ -79,7 +88,7 @@ int copy_namespaces(int flags, struct task_struct *tsk) get_nsproxy(old_ns); - if (!(flags & CLONE_NEWNS)) + if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC))) return 0; new_ns = clone_namespaces(old_ns); @@ -91,20 +100,40 @@ int copy_namespaces(int flags, struct task_struct *tsk) tsk->nsproxy = new_ns; err = copy_namespace(flags, tsk); - if (err) { - tsk->nsproxy = old_ns; - put_nsproxy(new_ns); - goto out; - } + if (err) + goto out_ns; + + err = copy_utsname(flags, tsk); + if (err) + goto out_uts; + + err = copy_ipcs(flags, tsk); + if (err) + goto out_ipc; out: put_nsproxy(old_ns); return err; + +out_ipc: + if (new_ns->uts_ns) + put_uts_ns(new_ns->uts_ns); +out_uts: + if (new_ns->namespace) + put_namespace(new_ns->namespace); +out_ns: + tsk->nsproxy = old_ns; + kfree(new_ns); + goto out; } void free_nsproxy(struct nsproxy *ns) { if (ns->namespace) put_namespace(ns->namespace); + if (ns->uts_ns) + put_uts_ns(ns->uts_ns); + if (ns->ipc_ns) + put_ipc_ns(ns->ipc_ns); kfree(ns); }