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 struct pid_namespace { 21 struct kref kref; 22 struct idr idr; 23 struct rcu_head rcu; 24 unsigned int pid_allocated; 25 struct task_struct *child_reaper; 26 struct kmem_cache *pid_cachep; 27 unsigned int level; 28 struct pid_namespace *parent; 29 #ifdef CONFIG_BSD_PROCESS_ACCT 30 struct fs_pin *bacct; 31 #endif 32 struct user_namespace *user_ns; 33 struct ucounts *ucounts; 34 int reboot; /* group exit code if this pidns was rebooted */ 35 struct ns_common ns; 36 } __randomize_layout; 37 38 extern struct pid_namespace init_pid_ns; 39 40 #define PIDNS_ADDING (1U << 31) 41 42 #ifdef CONFIG_PID_NS get_pid_ns(struct pid_namespace * ns)43static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns) 44 { 45 if (ns != &init_pid_ns) 46 kref_get(&ns->kref); 47 return ns; 48 } 49 50 extern struct pid_namespace *copy_pid_ns(unsigned long flags, 51 struct user_namespace *user_ns, struct pid_namespace *ns); 52 extern void zap_pid_ns_processes(struct pid_namespace *pid_ns); 53 extern int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd); 54 extern void put_pid_ns(struct pid_namespace *ns); 55 56 #else /* !CONFIG_PID_NS */ 57 #include <linux/err.h> 58 get_pid_ns(struct pid_namespace * ns)59static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns) 60 { 61 return ns; 62 } 63 copy_pid_ns(unsigned long flags,struct user_namespace * user_ns,struct pid_namespace * ns)64static inline struct pid_namespace *copy_pid_ns(unsigned long flags, 65 struct user_namespace *user_ns, struct pid_namespace *ns) 66 { 67 if (flags & CLONE_NEWPID) 68 ns = ERR_PTR(-EINVAL); 69 return ns; 70 } 71 put_pid_ns(struct pid_namespace * ns)72static inline void put_pid_ns(struct pid_namespace *ns) 73 { 74 } 75 zap_pid_ns_processes(struct pid_namespace * ns)76static inline void zap_pid_ns_processes(struct pid_namespace *ns) 77 { 78 BUG(); 79 } 80 reboot_pid_ns(struct pid_namespace * pid_ns,int cmd)81static inline int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) 82 { 83 return 0; 84 } 85 #endif /* CONFIG_PID_NS */ 86 87 extern struct pid_namespace *task_active_pid_ns(struct task_struct *tsk); 88 void pidhash_init(void); 89 void pid_idr_init(void); 90 91 #endif /* _LINUX_PID_NS_H */ 92