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> 15ab516013SSerge E. Hallyn 16ab516013SSerge E. Hallyn static inline void get_nsproxy(struct nsproxy *ns) 17ab516013SSerge E. Hallyn { 18ab516013SSerge E. Hallyn atomic_inc(&ns->count); 19ab516013SSerge E. Hallyn } 20ab516013SSerge E. Hallyn 21ab516013SSerge E. Hallyn void get_task_namespaces(struct task_struct *tsk) 22ab516013SSerge E. Hallyn { 23ab516013SSerge E. Hallyn struct nsproxy *ns = tsk->nsproxy; 24ab516013SSerge E. Hallyn if (ns) { 25ab516013SSerge E. Hallyn get_nsproxy(ns); 26ab516013SSerge E. Hallyn } 27ab516013SSerge E. Hallyn } 28ab516013SSerge E. Hallyn 29ab516013SSerge E. Hallyn /* 30ab516013SSerge E. Hallyn * creates a copy of "orig" with refcount 1. 31ab516013SSerge E. Hallyn * This does not grab references to the contained namespaces, 32ab516013SSerge E. Hallyn * so that needs to be done by dup_namespaces. 33ab516013SSerge E. Hallyn */ 34ab516013SSerge E. Hallyn static inline struct nsproxy *clone_namespaces(struct nsproxy *orig) 35ab516013SSerge E. Hallyn { 36ab516013SSerge E. Hallyn struct nsproxy *ns; 37ab516013SSerge E. Hallyn 38ab516013SSerge E. Hallyn ns = kmalloc(sizeof(struct nsproxy), GFP_KERNEL); 39ab516013SSerge E. Hallyn if (ns) { 40ab516013SSerge E. Hallyn memcpy(ns, orig, sizeof(struct nsproxy)); 41ab516013SSerge E. Hallyn atomic_set(&ns->count, 1); 42ab516013SSerge E. Hallyn } 43ab516013SSerge E. Hallyn return ns; 44ab516013SSerge E. Hallyn } 45ab516013SSerge E. Hallyn 46ab516013SSerge E. Hallyn /* 47ab516013SSerge E. Hallyn * copies the nsproxy, setting refcount to 1, and grabbing a 48ab516013SSerge E. Hallyn * reference to all contained namespaces. Called from 49ab516013SSerge E. Hallyn * sys_unshare() 50ab516013SSerge E. Hallyn */ 51ab516013SSerge E. Hallyn struct nsproxy *dup_namespaces(struct nsproxy *orig) 52ab516013SSerge E. Hallyn { 53ab516013SSerge E. Hallyn struct nsproxy *ns = clone_namespaces(orig); 54ab516013SSerge E. Hallyn 55ab516013SSerge E. Hallyn return ns; 56ab516013SSerge E. Hallyn } 57ab516013SSerge E. Hallyn 58ab516013SSerge E. Hallyn /* 59ab516013SSerge E. Hallyn * called from clone. This now handles copy for nsproxy and all 60ab516013SSerge E. Hallyn * namespaces therein. 61ab516013SSerge E. Hallyn */ 62ab516013SSerge E. Hallyn int copy_namespaces(int flags, struct task_struct *tsk) 63ab516013SSerge E. Hallyn { 64ab516013SSerge E. Hallyn struct nsproxy *old_ns = tsk->nsproxy; 65ab516013SSerge E. Hallyn 66ab516013SSerge E. Hallyn if (!old_ns) 67ab516013SSerge E. Hallyn return 0; 68ab516013SSerge E. Hallyn 69ab516013SSerge E. Hallyn get_nsproxy(old_ns); 70ab516013SSerge E. Hallyn 71ab516013SSerge E. Hallyn return 0; 72ab516013SSerge E. Hallyn } 73ab516013SSerge E. Hallyn 74ab516013SSerge E. Hallyn void free_nsproxy(struct nsproxy *ns) 75ab516013SSerge E. Hallyn { 76ab516013SSerge E. Hallyn kfree(ns); 77ab516013SSerge E. Hallyn } 78