Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * sysctl.h: General linux system control interface 4 : : * 5 : : * Begun 24 March 1995, Stephen Tweedie 6 : : * 7 : : **************************************************************** 8 : : **************************************************************** 9 : : ** 10 : : ** WARNING: 11 : : ** The values in this file are exported to user space via 12 : : ** the sysctl() binary interface. Do *NOT* change the 13 : : ** numbering of any existing values here, and do not change 14 : : ** any numbers within any one set of values. If you have to 15 : : ** redefine an existing interface, use a new number for it. 16 : : ** The kernel will then return -ENOTDIR to any application using 17 : : ** the old binary interface. 18 : : ** 19 : : **************************************************************** 20 : : **************************************************************** 21 : : */ 22 : : #ifndef _LINUX_SYSCTL_H 23 : : #define _LINUX_SYSCTL_H 24 : : 25 : : #include <linux/list.h> 26 : : #include <linux/rcupdate.h> 27 : : #include <linux/wait.h> 28 : : #include <linux/rbtree.h> 29 : : #include <linux/uidgid.h> 30 : : #include <uapi/linux/sysctl.h> 31 : : 32 : : /* For the /proc/sys support */ 33 : : struct completion; 34 : : struct ctl_table; 35 : : struct nsproxy; 36 : : struct ctl_table_root; 37 : : struct ctl_table_header; 38 : : struct ctl_dir; 39 : : 40 : : /* Keep the same order as in fs/proc/proc_sysctl.c */ 41 : : #define SYSCTL_ZERO ((void *)&sysctl_vals[0]) 42 : : #define SYSCTL_ONE ((void *)&sysctl_vals[1]) 43 : : #define SYSCTL_INT_MAX ((void *)&sysctl_vals[2]) 44 : : 45 : : extern const int sysctl_vals[]; 46 : : 47 : : typedef int proc_handler (struct ctl_table *ctl, int write, 48 : : void __user *buffer, size_t *lenp, loff_t *ppos); 49 : : 50 : : extern int proc_dostring(struct ctl_table *, int, 51 : : void __user *, size_t *, loff_t *); 52 : : extern int proc_dointvec(struct ctl_table *, int, 53 : : void __user *, size_t *, loff_t *); 54 : : extern int proc_douintvec(struct ctl_table *, int, 55 : : void __user *, size_t *, loff_t *); 56 : : extern int proc_dointvec_minmax(struct ctl_table *, int, 57 : : void __user *, size_t *, loff_t *); 58 : : extern int proc_douintvec_minmax(struct ctl_table *table, int write, 59 : : void __user *buffer, size_t *lenp, 60 : : loff_t *ppos); 61 : : extern int proc_dointvec_jiffies(struct ctl_table *, int, 62 : : void __user *, size_t *, loff_t *); 63 : : extern int proc_dointvec_userhz_jiffies(struct ctl_table *, int, 64 : : void __user *, size_t *, loff_t *); 65 : : extern int proc_dointvec_ms_jiffies(struct ctl_table *, int, 66 : : void __user *, size_t *, loff_t *); 67 : : extern int proc_doulongvec_minmax(struct ctl_table *, int, 68 : : void __user *, size_t *, loff_t *); 69 : : extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int, 70 : : void __user *, size_t *, loff_t *); 71 : : extern int proc_do_large_bitmap(struct ctl_table *, int, 72 : : void __user *, size_t *, loff_t *); 73 : : extern int proc_do_static_key(struct ctl_table *table, int write, 74 : : void __user *buffer, size_t *lenp, 75 : : loff_t *ppos); 76 : : 77 : : /* 78 : : * Register a set of sysctl names by calling register_sysctl_table 79 : : * with an initialised array of struct ctl_table's. An entry with 80 : : * NULL procname terminates the table. table->de will be 81 : : * set up by the registration and need not be initialised in advance. 82 : : * 83 : : * sysctl names can be mirrored automatically under /proc/sys. The 84 : : * procname supplied controls /proc naming. 85 : : * 86 : : * The table's mode will be honoured both for sys_sysctl(2) and 87 : : * proc-fs access. 88 : : * 89 : : * Leaf nodes in the sysctl tree will be represented by a single file 90 : : * under /proc; non-leaf nodes will be represented by directories. A 91 : : * null procname disables /proc mirroring at this node. 92 : : * 93 : : * sysctl(2) can automatically manage read and write requests through 94 : : * the sysctl table. The data and maxlen fields of the ctl_table 95 : : * struct enable minimal validation of the values being written to be 96 : : * performed, and the mode field allows minimal authentication. 97 : : * 98 : : * There must be a proc_handler routine for any terminal nodes 99 : : * mirrored under /proc/sys (non-terminals are handled by a built-in 100 : : * directory handler). Several default handlers are available to 101 : : * cover common cases. 102 : : */ 103 : : 104 : : /* Support for userspace poll() to watch for changes */ 105 : : struct ctl_table_poll { 106 : : atomic_t event; 107 : : wait_queue_head_t wait; 108 : : }; 109 : : 110 : : static inline void *proc_sys_poll_event(struct ctl_table_poll *poll) 111 : : { 112 : 3 : return (void *)(unsigned long)atomic_read(&poll->event); 113 : : } 114 : : 115 : : #define __CTL_TABLE_POLL_INITIALIZER(name) { \ 116 : : .event = ATOMIC_INIT(0), \ 117 : : .wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait) } 118 : : 119 : : #define DEFINE_CTL_TABLE_POLL(name) \ 120 : : struct ctl_table_poll name = __CTL_TABLE_POLL_INITIALIZER(name) 121 : : 122 : : /* A sysctl table is an array of struct ctl_table: */ 123 : : struct ctl_table 124 : : { 125 : : const char *procname; /* Text ID for /proc/sys, or zero */ 126 : : void *data; 127 : : int maxlen; 128 : : umode_t mode; 129 : : struct ctl_table *child; /* Deprecated */ 130 : : proc_handler *proc_handler; /* Callback for text formatting */ 131 : : struct ctl_table_poll *poll; 132 : : void *extra1; 133 : : void *extra2; 134 : : } __randomize_layout; 135 : : 136 : : struct ctl_node { 137 : : struct rb_node node; 138 : : struct ctl_table_header *header; 139 : : }; 140 : : 141 : : /* struct ctl_table_header is used to maintain dynamic lists of 142 : : struct ctl_table trees. */ 143 : : struct ctl_table_header 144 : : { 145 : : union { 146 : : struct { 147 : : struct ctl_table *ctl_table; 148 : : int used; 149 : : int count; 150 : : int nreg; 151 : : }; 152 : : struct rcu_head rcu; 153 : : }; 154 : : struct completion *unregistering; 155 : : struct ctl_table *ctl_table_arg; 156 : : struct ctl_table_root *root; 157 : : struct ctl_table_set *set; 158 : : struct ctl_dir *parent; 159 : : struct ctl_node *node; 160 : : struct hlist_head inodes; /* head for proc_inode->sysctl_inodes */ 161 : : }; 162 : : 163 : : struct ctl_dir { 164 : : /* Header must be at the start of ctl_dir */ 165 : : struct ctl_table_header header; 166 : : struct rb_root root; 167 : : }; 168 : : 169 : : struct ctl_table_set { 170 : : int (*is_seen)(struct ctl_table_set *); 171 : : struct ctl_dir dir; 172 : : }; 173 : : 174 : : struct ctl_table_root { 175 : : struct ctl_table_set default_set; 176 : : struct ctl_table_set *(*lookup)(struct ctl_table_root *root); 177 : : void (*set_ownership)(struct ctl_table_header *head, 178 : : struct ctl_table *table, 179 : : kuid_t *uid, kgid_t *gid); 180 : : int (*permissions)(struct ctl_table_header *head, struct ctl_table *table); 181 : : }; 182 : : 183 : : /* struct ctl_path describes where in the hierarchy a table is added */ 184 : : struct ctl_path { 185 : : const char *procname; 186 : : }; 187 : : 188 : : #ifdef CONFIG_SYSCTL 189 : : 190 : : void proc_sys_poll_notify(struct ctl_table_poll *poll); 191 : : 192 : : extern void setup_sysctl_set(struct ctl_table_set *p, 193 : : struct ctl_table_root *root, 194 : : int (*is_seen)(struct ctl_table_set *)); 195 : : extern void retire_sysctl_set(struct ctl_table_set *set); 196 : : 197 : : struct ctl_table_header *__register_sysctl_table( 198 : : struct ctl_table_set *set, 199 : : const char *path, struct ctl_table *table); 200 : : struct ctl_table_header *__register_sysctl_paths( 201 : : struct ctl_table_set *set, 202 : : const struct ctl_path *path, struct ctl_table *table); 203 : : struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table); 204 : : struct ctl_table_header *register_sysctl_table(struct ctl_table * table); 205 : : struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path, 206 : : struct ctl_table *table); 207 : : 208 : : void unregister_sysctl_table(struct ctl_table_header * table); 209 : : 210 : : extern int sysctl_init(void); 211 : : 212 : : extern struct ctl_table sysctl_mount_point[]; 213 : : 214 : : #else /* CONFIG_SYSCTL */ 215 : : static inline struct ctl_table_header *register_sysctl_table(struct ctl_table * table) 216 : : { 217 : : return NULL; 218 : : } 219 : : 220 : : static inline struct ctl_table_header *register_sysctl_paths( 221 : : const struct ctl_path *path, struct ctl_table *table) 222 : : { 223 : : return NULL; 224 : : } 225 : : 226 : : static inline struct ctl_table_header *register_sysctl(const char *path, struct ctl_table *table) 227 : : { 228 : : return NULL; 229 : : } 230 : : 231 : : static inline void unregister_sysctl_table(struct ctl_table_header * table) 232 : : { 233 : : } 234 : : 235 : : static inline void setup_sysctl_set(struct ctl_table_set *p, 236 : : struct ctl_table_root *root, 237 : : int (*is_seen)(struct ctl_table_set *)) 238 : : { 239 : : } 240 : : 241 : : #endif /* CONFIG_SYSCTL */ 242 : : 243 : : int sysctl_max_threads(struct ctl_table *table, int write, 244 : : void __user *buffer, size_t *lenp, loff_t *ppos); 245 : : 246 : : #endif /* _LINUX_SYSCTL_H */