Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_PID_NS_H 3 : : #define _LINUX_PID_NS_H 4 : : 5 : : #include <linux/sched.h> 6 : : #include <linux/bug.h> 7 : : #include <linux/mm.h> 8 : : #include <linux/workqueue.h> 9 : : #include <linux/threads.h> 10 : : #include <linux/nsproxy.h> 11 : : #include <linux/kref.h> 12 : : #include <linux/ns_common.h> 13 : : #include <linux/idr.h> 14 : : 15 : : /* MAX_PID_NS_LEVEL is needed for limiting size of 'struct pid' */ 16 : : #define MAX_PID_NS_LEVEL 32 17 : : 18 : : struct fs_pin; 19 : : 20 : : enum { /* definitions for pid_namespace's hide_pid field */ 21 : : HIDEPID_OFF = 0, 22 : : HIDEPID_NO_ACCESS = 1, 23 : : HIDEPID_INVISIBLE = 2, 24 : : }; 25 : : 26 : : struct pid_namespace { 27 : : struct kref kref; 28 : : struct idr idr; 29 : : struct rcu_head rcu; 30 : : unsigned int pid_allocated; 31 : : struct task_struct *child_reaper; 32 : : struct kmem_cache *pid_cachep; 33 : : unsigned int level; 34 : : struct pid_namespace *parent; 35 : : #ifdef CONFIG_PROC_FS 36 : : struct vfsmount *proc_mnt; 37 : : struct dentry *proc_self; 38 : : struct dentry *proc_thread_self; 39 : : #endif 40 : : #ifdef CONFIG_BSD_PROCESS_ACCT 41 : : struct fs_pin *bacct; 42 : : #endif 43 : : struct user_namespace *user_ns; 44 : : struct ucounts *ucounts; 45 : : struct work_struct proc_work; 46 : : kgid_t pid_gid; 47 : : int hide_pid; 48 : : int reboot; /* group exit code if this pidns was rebooted */ 49 : : struct ns_common ns; 50 : : } __randomize_layout; 51 : : 52 : : extern struct pid_namespace init_pid_ns; 53 : : 54 : : #define PIDNS_ADDING (1U << 31) 55 : : 56 : : #ifdef CONFIG_PID_NS 57 : 14224 : static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns) 58 : : { 59 [ - + - + : 14224 : if (ns != &init_pid_ns) - + - - - + - - ] 60 : 0 : kref_get(&ns->kref); 61 [ - + ]: 14224 : return ns; 62 : : } 63 : : 64 : : extern struct pid_namespace *copy_pid_ns(unsigned long flags, 65 : : struct user_namespace *user_ns, struct pid_namespace *ns); 66 : : extern void zap_pid_ns_processes(struct pid_namespace *pid_ns); 67 : : extern int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd); 68 : : extern void put_pid_ns(struct pid_namespace *ns); 69 : : 70 : : #else /* !CONFIG_PID_NS */ 71 : : #include <linux/err.h> 72 : : 73 : : static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns) 74 : : { 75 : : return ns; 76 : : } 77 : : 78 : : static inline struct pid_namespace *copy_pid_ns(unsigned long flags, 79 : : struct user_namespace *user_ns, struct pid_namespace *ns) 80 : : { 81 : : if (flags & CLONE_NEWPID) 82 : : ns = ERR_PTR(-EINVAL); 83 : : return ns; 84 : : } 85 : : 86 : : static inline void put_pid_ns(struct pid_namespace *ns) 87 : : { 88 : : } 89 : : 90 : : static inline void zap_pid_ns_processes(struct pid_namespace *ns) 91 : : { 92 : : BUG(); 93 : : } 94 : : 95 : : static inline int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) 96 : : { 97 : : return 0; 98 : : } 99 : : #endif /* CONFIG_PID_NS */ 100 : : 101 : : extern struct pid_namespace *task_active_pid_ns(struct task_struct *tsk); 102 : : void pidhash_init(void); 103 : : void pid_idr_init(void); 104 : : 105 : : #endif /* _LINUX_PID_NS_H */