1ab516013SSerge E. Hallyn /* 2ab516013SSerge E. Hallyn * Copyright (C) 2006 IBM Corporation 3ab516013SSerge E. Hallyn * 4ab516013SSerge E. Hallyn * Author: Serge Hallyn <serue@us.ibm.com> 5ab516013SSerge E. Hallyn * 6ab516013SSerge E. Hallyn * This program is free software; you can redistribute it and/or 7ab516013SSerge E. Hallyn * modify it under the terms of the GNU General Public License as 8ab516013SSerge E. Hallyn * published by the Free Software Foundation, version 2 of the 9ab516013SSerge E. Hallyn * License. 10ab516013SSerge E. Hallyn */ 11ab516013SSerge E. Hallyn 12ab516013SSerge E. Hallyn #include <linux/module.h> 13ab516013SSerge E. Hallyn #include <linux/version.h> 14ab516013SSerge E. Hallyn #include <linux/nsproxy.h> 150437eb59SSerge E. Hallyn #include <linux/init_task.h> 160437eb59SSerge E. Hallyn 170437eb59SSerge E. Hallyn struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy); 18ab516013SSerge E. Hallyn 19ab516013SSerge E. Hallyn static inline void get_nsproxy(struct nsproxy *ns) 20ab516013SSerge E. Hallyn { 21ab516013SSerge E. Hallyn atomic_inc(&ns->count); 22ab516013SSerge E. Hallyn } 23ab516013SSerge E. Hallyn 24ab516013SSerge E. Hallyn void get_task_namespaces(struct task_struct *tsk) 25ab516013SSerge E. Hallyn { 26ab516013SSerge E. Hallyn struct nsproxy *ns = tsk->nsproxy; 27ab516013SSerge E. Hallyn if (ns) { 28ab516013SSerge E. Hallyn get_nsproxy(ns); 29ab516013SSerge E. Hallyn } 30ab516013SSerge E. Hallyn } 31ab516013SSerge E. Hallyn 32ab516013SSerge E. Hallyn /* 33ab516013SSerge E. Hallyn * creates a copy of "orig" with refcount 1. 34ab516013SSerge E. Hallyn * This does not grab references to the contained namespaces, 35ab516013SSerge E. Hallyn * so that needs to be done by dup_namespaces. 36ab516013SSerge E. Hallyn */ 37ab516013SSerge E. Hallyn static inline struct nsproxy *clone_namespaces(struct nsproxy *orig) 38ab516013SSerge E. Hallyn { 39ab516013SSerge E. Hallyn struct nsproxy *ns; 40ab516013SSerge E. Hallyn 41ab516013SSerge E. Hallyn ns = kmalloc(sizeof(struct nsproxy), GFP_KERNEL); 42ab516013SSerge E. Hallyn if (ns) { 43ab516013SSerge E. Hallyn memcpy(ns, orig, sizeof(struct nsproxy)); 44ab516013SSerge E. Hallyn atomic_set(&ns->count, 1); 45ab516013SSerge E. Hallyn } 46ab516013SSerge E. Hallyn return ns; 47ab516013SSerge E. Hallyn } 48ab516013SSerge E. Hallyn 49ab516013SSerge E. Hallyn /* 50ab516013SSerge E. Hallyn * copies the nsproxy, setting refcount to 1, and grabbing a 51ab516013SSerge E. Hallyn * reference to all contained namespaces. Called from 52ab516013SSerge E. Hallyn * sys_unshare() 53ab516013SSerge E. Hallyn */ 54ab516013SSerge E. Hallyn struct nsproxy *dup_namespaces(struct nsproxy *orig) 55ab516013SSerge E. Hallyn { 56ab516013SSerge E. Hallyn struct nsproxy *ns = clone_namespaces(orig); 57ab516013SSerge E. Hallyn 58ab516013SSerge E. Hallyn return ns; 59ab516013SSerge E. Hallyn } 60ab516013SSerge E. Hallyn 61ab516013SSerge E. Hallyn /* 62ab516013SSerge E. Hallyn * called from clone. This now handles copy for nsproxy and all 63ab516013SSerge E. Hallyn * namespaces therein. 64ab516013SSerge E. Hallyn */ 65ab516013SSerge E. Hallyn int copy_namespaces(int flags, struct task_struct *tsk) 66ab516013SSerge E. Hallyn { 67ab516013SSerge E. Hallyn struct nsproxy *old_ns = tsk->nsproxy; 68ab516013SSerge E. Hallyn 69ab516013SSerge E. Hallyn if (!old_ns) 70ab516013SSerge E. Hallyn return 0; 71ab516013SSerge E. Hallyn 72ab516013SSerge E. Hallyn get_nsproxy(old_ns); 73ab516013SSerge E. Hallyn 74ab516013SSerge E. Hallyn return 0; 75ab516013SSerge E. Hallyn } 76ab516013SSerge E. Hallyn 77ab516013SSerge E. Hallyn void free_nsproxy(struct nsproxy *ns) 78ab516013SSerge E. Hallyn { 79ab516013SSerge E. Hallyn kfree(ns); 80ab516013SSerge E. Hallyn } 81