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