aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/proc_fs.h
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2010-03-07 19:41:34 -0500
committerEric W. Biederman <ebiederm@xmission.com>2011-05-10 17:31:44 -0400
commit6b4e306aa3dc94a0545eb9279475b1ab6209a31f (patch)
treeca8c6dec0805076f0b5ba7c547e3cb2004e3aea2 /include/linux/proc_fs.h
parent0ee5623f9a6e52df90a78bd21179f8ab370e102e (diff)
ns: proc files for namespace naming policy.
Create files under /proc/<pid>/ns/ to allow controlling the namespaces of a process. This addresses three specific problems that can make namespaces hard to work with. - Namespaces require a dedicated process to pin them in memory. - It is not possible to use a namespace unless you are the child of the original creator. - Namespaces don't have names that userspace can use to talk about them. The namespace files under /proc/<pid>/ns/ can be opened and the file descriptor can be used to talk about a specific namespace, and to keep the specified namespace alive. A namespace can be kept alive by either holding the file descriptor open or bind mounting the file someplace else. aka: mount --bind /proc/self/ns/net /some/filesystem/path mount --bind /proc/self/fd/<N> /some/filesystem/path This allows namespaces to be named with userspace policy. It requires additional support to make use of these filedescriptors and that will be comming in the following patches. Acked-by: Daniel Lezcano <daniel.lezcano@free.fr> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'include/linux/proc_fs.h')
-rw-r--r--include/linux/proc_fs.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index 838c1149251a..a6d2c6da5e5a 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -179,6 +179,8 @@ extern void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file);
179extern struct file *get_mm_exe_file(struct mm_struct *mm); 179extern struct file *get_mm_exe_file(struct mm_struct *mm);
180extern void dup_mm_exe_file(struct mm_struct *oldmm, struct mm_struct *newmm); 180extern void dup_mm_exe_file(struct mm_struct *oldmm, struct mm_struct *newmm);
181 181
182extern struct file *proc_ns_fget(int fd);
183
182#else 184#else
183 185
184#define proc_net_fops_create(net, name, mode, fops) ({ (void)(mode), NULL; }) 186#define proc_net_fops_create(net, name, mode, fops) ({ (void)(mode), NULL; })
@@ -239,6 +241,11 @@ static inline void dup_mm_exe_file(struct mm_struct *oldmm,
239 struct mm_struct *newmm) 241 struct mm_struct *newmm)
240{} 242{}
241 243
244static inline struct file *proc_ns_fget(int fd)
245{
246 return ERR_PTR(-EINVAL);
247}
248
242#endif /* CONFIG_PROC_FS */ 249#endif /* CONFIG_PROC_FS */
243 250
244#if !defined(CONFIG_PROC_KCORE) 251#if !defined(CONFIG_PROC_KCORE)
@@ -250,6 +257,15 @@ kclist_add(struct kcore_list *new, void *addr, size_t size, int type)
250extern void kclist_add(struct kcore_list *, void *, size_t, int type); 257extern void kclist_add(struct kcore_list *, void *, size_t, int type);
251#endif 258#endif
252 259
260struct nsproxy;
261struct proc_ns_operations {
262 const char *name;
263 int type;
264 void *(*get)(struct task_struct *task);
265 void (*put)(void *ns);
266 int (*install)(struct nsproxy *nsproxy, void *ns);
267};
268
253union proc_op { 269union proc_op {
254 int (*proc_get_link)(struct inode *, struct path *); 270 int (*proc_get_link)(struct inode *, struct path *);
255 int (*proc_read)(struct task_struct *task, char *page); 271 int (*proc_read)(struct task_struct *task, char *page);
@@ -268,6 +284,8 @@ struct proc_inode {
268 struct proc_dir_entry *pde; 284 struct proc_dir_entry *pde;
269 struct ctl_table_header *sysctl; 285 struct ctl_table_header *sysctl;
270 struct ctl_table *sysctl_entry; 286 struct ctl_table *sysctl_entry;
287 void *ns;
288 const struct proc_ns_operations *ns_ops;
271 struct inode vfs_inode; 289 struct inode vfs_inode;
272}; 290};
273 291