1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * procfs namespace bits |
4 | */ |
5 | #ifndef _LINUX_PROC_NS_H |
6 | #define _LINUX_PROC_NS_H |
7 | |
8 | #include <linux/ns_common.h> |
9 | |
10 | struct pid_namespace; |
11 | struct nsset; |
12 | struct path; |
13 | struct task_struct; |
14 | struct inode; |
15 | |
16 | struct proc_ns_operations { |
17 | const char *name; |
18 | const char *real_ns_name; |
19 | int type; |
20 | struct ns_common *(*get)(struct task_struct *task); |
21 | void (*put)(struct ns_common *ns); |
22 | int (*install)(struct nsset *nsset, struct ns_common *ns); |
23 | struct user_namespace *(*owner)(struct ns_common *ns); |
24 | struct ns_common *(*get_parent)(struct ns_common *ns); |
25 | } __randomize_layout; |
26 | |
27 | extern const struct proc_ns_operations netns_operations; |
28 | extern const struct proc_ns_operations utsns_operations; |
29 | extern const struct proc_ns_operations ipcns_operations; |
30 | extern const struct proc_ns_operations pidns_operations; |
31 | extern const struct proc_ns_operations pidns_for_children_operations; |
32 | extern const struct proc_ns_operations userns_operations; |
33 | extern const struct proc_ns_operations mntns_operations; |
34 | extern const struct proc_ns_operations cgroupns_operations; |
35 | extern const struct proc_ns_operations timens_operations; |
36 | extern const struct proc_ns_operations timens_for_children_operations; |
37 | |
38 | /* |
39 | * We always define these enumerators |
40 | */ |
41 | enum { |
42 | PROC_ROOT_INO = 1, |
43 | PROC_IPC_INIT_INO = 0xEFFFFFFFU, |
44 | PROC_UTS_INIT_INO = 0xEFFFFFFEU, |
45 | PROC_USER_INIT_INO = 0xEFFFFFFDU, |
46 | PROC_PID_INIT_INO = 0xEFFFFFFCU, |
47 | PROC_CGROUP_INIT_INO = 0xEFFFFFFBU, |
48 | PROC_TIME_INIT_INO = 0xEFFFFFFAU, |
49 | }; |
50 | |
51 | #ifdef CONFIG_PROC_FS |
52 | |
53 | extern int proc_alloc_inum(unsigned int *pino); |
54 | extern void proc_free_inum(unsigned int inum); |
55 | |
56 | #else /* CONFIG_PROC_FS */ |
57 | |
58 | static inline int proc_alloc_inum(unsigned int *inum) |
59 | { |
60 | *inum = 1; |
61 | return 0; |
62 | } |
63 | static inline void proc_free_inum(unsigned int inum) {} |
64 | |
65 | #endif /* CONFIG_PROC_FS */ |
66 | |
67 | static inline int ns_alloc_inum(struct ns_common *ns) |
68 | { |
69 | WRITE_ONCE(ns->stashed, NULL); |
70 | return proc_alloc_inum(pino: &ns->inum); |
71 | } |
72 | |
73 | #define ns_free_inum(ns) proc_free_inum((ns)->inum) |
74 | |
75 | #define get_proc_ns(inode) ((struct ns_common *)(inode)->i_private) |
76 | extern int ns_get_path(struct path *path, struct task_struct *task, |
77 | const struct proc_ns_operations *ns_ops); |
78 | typedef struct ns_common *ns_get_path_helper_t(void *); |
79 | extern int ns_get_path_cb(struct path *path, ns_get_path_helper_t ns_get_cb, |
80 | void *private_data); |
81 | |
82 | extern bool ns_match(const struct ns_common *ns, dev_t dev, ino_t ino); |
83 | |
84 | extern int ns_get_name(char *buf, size_t size, struct task_struct *task, |
85 | const struct proc_ns_operations *ns_ops); |
86 | extern void nsfs_init(void); |
87 | |
88 | #endif /* _LINUX_PROC_NS_H */ |
89 | |