Merge commit 'v2.6.34-rc7' into perf/nmi
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / sysctl.c
CommitLineData
1da177e4
LT
1/*
2 * sysctl.c: General linux system control interface
3 *
4 * Begun 24 March 1995, Stephen Tweedie
5 * Added /proc support, Dec 1995
6 * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas.
7 * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver.
8 * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver.
9 * Dynamic registration fixes, Stephen Tweedie.
10 * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn.
11 * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris
12 * Horn.
13 * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer.
14 * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
15 * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
16 * Wendling.
17 * The list_for_each() macro wasn't appropriate for the sysctl loop.
18 * Removed it and replaced it with older style, 03/23/00, Bill Wendling
19 */
20
1da177e4
LT
21#include <linux/module.h>
22#include <linux/mm.h>
23#include <linux/swap.h>
24#include <linux/slab.h>
25#include <linux/sysctl.h>
d33ed52d 26#include <linux/signal.h>
1da177e4 27#include <linux/proc_fs.h>
72c2d582 28#include <linux/security.h>
1da177e4 29#include <linux/ctype.h>
dfec072e 30#include <linux/kmemcheck.h>
62239ac2 31#include <linux/fs.h>
1da177e4
LT
32#include <linux/init.h>
33#include <linux/kernel.h>
0296b228 34#include <linux/kobject.h>
20380731 35#include <linux/net.h>
1da177e4
LT
36#include <linux/sysrq.h>
37#include <linux/highuid.h>
38#include <linux/writeback.h>
3fff4c42 39#include <linux/ratelimit.h>
1da177e4 40#include <linux/hugetlb.h>
1da177e4 41#include <linux/initrd.h>
0b77f5bf 42#include <linux/key.h>
1da177e4
LT
43#include <linux/times.h>
44#include <linux/limits.h>
45#include <linux/dcache.h>
46#include <linux/syscalls.h>
c748e134 47#include <linux/vmstat.h>
c255d844
PM
48#include <linux/nfs_fs.h>
49#include <linux/acpi.h>
10a0a8d4 50#include <linux/reboot.h>
b0fc494f 51#include <linux/ftrace.h>
12e22c5e 52#include <linux/slow-work.h>
cdd6c482 53#include <linux/perf_event.h>
b2be84df 54#include <linux/kprobes.h>
1da177e4
LT
55
56#include <asm/uaccess.h>
57#include <asm/processor.h>
58
29cbc78b
AK
59#ifdef CONFIG_X86
60#include <asm/nmi.h>
0741f4d2 61#include <asm/stacktrace.h>
6e7c4025 62#include <asm/io.h>
29cbc78b 63#endif
c55b7c3e
DY
64#ifdef CONFIG_BSD_PROCESS_ACCT
65#include <linux/acct.h>
66#endif
4f0e056f
DY
67#ifdef CONFIG_RT_MUTEXES
68#include <linux/rtmutex.h>
69#endif
2edf5e49
DY
70#if defined(CONFIG_PROVE_LOCKING) || defined(CONFIG_LOCK_STAT)
71#include <linux/lockdep.h>
72#endif
15485a46
DY
73#ifdef CONFIG_CHR_DEV_SG
74#include <scsi/sg.h>
75#endif
29cbc78b 76
504d7cf1
DZ
77#ifdef CONFIG_NMI_WATCHDOG
78#include <linux/nmi.h>
79#endif
80
7058cb02 81
1da177e4
LT
82#if defined(CONFIG_SYSCTL)
83
84/* External variables not in a header file. */
1da177e4
LT
85extern int sysctl_overcommit_memory;
86extern int sysctl_overcommit_ratio;
fadd8fbd 87extern int sysctl_panic_on_oom;
fe071d7e 88extern int sysctl_oom_kill_allocating_task;
fef1bdd6 89extern int sysctl_oom_dump_tasks;
1da177e4 90extern int max_threads;
1da177e4 91extern int core_uses_pid;
d6e71144 92extern int suid_dumpable;
1da177e4 93extern char core_pattern[];
a293980c 94extern unsigned int core_pipe_limit;
1da177e4
LT
95extern int pid_max;
96extern int min_free_kbytes;
1da177e4 97extern int pid_max_min, pid_max_max;
9d0243bc 98extern int sysctl_drop_caches;
8ad4b1fb 99extern int percpu_pagelist_fraction;
bebfa101 100extern int compat_log;
9745512c 101extern int latencytop_enabled;
eceea0b3 102extern int sysctl_nr_open_min, sysctl_nr_open_max;
dd8632a1
PM
103#ifndef CONFIG_MMU
104extern int sysctl_nr_trim_pages;
105#endif
cb684b5b 106#ifdef CONFIG_BLOCK
5e605b64 107extern int blk_iopoll_enabled;
cb684b5b 108#endif
1da177e4 109
c4f3b63f 110/* Constants used for minimum and maximum */
195cf453 111#ifdef CONFIG_DETECT_SOFTLOCKUP
c4f3b63f 112static int sixty = 60;
9383d967 113static int neg_one = -1;
c4f3b63f
RT
114#endif
115
c4f3b63f 116static int zero;
cd5f9a4c
LT
117static int __maybe_unused one = 1;
118static int __maybe_unused two = 2;
fc3501d4 119static unsigned long one_ul = 1;
c4f3b63f 120static int one_hundred = 100;
af91322e
DY
121#ifdef CONFIG_PRINTK
122static int ten_thousand = 10000;
123#endif
c4f3b63f 124
9e4a5bda
AR
125/* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
126static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
127
1da177e4
LT
128/* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
129static int maxolduid = 65535;
130static int minolduid;
8ad4b1fb 131static int min_percpu_pagelist_fract = 8;
1da177e4
LT
132
133static int ngroups_max = NGROUPS_MAX;
134
72c57ed5 135#ifdef CONFIG_SPARC
17f04fbb 136#include <asm/system.h>
1da177e4
LT
137#endif
138
0871420f
DM
139#ifdef CONFIG_SPARC64
140extern int sysctl_tsb_ratio;
141#endif
142
1da177e4
LT
143#ifdef __hppa__
144extern int pwrsw_enabled;
145extern int unaligned_enabled;
146#endif
147
347a8dc3 148#ifdef CONFIG_S390
1da177e4
LT
149#ifdef CONFIG_MATHEMU
150extern int sysctl_ieee_emulation_warnings;
151#endif
152extern int sysctl_userprocess_debug;
951f22d5 153extern int spin_retry;
1da177e4
LT
154#endif
155
d2b176ed
JS
156#ifdef CONFIG_IA64
157extern int no_unaligned_warning;
88fc241f 158extern int unaligned_dump_stack;
d2b176ed
JS
159#endif
160
3fff4c42
IM
161extern struct ratelimit_state printk_ratelimit_state;
162
d6f8ff73 163#ifdef CONFIG_PROC_SYSCTL
8d65af78 164static int proc_do_cad_pid(struct ctl_table *table, int write,
9ec52099 165 void __user *buffer, size_t *lenp, loff_t *ppos);
8d65af78 166static int proc_taint(struct ctl_table *table, int write,
34f5a398 167 void __user *buffer, size_t *lenp, loff_t *ppos);
d6f8ff73 168#endif
9ec52099 169
d8217f07 170static struct ctl_table root_table[];
e51b6ba0
EB
171static struct ctl_table_root sysctl_table_root;
172static struct ctl_table_header root_table_header = {
b380b0d4 173 .count = 1,
e51b6ba0 174 .ctl_table = root_table,
73455092 175 .ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list),
e51b6ba0 176 .root = &sysctl_table_root,
73455092 177 .set = &sysctl_table_root.default_set,
e51b6ba0
EB
178};
179static struct ctl_table_root sysctl_table_root = {
180 .root_list = LIST_HEAD_INIT(sysctl_table_root.root_list),
73455092 181 .default_set.list = LIST_HEAD_INIT(root_table_header.ctl_entry),
e51b6ba0 182};
1da177e4 183
d8217f07
EB
184static struct ctl_table kern_table[];
185static struct ctl_table vm_table[];
186static struct ctl_table fs_table[];
187static struct ctl_table debug_table[];
188static struct ctl_table dev_table[];
189extern struct ctl_table random_table[];
2d9048e2 190#ifdef CONFIG_INOTIFY_USER
d8217f07 191extern struct ctl_table inotify_table[];
0399cb08 192#endif
7ef9964e
DL
193#ifdef CONFIG_EPOLL
194extern struct ctl_table epoll_table[];
195#endif
1da177e4
LT
196
197#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
198int sysctl_legacy_va_layout;
199#endif
200
1da177e4
LT
201/* The default sysctl tables: */
202
d8217f07 203static struct ctl_table root_table[] = {
1da177e4 204 {
1da177e4
LT
205 .procname = "kernel",
206 .mode = 0555,
207 .child = kern_table,
208 },
209 {
1da177e4
LT
210 .procname = "vm",
211 .mode = 0555,
212 .child = vm_table,
213 },
1da177e4 214 {
1da177e4
LT
215 .procname = "fs",
216 .mode = 0555,
217 .child = fs_table,
218 },
219 {
1da177e4
LT
220 .procname = "debug",
221 .mode = 0555,
222 .child = debug_table,
223 },
224 {
1da177e4
LT
225 .procname = "dev",
226 .mode = 0555,
227 .child = dev_table,
228 },
2be7fe07
AM
229/*
230 * NOTE: do not add new entries to this table unless you have read
231 * Documentation/sysctl/ctl_unnumbered.txt
232 */
6fce56ec 233 { }
1da177e4
LT
234};
235
77e54a1f 236#ifdef CONFIG_SCHED_DEBUG
73c4efd2
ED
237static int min_sched_granularity_ns = 100000; /* 100 usecs */
238static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */
239static int min_wakeup_granularity_ns; /* 0 usecs */
240static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */
1983a922
CE
241static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE;
242static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1;
acb4a848
CE
243static int min_sched_shares_ratelimit = 100000; /* 100 usec */
244static int max_sched_shares_ratelimit = NSEC_PER_SEC; /* 1 second */
77e54a1f
IM
245#endif
246
d8217f07 247static struct ctl_table kern_table[] = {
2bba22c5 248 {
2bba22c5
MG
249 .procname = "sched_child_runs_first",
250 .data = &sysctl_sched_child_runs_first,
251 .maxlen = sizeof(unsigned int),
252 .mode = 0644,
6d456111 253 .proc_handler = proc_dointvec,
2bba22c5 254 },
77e54a1f
IM
255#ifdef CONFIG_SCHED_DEBUG
256 {
b2be5e96
PZ
257 .procname = "sched_min_granularity_ns",
258 .data = &sysctl_sched_min_granularity,
77e54a1f
IM
259 .maxlen = sizeof(unsigned int),
260 .mode = 0644,
702a7c76 261 .proc_handler = sched_proc_update_handler,
b2be5e96
PZ
262 .extra1 = &min_sched_granularity_ns,
263 .extra2 = &max_sched_granularity_ns,
77e54a1f 264 },
21805085 265 {
21805085
PZ
266 .procname = "sched_latency_ns",
267 .data = &sysctl_sched_latency,
268 .maxlen = sizeof(unsigned int),
269 .mode = 0644,
702a7c76 270 .proc_handler = sched_proc_update_handler,
21805085
PZ
271 .extra1 = &min_sched_granularity_ns,
272 .extra2 = &max_sched_granularity_ns,
273 },
77e54a1f 274 {
77e54a1f
IM
275 .procname = "sched_wakeup_granularity_ns",
276 .data = &sysctl_sched_wakeup_granularity,
277 .maxlen = sizeof(unsigned int),
278 .mode = 0644,
702a7c76 279 .proc_handler = sched_proc_update_handler,
77e54a1f
IM
280 .extra1 = &min_wakeup_granularity_ns,
281 .extra2 = &max_wakeup_granularity_ns,
282 },
2398f2c6 283 {
2398f2c6
PZ
284 .procname = "sched_shares_ratelimit",
285 .data = &sysctl_sched_shares_ratelimit,
286 .maxlen = sizeof(unsigned int),
287 .mode = 0644,
702a7c76 288 .proc_handler = sched_proc_update_handler,
acb4a848
CE
289 .extra1 = &min_sched_shares_ratelimit,
290 .extra2 = &max_sched_shares_ratelimit,
2398f2c6 291 },
1983a922 292 {
1983a922
CE
293 .procname = "sched_tunable_scaling",
294 .data = &sysctl_sched_tunable_scaling,
295 .maxlen = sizeof(enum sched_tunable_scaling),
296 .mode = 0644,
702a7c76 297 .proc_handler = sched_proc_update_handler,
1983a922
CE
298 .extra1 = &min_sched_tunable_scaling,
299 .extra2 = &max_sched_tunable_scaling,
2398f2c6 300 },
ffda12a1 301 {
ffda12a1
PZ
302 .procname = "sched_shares_thresh",
303 .data = &sysctl_sched_shares_thresh,
304 .maxlen = sizeof(unsigned int),
305 .mode = 0644,
6d456111 306 .proc_handler = proc_dointvec_minmax,
ffda12a1
PZ
307 .extra1 = &zero,
308 },
da84d961 309 {
da84d961
IM
310 .procname = "sched_migration_cost",
311 .data = &sysctl_sched_migration_cost,
312 .maxlen = sizeof(unsigned int),
313 .mode = 0644,
6d456111 314 .proc_handler = proc_dointvec,
da84d961 315 },
b82d9fdd 316 {
b82d9fdd
PZ
317 .procname = "sched_nr_migrate",
318 .data = &sysctl_sched_nr_migrate,
319 .maxlen = sizeof(unsigned int),
fa85ae24 320 .mode = 0644,
6d456111 321 .proc_handler = proc_dointvec,
fa85ae24 322 },
e9e9250b 323 {
e9e9250b
PZ
324 .procname = "sched_time_avg",
325 .data = &sysctl_sched_time_avg,
326 .maxlen = sizeof(unsigned int),
327 .mode = 0644,
6d456111 328 .proc_handler = proc_dointvec,
e9e9250b 329 },
cd1bb94b 330 {
cd1bb94b
AB
331 .procname = "timer_migration",
332 .data = &sysctl_timer_migration,
333 .maxlen = sizeof(unsigned int),
334 .mode = 0644,
6d456111 335 .proc_handler = proc_dointvec_minmax,
bfdb4d9f
AB
336 .extra1 = &zero,
337 .extra2 = &one,
fa85ae24 338 },
1fc84aaa 339#endif
9f0c1e56 340 {
9f0c1e56
PZ
341 .procname = "sched_rt_period_us",
342 .data = &sysctl_sched_rt_period,
343 .maxlen = sizeof(unsigned int),
344 .mode = 0644,
6d456111 345 .proc_handler = sched_rt_handler,
9f0c1e56
PZ
346 },
347 {
9f0c1e56
PZ
348 .procname = "sched_rt_runtime_us",
349 .data = &sysctl_sched_rt_runtime,
350 .maxlen = sizeof(int),
351 .mode = 0644,
6d456111 352 .proc_handler = sched_rt_handler,
9f0c1e56 353 },
1799e35d 354 {
1799e35d
IM
355 .procname = "sched_compat_yield",
356 .data = &sysctl_sched_compat_yield,
357 .maxlen = sizeof(unsigned int),
358 .mode = 0644,
6d456111 359 .proc_handler = proc_dointvec,
1799e35d 360 },
f20786ff
PZ
361#ifdef CONFIG_PROVE_LOCKING
362 {
f20786ff
PZ
363 .procname = "prove_locking",
364 .data = &prove_locking,
365 .maxlen = sizeof(int),
366 .mode = 0644,
6d456111 367 .proc_handler = proc_dointvec,
f20786ff
PZ
368 },
369#endif
370#ifdef CONFIG_LOCK_STAT
371 {
f20786ff
PZ
372 .procname = "lock_stat",
373 .data = &lock_stat,
374 .maxlen = sizeof(int),
375 .mode = 0644,
6d456111 376 .proc_handler = proc_dointvec,
f20786ff 377 },
77e54a1f 378#endif
1da177e4 379 {
1da177e4
LT
380 .procname = "panic",
381 .data = &panic_timeout,
382 .maxlen = sizeof(int),
383 .mode = 0644,
6d456111 384 .proc_handler = proc_dointvec,
1da177e4
LT
385 },
386 {
1da177e4
LT
387 .procname = "core_uses_pid",
388 .data = &core_uses_pid,
389 .maxlen = sizeof(int),
390 .mode = 0644,
6d456111 391 .proc_handler = proc_dointvec,
1da177e4
LT
392 },
393 {
1da177e4
LT
394 .procname = "core_pattern",
395 .data = core_pattern,
71ce92f3 396 .maxlen = CORENAME_MAX_SIZE,
1da177e4 397 .mode = 0644,
6d456111 398 .proc_handler = proc_dostring,
1da177e4 399 },
a293980c 400 {
a293980c
NH
401 .procname = "core_pipe_limit",
402 .data = &core_pipe_limit,
403 .maxlen = sizeof(unsigned int),
404 .mode = 0644,
6d456111 405 .proc_handler = proc_dointvec,
a293980c 406 },
34f5a398 407#ifdef CONFIG_PROC_SYSCTL
1da177e4 408 {
1da177e4 409 .procname = "tainted",
25ddbb18 410 .maxlen = sizeof(long),
34f5a398 411 .mode = 0644,
6d456111 412 .proc_handler = proc_taint,
1da177e4 413 },
34f5a398 414#endif
9745512c
AV
415#ifdef CONFIG_LATENCYTOP
416 {
417 .procname = "latencytop",
418 .data = &latencytop_enabled,
419 .maxlen = sizeof(int),
420 .mode = 0644,
6d456111 421 .proc_handler = proc_dointvec,
9745512c
AV
422 },
423#endif
1da177e4
LT
424#ifdef CONFIG_BLK_DEV_INITRD
425 {
1da177e4
LT
426 .procname = "real-root-dev",
427 .data = &real_root_dev,
428 .maxlen = sizeof(int),
429 .mode = 0644,
6d456111 430 .proc_handler = proc_dointvec,
1da177e4
LT
431 },
432#endif
45807a1d 433 {
45807a1d
IM
434 .procname = "print-fatal-signals",
435 .data = &print_fatal_signals,
436 .maxlen = sizeof(int),
437 .mode = 0644,
6d456111 438 .proc_handler = proc_dointvec,
45807a1d 439 },
72c57ed5 440#ifdef CONFIG_SPARC
1da177e4 441 {
1da177e4
LT
442 .procname = "reboot-cmd",
443 .data = reboot_command,
444 .maxlen = 256,
445 .mode = 0644,
6d456111 446 .proc_handler = proc_dostring,
1da177e4
LT
447 },
448 {
1da177e4
LT
449 .procname = "stop-a",
450 .data = &stop_a_enabled,
451 .maxlen = sizeof (int),
452 .mode = 0644,
6d456111 453 .proc_handler = proc_dointvec,
1da177e4
LT
454 },
455 {
1da177e4
LT
456 .procname = "scons-poweroff",
457 .data = &scons_pwroff,
458 .maxlen = sizeof (int),
459 .mode = 0644,
6d456111 460 .proc_handler = proc_dointvec,
1da177e4
LT
461 },
462#endif
0871420f
DM
463#ifdef CONFIG_SPARC64
464 {
0871420f
DM
465 .procname = "tsb-ratio",
466 .data = &sysctl_tsb_ratio,
467 .maxlen = sizeof (int),
468 .mode = 0644,
6d456111 469 .proc_handler = proc_dointvec,
0871420f
DM
470 },
471#endif
1da177e4
LT
472#ifdef __hppa__
473 {
1da177e4
LT
474 .procname = "soft-power",
475 .data = &pwrsw_enabled,
476 .maxlen = sizeof (int),
477 .mode = 0644,
6d456111 478 .proc_handler = proc_dointvec,
1da177e4
LT
479 },
480 {
1da177e4
LT
481 .procname = "unaligned-trap",
482 .data = &unaligned_enabled,
483 .maxlen = sizeof (int),
484 .mode = 0644,
6d456111 485 .proc_handler = proc_dointvec,
1da177e4
LT
486 },
487#endif
488 {
1da177e4
LT
489 .procname = "ctrl-alt-del",
490 .data = &C_A_D,
491 .maxlen = sizeof(int),
492 .mode = 0644,
6d456111 493 .proc_handler = proc_dointvec,
1da177e4 494 },
606576ce 495#ifdef CONFIG_FUNCTION_TRACER
b0fc494f 496 {
b0fc494f
SR
497 .procname = "ftrace_enabled",
498 .data = &ftrace_enabled,
499 .maxlen = sizeof(int),
500 .mode = 0644,
6d456111 501 .proc_handler = ftrace_enable_sysctl,
b0fc494f
SR
502 },
503#endif
f38f1d2a
SR
504#ifdef CONFIG_STACK_TRACER
505 {
f38f1d2a
SR
506 .procname = "stack_tracer_enabled",
507 .data = &stack_tracer_enabled,
508 .maxlen = sizeof(int),
509 .mode = 0644,
6d456111 510 .proc_handler = stack_trace_sysctl,
f38f1d2a
SR
511 },
512#endif
944ac425
SR
513#ifdef CONFIG_TRACING
514 {
3299b4dd 515 .procname = "ftrace_dump_on_oops",
944ac425
SR
516 .data = &ftrace_dump_on_oops,
517 .maxlen = sizeof(int),
518 .mode = 0644,
6d456111 519 .proc_handler = proc_dointvec,
944ac425
SR
520 },
521#endif
a1ef5adb 522#ifdef CONFIG_MODULES
1da177e4 523 {
1da177e4
LT
524 .procname = "modprobe",
525 .data = &modprobe_path,
526 .maxlen = KMOD_PATH_LEN,
527 .mode = 0644,
6d456111 528 .proc_handler = proc_dostring,
1da177e4 529 },
3d43321b 530 {
3d43321b
KC
531 .procname = "modules_disabled",
532 .data = &modules_disabled,
533 .maxlen = sizeof(int),
534 .mode = 0644,
535 /* only handle a transition from default "0" to "1" */
6d456111 536 .proc_handler = proc_dointvec_minmax,
3d43321b
KC
537 .extra1 = &one,
538 .extra2 = &one,
539 },
1da177e4 540#endif
57ae2508 541#if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET)
1da177e4 542 {
1da177e4 543 .procname = "hotplug",
312c004d
KS
544 .data = &uevent_helper,
545 .maxlen = UEVENT_HELPER_PATH_LEN,
1da177e4 546 .mode = 0644,
6d456111 547 .proc_handler = proc_dostring,
1da177e4
LT
548 },
549#endif
550#ifdef CONFIG_CHR_DEV_SG
551 {
1da177e4
LT
552 .procname = "sg-big-buff",
553 .data = &sg_big_buff,
554 .maxlen = sizeof (int),
555 .mode = 0444,
6d456111 556 .proc_handler = proc_dointvec,
1da177e4
LT
557 },
558#endif
559#ifdef CONFIG_BSD_PROCESS_ACCT
560 {
1da177e4
LT
561 .procname = "acct",
562 .data = &acct_parm,
563 .maxlen = 3*sizeof(int),
564 .mode = 0644,
6d456111 565 .proc_handler = proc_dointvec,
1da177e4
LT
566 },
567#endif
1da177e4
LT
568#ifdef CONFIG_MAGIC_SYSRQ
569 {
1da177e4 570 .procname = "sysrq",
5d6f647f 571 .data = &__sysrq_enabled,
1da177e4
LT
572 .maxlen = sizeof (int),
573 .mode = 0644,
6d456111 574 .proc_handler = proc_dointvec,
1da177e4
LT
575 },
576#endif
d6f8ff73 577#ifdef CONFIG_PROC_SYSCTL
1da177e4 578 {
1da177e4 579 .procname = "cad_pid",
9ec52099 580 .data = NULL,
1da177e4
LT
581 .maxlen = sizeof (int),
582 .mode = 0600,
6d456111 583 .proc_handler = proc_do_cad_pid,
1da177e4 584 },
d6f8ff73 585#endif
1da177e4 586 {
1da177e4
LT
587 .procname = "threads-max",
588 .data = &max_threads,
589 .maxlen = sizeof(int),
590 .mode = 0644,
6d456111 591 .proc_handler = proc_dointvec,
1da177e4
LT
592 },
593 {
1da177e4
LT
594 .procname = "random",
595 .mode = 0555,
596 .child = random_table,
597 },
1da177e4 598 {
1da177e4
LT
599 .procname = "overflowuid",
600 .data = &overflowuid,
601 .maxlen = sizeof(int),
602 .mode = 0644,
6d456111 603 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
604 .extra1 = &minolduid,
605 .extra2 = &maxolduid,
606 },
607 {
1da177e4
LT
608 .procname = "overflowgid",
609 .data = &overflowgid,
610 .maxlen = sizeof(int),
611 .mode = 0644,
6d456111 612 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
613 .extra1 = &minolduid,
614 .extra2 = &maxolduid,
615 },
347a8dc3 616#ifdef CONFIG_S390
1da177e4
LT
617#ifdef CONFIG_MATHEMU
618 {
1da177e4
LT
619 .procname = "ieee_emulation_warnings",
620 .data = &sysctl_ieee_emulation_warnings,
621 .maxlen = sizeof(int),
622 .mode = 0644,
6d456111 623 .proc_handler = proc_dointvec,
1da177e4 624 },
1da177e4
LT
625#endif
626 {
1da177e4
LT
627 .procname = "userprocess_debug",
628 .data = &sysctl_userprocess_debug,
629 .maxlen = sizeof(int),
630 .mode = 0644,
6d456111 631 .proc_handler = proc_dointvec,
1da177e4
LT
632 },
633#endif
634 {
1da177e4
LT
635 .procname = "pid_max",
636 .data = &pid_max,
637 .maxlen = sizeof (int),
638 .mode = 0644,
6d456111 639 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
640 .extra1 = &pid_max_min,
641 .extra2 = &pid_max_max,
642 },
643 {
1da177e4
LT
644 .procname = "panic_on_oops",
645 .data = &panic_on_oops,
646 .maxlen = sizeof(int),
647 .mode = 0644,
6d456111 648 .proc_handler = proc_dointvec,
1da177e4 649 },
7ef3d2fd
JP
650#if defined CONFIG_PRINTK
651 {
7ef3d2fd
JP
652 .procname = "printk",
653 .data = &console_loglevel,
654 .maxlen = 4*sizeof(int),
655 .mode = 0644,
6d456111 656 .proc_handler = proc_dointvec,
7ef3d2fd 657 },
1da177e4 658 {
1da177e4 659 .procname = "printk_ratelimit",
717115e1 660 .data = &printk_ratelimit_state.interval,
1da177e4
LT
661 .maxlen = sizeof(int),
662 .mode = 0644,
6d456111 663 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
664 },
665 {
1da177e4 666 .procname = "printk_ratelimit_burst",
717115e1 667 .data = &printk_ratelimit_state.burst,
1da177e4
LT
668 .maxlen = sizeof(int),
669 .mode = 0644,
6d456111 670 .proc_handler = proc_dointvec,
1da177e4 671 },
af91322e 672 {
af91322e
DY
673 .procname = "printk_delay",
674 .data = &printk_delay_msec,
675 .maxlen = sizeof(int),
676 .mode = 0644,
6d456111 677 .proc_handler = proc_dointvec_minmax,
af91322e
DY
678 .extra1 = &zero,
679 .extra2 = &ten_thousand,
680 },
7ef3d2fd 681#endif
1da177e4 682 {
1da177e4
LT
683 .procname = "ngroups_max",
684 .data = &ngroups_max,
685 .maxlen = sizeof (int),
686 .mode = 0444,
6d456111 687 .proc_handler = proc_dointvec,
1da177e4 688 },
504d7cf1
DZ
689#if defined(CONFIG_NMI_WATCHDOG)
690 {
691 .procname = "nmi_watchdog",
692 .data = &nmi_watchdog_enabled,
693 .maxlen = sizeof (int),
694 .mode = 0644,
695 .proc_handler = proc_nmi_enabled,
696 },
697#endif
698#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) && !defined(CONFIG_NMI_WATCHDOG)
1da177e4 699 {
1da177e4
LT
700 .procname = "unknown_nmi_panic",
701 .data = &unknown_nmi_panic,
702 .maxlen = sizeof (int),
703 .mode = 0644,
6d456111 704 .proc_handler = proc_dointvec,
1da177e4 705 },
407984f1 706 {
407984f1
DZ
707 .procname = "nmi_watchdog",
708 .data = &nmi_watchdog_enabled,
709 .maxlen = sizeof (int),
710 .mode = 0644,
6d456111 711 .proc_handler = proc_nmi_enabled,
1da177e4
LT
712 },
713#endif
714#if defined(CONFIG_X86)
8da5adda 715 {
8da5adda
DZ
716 .procname = "panic_on_unrecovered_nmi",
717 .data = &panic_on_unrecovered_nmi,
718 .maxlen = sizeof(int),
719 .mode = 0644,
6d456111 720 .proc_handler = proc_dointvec,
8da5adda 721 },
5211a242 722 {
5211a242
KG
723 .procname = "panic_on_io_nmi",
724 .data = &panic_on_io_nmi,
725 .maxlen = sizeof(int),
726 .mode = 0644,
6d456111 727 .proc_handler = proc_dointvec,
5211a242 728 },
1da177e4 729 {
1da177e4
LT
730 .procname = "bootloader_type",
731 .data = &bootloader_type,
732 .maxlen = sizeof (int),
733 .mode = 0444,
6d456111 734 .proc_handler = proc_dointvec,
1da177e4 735 },
5031296c 736 {
5031296c
PA
737 .procname = "bootloader_version",
738 .data = &bootloader_version,
739 .maxlen = sizeof (int),
740 .mode = 0444,
6d456111 741 .proc_handler = proc_dointvec,
5031296c 742 },
0741f4d2 743 {
0741f4d2
CE
744 .procname = "kstack_depth_to_print",
745 .data = &kstack_depth_to_print,
746 .maxlen = sizeof(int),
747 .mode = 0644,
6d456111 748 .proc_handler = proc_dointvec,
0741f4d2 749 },
6e7c4025 750 {
6e7c4025
IM
751 .procname = "io_delay_type",
752 .data = &io_delay_type,
753 .maxlen = sizeof(int),
754 .mode = 0644,
6d456111 755 .proc_handler = proc_dointvec,
6e7c4025 756 },
1da177e4 757#endif
7a9166e3 758#if defined(CONFIG_MMU)
1da177e4 759 {
1da177e4
LT
760 .procname = "randomize_va_space",
761 .data = &randomize_va_space,
762 .maxlen = sizeof(int),
763 .mode = 0644,
6d456111 764 .proc_handler = proc_dointvec,
1da177e4 765 },
7a9166e3 766#endif
0152fb37 767#if defined(CONFIG_S390) && defined(CONFIG_SMP)
951f22d5 768 {
951f22d5
MS
769 .procname = "spin_retry",
770 .data = &spin_retry,
771 .maxlen = sizeof (int),
772 .mode = 0644,
6d456111 773 .proc_handler = proc_dointvec,
951f22d5 774 },
c255d844 775#endif
673d5b43 776#if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
c255d844 777 {
c255d844 778 .procname = "acpi_video_flags",
77afcf78 779 .data = &acpi_realmode_flags,
c255d844
PM
780 .maxlen = sizeof (unsigned long),
781 .mode = 0644,
6d456111 782 .proc_handler = proc_doulongvec_minmax,
c255d844 783 },
d2b176ed
JS
784#endif
785#ifdef CONFIG_IA64
786 {
d2b176ed
JS
787 .procname = "ignore-unaligned-usertrap",
788 .data = &no_unaligned_warning,
789 .maxlen = sizeof (int),
790 .mode = 0644,
6d456111 791 .proc_handler = proc_dointvec,
d2b176ed 792 },
88fc241f 793 {
88fc241f
DC
794 .procname = "unaligned-dump-stack",
795 .data = &unaligned_dump_stack,
796 .maxlen = sizeof (int),
797 .mode = 0644,
6d456111 798 .proc_handler = proc_dointvec,
88fc241f 799 },
bebfa101 800#endif
c4f3b63f 801#ifdef CONFIG_DETECT_SOFTLOCKUP
9c44bc03 802 {
9c44bc03
IM
803 .procname = "softlockup_panic",
804 .data = &softlockup_panic,
805 .maxlen = sizeof(int),
806 .mode = 0644,
6d456111 807 .proc_handler = proc_dointvec_minmax,
9c44bc03
IM
808 .extra1 = &zero,
809 .extra2 = &one,
810 },
c4f3b63f 811 {
c4f3b63f
RT
812 .procname = "softlockup_thresh",
813 .data = &softlockup_thresh,
9383d967 814 .maxlen = sizeof(int),
c4f3b63f 815 .mode = 0644,
6d456111 816 .proc_handler = proc_dosoftlockup_thresh,
9383d967 817 .extra1 = &neg_one,
c4f3b63f
RT
818 .extra2 = &sixty,
819 },
e162b39a
MSB
820#endif
821#ifdef CONFIG_DETECT_HUNG_TASK
822 {
e162b39a
MSB
823 .procname = "hung_task_panic",
824 .data = &sysctl_hung_task_panic,
825 .maxlen = sizeof(int),
826 .mode = 0644,
6d456111 827 .proc_handler = proc_dointvec_minmax,
e162b39a
MSB
828 .extra1 = &zero,
829 .extra2 = &one,
830 },
82a1fcb9 831 {
82a1fcb9
IM
832 .procname = "hung_task_check_count",
833 .data = &sysctl_hung_task_check_count,
90739081 834 .maxlen = sizeof(unsigned long),
82a1fcb9 835 .mode = 0644,
6d456111 836 .proc_handler = proc_doulongvec_minmax,
82a1fcb9
IM
837 },
838 {
82a1fcb9
IM
839 .procname = "hung_task_timeout_secs",
840 .data = &sysctl_hung_task_timeout_secs,
90739081 841 .maxlen = sizeof(unsigned long),
82a1fcb9 842 .mode = 0644,
6d456111 843 .proc_handler = proc_dohung_task_timeout_secs,
82a1fcb9
IM
844 },
845 {
82a1fcb9
IM
846 .procname = "hung_task_warnings",
847 .data = &sysctl_hung_task_warnings,
90739081 848 .maxlen = sizeof(unsigned long),
82a1fcb9 849 .mode = 0644,
6d456111 850 .proc_handler = proc_doulongvec_minmax,
82a1fcb9 851 },
c4f3b63f 852#endif
bebfa101
AK
853#ifdef CONFIG_COMPAT
854 {
bebfa101
AK
855 .procname = "compat-log",
856 .data = &compat_log,
857 .maxlen = sizeof (int),
858 .mode = 0644,
6d456111 859 .proc_handler = proc_dointvec,
bebfa101 860 },
951f22d5 861#endif
23f78d4a
IM
862#ifdef CONFIG_RT_MUTEXES
863 {
23f78d4a
IM
864 .procname = "max_lock_depth",
865 .data = &max_lock_depth,
866 .maxlen = sizeof(int),
867 .mode = 0644,
6d456111 868 .proc_handler = proc_dointvec,
23f78d4a 869 },
5096add8 870#endif
10a0a8d4 871 {
10a0a8d4
JF
872 .procname = "poweroff_cmd",
873 .data = &poweroff_cmd,
874 .maxlen = POWEROFF_CMD_PATH_LEN,
875 .mode = 0644,
6d456111 876 .proc_handler = proc_dostring,
10a0a8d4 877 },
0b77f5bf
DH
878#ifdef CONFIG_KEYS
879 {
0b77f5bf
DH
880 .procname = "keys",
881 .mode = 0555,
882 .child = key_sysctls,
883 },
884#endif
31a72bce
PM
885#ifdef CONFIG_RCU_TORTURE_TEST
886 {
31a72bce
PM
887 .procname = "rcutorture_runnable",
888 .data = &rcutorture_runnable,
889 .maxlen = sizeof(int),
890 .mode = 0644,
6d456111 891 .proc_handler = proc_dointvec,
31a72bce
PM
892 },
893#endif
12e22c5e
DH
894#ifdef CONFIG_SLOW_WORK
895 {
12e22c5e
DH
896 .procname = "slow-work",
897 .mode = 0555,
898 .child = slow_work_sysctls,
899 },
900#endif
cdd6c482 901#ifdef CONFIG_PERF_EVENTS
1ccd1549 902 {
cdd6c482
IM
903 .procname = "perf_event_paranoid",
904 .data = &sysctl_perf_event_paranoid,
905 .maxlen = sizeof(sysctl_perf_event_paranoid),
1ccd1549 906 .mode = 0644,
6d456111 907 .proc_handler = proc_dointvec,
1ccd1549 908 },
c5078f78 909 {
cdd6c482
IM
910 .procname = "perf_event_mlock_kb",
911 .data = &sysctl_perf_event_mlock,
912 .maxlen = sizeof(sysctl_perf_event_mlock),
c5078f78 913 .mode = 0644,
6d456111 914 .proc_handler = proc_dointvec,
c5078f78 915 },
a78ac325 916 {
cdd6c482
IM
917 .procname = "perf_event_max_sample_rate",
918 .data = &sysctl_perf_event_sample_rate,
919 .maxlen = sizeof(sysctl_perf_event_sample_rate),
a78ac325 920 .mode = 0644,
6d456111 921 .proc_handler = proc_dointvec,
a78ac325 922 },
1ccd1549 923#endif
dfec072e
VN
924#ifdef CONFIG_KMEMCHECK
925 {
dfec072e
VN
926 .procname = "kmemcheck",
927 .data = &kmemcheck_enabled,
928 .maxlen = sizeof(int),
929 .mode = 0644,
6d456111 930 .proc_handler = proc_dointvec,
dfec072e
VN
931 },
932#endif
cb684b5b 933#ifdef CONFIG_BLOCK
5e605b64 934 {
5e605b64
JA
935 .procname = "blk_iopoll",
936 .data = &blk_iopoll_enabled,
937 .maxlen = sizeof(int),
938 .mode = 0644,
6d456111 939 .proc_handler = proc_dointvec,
5e605b64 940 },
cb684b5b 941#endif
ed2c12f3
AM
942/*
943 * NOTE: do not add new entries to this table unless you have read
944 * Documentation/sysctl/ctl_unnumbered.txt
945 */
6fce56ec 946 { }
1da177e4
LT
947};
948
d8217f07 949static struct ctl_table vm_table[] = {
1da177e4 950 {
1da177e4
LT
951 .procname = "overcommit_memory",
952 .data = &sysctl_overcommit_memory,
953 .maxlen = sizeof(sysctl_overcommit_memory),
954 .mode = 0644,
6d456111 955 .proc_handler = proc_dointvec,
1da177e4 956 },
fadd8fbd 957 {
fadd8fbd
KH
958 .procname = "panic_on_oom",
959 .data = &sysctl_panic_on_oom,
960 .maxlen = sizeof(sysctl_panic_on_oom),
961 .mode = 0644,
6d456111 962 .proc_handler = proc_dointvec,
fadd8fbd 963 },
fe071d7e 964 {
fe071d7e
DR
965 .procname = "oom_kill_allocating_task",
966 .data = &sysctl_oom_kill_allocating_task,
967 .maxlen = sizeof(sysctl_oom_kill_allocating_task),
968 .mode = 0644,
6d456111 969 .proc_handler = proc_dointvec,
fe071d7e 970 },
fef1bdd6 971 {
fef1bdd6
DR
972 .procname = "oom_dump_tasks",
973 .data = &sysctl_oom_dump_tasks,
974 .maxlen = sizeof(sysctl_oom_dump_tasks),
975 .mode = 0644,
6d456111 976 .proc_handler = proc_dointvec,
fef1bdd6 977 },
1da177e4 978 {
1da177e4
LT
979 .procname = "overcommit_ratio",
980 .data = &sysctl_overcommit_ratio,
981 .maxlen = sizeof(sysctl_overcommit_ratio),
982 .mode = 0644,
6d456111 983 .proc_handler = proc_dointvec,
1da177e4
LT
984 },
985 {
1da177e4
LT
986 .procname = "page-cluster",
987 .data = &page_cluster,
988 .maxlen = sizeof(int),
989 .mode = 0644,
6d456111 990 .proc_handler = proc_dointvec,
1da177e4
LT
991 },
992 {
1da177e4
LT
993 .procname = "dirty_background_ratio",
994 .data = &dirty_background_ratio,
995 .maxlen = sizeof(dirty_background_ratio),
996 .mode = 0644,
6d456111 997 .proc_handler = dirty_background_ratio_handler,
1da177e4
LT
998 .extra1 = &zero,
999 .extra2 = &one_hundred,
1000 },
2da02997 1001 {
2da02997
DR
1002 .procname = "dirty_background_bytes",
1003 .data = &dirty_background_bytes,
1004 .maxlen = sizeof(dirty_background_bytes),
1005 .mode = 0644,
6d456111 1006 .proc_handler = dirty_background_bytes_handler,
fc3501d4 1007 .extra1 = &one_ul,
2da02997 1008 },
1da177e4 1009 {
1da177e4
LT
1010 .procname = "dirty_ratio",
1011 .data = &vm_dirty_ratio,
1012 .maxlen = sizeof(vm_dirty_ratio),
1013 .mode = 0644,
6d456111 1014 .proc_handler = dirty_ratio_handler,
1da177e4
LT
1015 .extra1 = &zero,
1016 .extra2 = &one_hundred,
1017 },
2da02997 1018 {
2da02997
DR
1019 .procname = "dirty_bytes",
1020 .data = &vm_dirty_bytes,
1021 .maxlen = sizeof(vm_dirty_bytes),
1022 .mode = 0644,
6d456111 1023 .proc_handler = dirty_bytes_handler,
9e4a5bda 1024 .extra1 = &dirty_bytes_min,
2da02997 1025 },
1da177e4 1026 {
1da177e4 1027 .procname = "dirty_writeback_centisecs",
f6ef9438
BS
1028 .data = &dirty_writeback_interval,
1029 .maxlen = sizeof(dirty_writeback_interval),
1da177e4 1030 .mode = 0644,
6d456111 1031 .proc_handler = dirty_writeback_centisecs_handler,
1da177e4
LT
1032 },
1033 {
1da177e4 1034 .procname = "dirty_expire_centisecs",
f6ef9438
BS
1035 .data = &dirty_expire_interval,
1036 .maxlen = sizeof(dirty_expire_interval),
1da177e4 1037 .mode = 0644,
6d456111 1038 .proc_handler = proc_dointvec,
1da177e4
LT
1039 },
1040 {
1da177e4
LT
1041 .procname = "nr_pdflush_threads",
1042 .data = &nr_pdflush_threads,
1043 .maxlen = sizeof nr_pdflush_threads,
1044 .mode = 0444 /* read-only*/,
6d456111 1045 .proc_handler = proc_dointvec,
1da177e4
LT
1046 },
1047 {
1da177e4
LT
1048 .procname = "swappiness",
1049 .data = &vm_swappiness,
1050 .maxlen = sizeof(vm_swappiness),
1051 .mode = 0644,
6d456111 1052 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
1053 .extra1 = &zero,
1054 .extra2 = &one_hundred,
1055 },
1056#ifdef CONFIG_HUGETLB_PAGE
06808b08 1057 {
1da177e4 1058 .procname = "nr_hugepages",
e5ff2159 1059 .data = NULL,
1da177e4
LT
1060 .maxlen = sizeof(unsigned long),
1061 .mode = 0644,
6d456111 1062 .proc_handler = hugetlb_sysctl_handler,
1da177e4
LT
1063 .extra1 = (void *)&hugetlb_zero,
1064 .extra2 = (void *)&hugetlb_infinity,
06808b08
LS
1065 },
1066#ifdef CONFIG_NUMA
1067 {
1068 .procname = "nr_hugepages_mempolicy",
1069 .data = NULL,
1070 .maxlen = sizeof(unsigned long),
1071 .mode = 0644,
1072 .proc_handler = &hugetlb_mempolicy_sysctl_handler,
1073 .extra1 = (void *)&hugetlb_zero,
1074 .extra2 = (void *)&hugetlb_infinity,
1075 },
1076#endif
1da177e4 1077 {
1da177e4
LT
1078 .procname = "hugetlb_shm_group",
1079 .data = &sysctl_hugetlb_shm_group,
1080 .maxlen = sizeof(gid_t),
1081 .mode = 0644,
6d456111 1082 .proc_handler = proc_dointvec,
1da177e4 1083 },
396faf03 1084 {
396faf03
MG
1085 .procname = "hugepages_treat_as_movable",
1086 .data = &hugepages_treat_as_movable,
1087 .maxlen = sizeof(int),
1088 .mode = 0644,
6d456111 1089 .proc_handler = hugetlb_treat_movable_handler,
396faf03 1090 },
d1c3fb1f 1091 {
d1c3fb1f 1092 .procname = "nr_overcommit_hugepages",
e5ff2159
AK
1093 .data = NULL,
1094 .maxlen = sizeof(unsigned long),
d1c3fb1f 1095 .mode = 0644,
6d456111 1096 .proc_handler = hugetlb_overcommit_handler,
e5ff2159
AK
1097 .extra1 = (void *)&hugetlb_zero,
1098 .extra2 = (void *)&hugetlb_infinity,
d1c3fb1f 1099 },
1da177e4
LT
1100#endif
1101 {
1da177e4
LT
1102 .procname = "lowmem_reserve_ratio",
1103 .data = &sysctl_lowmem_reserve_ratio,
1104 .maxlen = sizeof(sysctl_lowmem_reserve_ratio),
1105 .mode = 0644,
6d456111 1106 .proc_handler = lowmem_reserve_ratio_sysctl_handler,
1da177e4 1107 },
9d0243bc 1108 {
9d0243bc
AM
1109 .procname = "drop_caches",
1110 .data = &sysctl_drop_caches,
1111 .maxlen = sizeof(int),
1112 .mode = 0644,
1113 .proc_handler = drop_caches_sysctl_handler,
9d0243bc 1114 },
1da177e4 1115 {
1da177e4
LT
1116 .procname = "min_free_kbytes",
1117 .data = &min_free_kbytes,
1118 .maxlen = sizeof(min_free_kbytes),
1119 .mode = 0644,
6d456111 1120 .proc_handler = min_free_kbytes_sysctl_handler,
1da177e4
LT
1121 .extra1 = &zero,
1122 },
8ad4b1fb 1123 {
8ad4b1fb
RS
1124 .procname = "percpu_pagelist_fraction",
1125 .data = &percpu_pagelist_fraction,
1126 .maxlen = sizeof(percpu_pagelist_fraction),
1127 .mode = 0644,
6d456111 1128 .proc_handler = percpu_pagelist_fraction_sysctl_handler,
8ad4b1fb
RS
1129 .extra1 = &min_percpu_pagelist_fract,
1130 },
1da177e4
LT
1131#ifdef CONFIG_MMU
1132 {
1da177e4
LT
1133 .procname = "max_map_count",
1134 .data = &sysctl_max_map_count,
1135 .maxlen = sizeof(sysctl_max_map_count),
1136 .mode = 0644,
3e26120c 1137 .proc_handler = proc_dointvec_minmax,
70da2340 1138 .extra1 = &zero,
1da177e4 1139 },
dd8632a1
PM
1140#else
1141 {
dd8632a1
PM
1142 .procname = "nr_trim_pages",
1143 .data = &sysctl_nr_trim_pages,
1144 .maxlen = sizeof(sysctl_nr_trim_pages),
1145 .mode = 0644,
6d456111 1146 .proc_handler = proc_dointvec_minmax,
dd8632a1
PM
1147 .extra1 = &zero,
1148 },
1da177e4
LT
1149#endif
1150 {
1da177e4
LT
1151 .procname = "laptop_mode",
1152 .data = &laptop_mode,
1153 .maxlen = sizeof(laptop_mode),
1154 .mode = 0644,
6d456111 1155 .proc_handler = proc_dointvec_jiffies,
1da177e4
LT
1156 },
1157 {
1da177e4
LT
1158 .procname = "block_dump",
1159 .data = &block_dump,
1160 .maxlen = sizeof(block_dump),
1161 .mode = 0644,
6d456111 1162 .proc_handler = proc_dointvec,
1da177e4
LT
1163 .extra1 = &zero,
1164 },
1165 {
1da177e4
LT
1166 .procname = "vfs_cache_pressure",
1167 .data = &sysctl_vfs_cache_pressure,
1168 .maxlen = sizeof(sysctl_vfs_cache_pressure),
1169 .mode = 0644,
6d456111 1170 .proc_handler = proc_dointvec,
1da177e4
LT
1171 .extra1 = &zero,
1172 },
1173#ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
1174 {
1da177e4
LT
1175 .procname = "legacy_va_layout",
1176 .data = &sysctl_legacy_va_layout,
1177 .maxlen = sizeof(sysctl_legacy_va_layout),
1178 .mode = 0644,
6d456111 1179 .proc_handler = proc_dointvec,
1da177e4
LT
1180 .extra1 = &zero,
1181 },
1182#endif
1743660b
CL
1183#ifdef CONFIG_NUMA
1184 {
1743660b
CL
1185 .procname = "zone_reclaim_mode",
1186 .data = &zone_reclaim_mode,
1187 .maxlen = sizeof(zone_reclaim_mode),
1188 .mode = 0644,
6d456111 1189 .proc_handler = proc_dointvec,
c84db23c 1190 .extra1 = &zero,
1743660b 1191 },
9614634f 1192 {
9614634f
CL
1193 .procname = "min_unmapped_ratio",
1194 .data = &sysctl_min_unmapped_ratio,
1195 .maxlen = sizeof(sysctl_min_unmapped_ratio),
1196 .mode = 0644,
6d456111 1197 .proc_handler = sysctl_min_unmapped_ratio_sysctl_handler,
9614634f
CL
1198 .extra1 = &zero,
1199 .extra2 = &one_hundred,
1200 },
0ff38490 1201 {
0ff38490
CL
1202 .procname = "min_slab_ratio",
1203 .data = &sysctl_min_slab_ratio,
1204 .maxlen = sizeof(sysctl_min_slab_ratio),
1205 .mode = 0644,
6d456111 1206 .proc_handler = sysctl_min_slab_ratio_sysctl_handler,
0ff38490
CL
1207 .extra1 = &zero,
1208 .extra2 = &one_hundred,
1209 },
e6e5494c 1210#endif
77461ab3
CL
1211#ifdef CONFIG_SMP
1212 {
77461ab3
CL
1213 .procname = "stat_interval",
1214 .data = &sysctl_stat_interval,
1215 .maxlen = sizeof(sysctl_stat_interval),
1216 .mode = 0644,
6d456111 1217 .proc_handler = proc_dointvec_jiffies,
77461ab3
CL
1218 },
1219#endif
6e141546 1220#ifdef CONFIG_MMU
ed032189 1221 {
ed032189 1222 .procname = "mmap_min_addr",
788084ab
EP
1223 .data = &dac_mmap_min_addr,
1224 .maxlen = sizeof(unsigned long),
ed032189 1225 .mode = 0644,
6d456111 1226 .proc_handler = mmap_min_addr_handler,
ed032189 1227 },
6e141546 1228#endif
f0c0b2b8
KH
1229#ifdef CONFIG_NUMA
1230 {
f0c0b2b8
KH
1231 .procname = "numa_zonelist_order",
1232 .data = &numa_zonelist_order,
1233 .maxlen = NUMA_ZONELIST_ORDER_LEN,
1234 .mode = 0644,
6d456111 1235 .proc_handler = numa_zonelist_order_handler,
f0c0b2b8
KH
1236 },
1237#endif
2b8232ce 1238#if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
5c36e657 1239 (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
e6e5494c 1240 {
e6e5494c
IM
1241 .procname = "vdso_enabled",
1242 .data = &vdso_enabled,
1243 .maxlen = sizeof(vdso_enabled),
1244 .mode = 0644,
6d456111 1245 .proc_handler = proc_dointvec,
e6e5494c
IM
1246 .extra1 = &zero,
1247 },
1da177e4 1248#endif
195cf453
BG
1249#ifdef CONFIG_HIGHMEM
1250 {
195cf453
BG
1251 .procname = "highmem_is_dirtyable",
1252 .data = &vm_highmem_is_dirtyable,
1253 .maxlen = sizeof(vm_highmem_is_dirtyable),
1254 .mode = 0644,
6d456111 1255 .proc_handler = proc_dointvec_minmax,
195cf453
BG
1256 .extra1 = &zero,
1257 .extra2 = &one,
1258 },
1259#endif
4be6f6bb 1260 {
4be6f6bb
PZ
1261 .procname = "scan_unevictable_pages",
1262 .data = &scan_unevictable_pages,
1263 .maxlen = sizeof(scan_unevictable_pages),
1264 .mode = 0644,
6d456111 1265 .proc_handler = scan_unevictable_handler,
4be6f6bb 1266 },
6a46079c
AK
1267#ifdef CONFIG_MEMORY_FAILURE
1268 {
6a46079c
AK
1269 .procname = "memory_failure_early_kill",
1270 .data = &sysctl_memory_failure_early_kill,
1271 .maxlen = sizeof(sysctl_memory_failure_early_kill),
1272 .mode = 0644,
6d456111 1273 .proc_handler = proc_dointvec_minmax,
6a46079c
AK
1274 .extra1 = &zero,
1275 .extra2 = &one,
1276 },
1277 {
6a46079c
AK
1278 .procname = "memory_failure_recovery",
1279 .data = &sysctl_memory_failure_recovery,
1280 .maxlen = sizeof(sysctl_memory_failure_recovery),
1281 .mode = 0644,
6d456111 1282 .proc_handler = proc_dointvec_minmax,
6a46079c
AK
1283 .extra1 = &zero,
1284 .extra2 = &one,
1285 },
1286#endif
1287
2be7fe07
AM
1288/*
1289 * NOTE: do not add new entries to this table unless you have read
1290 * Documentation/sysctl/ctl_unnumbered.txt
1291 */
6fce56ec 1292 { }
1da177e4
LT
1293};
1294
2abc26fc 1295#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
d8217f07 1296static struct ctl_table binfmt_misc_table[] = {
6fce56ec 1297 { }
2abc26fc
EB
1298};
1299#endif
1300
d8217f07 1301static struct ctl_table fs_table[] = {
1da177e4 1302 {
1da177e4
LT
1303 .procname = "inode-nr",
1304 .data = &inodes_stat,
1305 .maxlen = 2*sizeof(int),
1306 .mode = 0444,
6d456111 1307 .proc_handler = proc_dointvec,
1da177e4
LT
1308 },
1309 {
1da177e4
LT
1310 .procname = "inode-state",
1311 .data = &inodes_stat,
1312 .maxlen = 7*sizeof(int),
1313 .mode = 0444,
6d456111 1314 .proc_handler = proc_dointvec,
1da177e4
LT
1315 },
1316 {
1da177e4
LT
1317 .procname = "file-nr",
1318 .data = &files_stat,
1319 .maxlen = 3*sizeof(int),
1320 .mode = 0444,
6d456111 1321 .proc_handler = proc_nr_files,
1da177e4
LT
1322 },
1323 {
1da177e4
LT
1324 .procname = "file-max",
1325 .data = &files_stat.max_files,
1326 .maxlen = sizeof(int),
1327 .mode = 0644,
6d456111 1328 .proc_handler = proc_dointvec,
1da177e4 1329 },
9cfe015a 1330 {
9cfe015a
ED
1331 .procname = "nr_open",
1332 .data = &sysctl_nr_open,
1333 .maxlen = sizeof(int),
1334 .mode = 0644,
6d456111 1335 .proc_handler = proc_dointvec_minmax,
eceea0b3
AV
1336 .extra1 = &sysctl_nr_open_min,
1337 .extra2 = &sysctl_nr_open_max,
9cfe015a 1338 },
1da177e4 1339 {
1da177e4
LT
1340 .procname = "dentry-state",
1341 .data = &dentry_stat,
1342 .maxlen = 6*sizeof(int),
1343 .mode = 0444,
6d456111 1344 .proc_handler = proc_dointvec,
1da177e4
LT
1345 },
1346 {
1da177e4
LT
1347 .procname = "overflowuid",
1348 .data = &fs_overflowuid,
1349 .maxlen = sizeof(int),
1350 .mode = 0644,
6d456111 1351 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
1352 .extra1 = &minolduid,
1353 .extra2 = &maxolduid,
1354 },
1355 {
1da177e4
LT
1356 .procname = "overflowgid",
1357 .data = &fs_overflowgid,
1358 .maxlen = sizeof(int),
1359 .mode = 0644,
6d456111 1360 .proc_handler = proc_dointvec_minmax,
1da177e4
LT
1361 .extra1 = &minolduid,
1362 .extra2 = &maxolduid,
1363 },
bfcd17a6 1364#ifdef CONFIG_FILE_LOCKING
1da177e4 1365 {
1da177e4
LT
1366 .procname = "leases-enable",
1367 .data = &leases_enable,
1368 .maxlen = sizeof(int),
1369 .mode = 0644,
6d456111 1370 .proc_handler = proc_dointvec,
1da177e4 1371 },
bfcd17a6 1372#endif
1da177e4
LT
1373#ifdef CONFIG_DNOTIFY
1374 {
1da177e4
LT
1375 .procname = "dir-notify-enable",
1376 .data = &dir_notify_enable,
1377 .maxlen = sizeof(int),
1378 .mode = 0644,
6d456111 1379 .proc_handler = proc_dointvec,
1da177e4
LT
1380 },
1381#endif
1382#ifdef CONFIG_MMU
bfcd17a6 1383#ifdef CONFIG_FILE_LOCKING
1da177e4 1384 {
1da177e4
LT
1385 .procname = "lease-break-time",
1386 .data = &lease_break_time,
1387 .maxlen = sizeof(int),
1388 .mode = 0644,
6d456111 1389 .proc_handler = proc_dointvec,
1da177e4 1390 },
bfcd17a6 1391#endif
ebf3f09c 1392#ifdef CONFIG_AIO
1da177e4 1393 {
1da177e4
LT
1394 .procname = "aio-nr",
1395 .data = &aio_nr,
1396 .maxlen = sizeof(aio_nr),
1397 .mode = 0444,
6d456111 1398 .proc_handler = proc_doulongvec_minmax,
1da177e4
LT
1399 },
1400 {
1da177e4
LT
1401 .procname = "aio-max-nr",
1402 .data = &aio_max_nr,
1403 .maxlen = sizeof(aio_max_nr),
1404 .mode = 0644,
6d456111 1405 .proc_handler = proc_doulongvec_minmax,
1da177e4 1406 },
ebf3f09c 1407#endif /* CONFIG_AIO */
2d9048e2 1408#ifdef CONFIG_INOTIFY_USER
0399cb08 1409 {
0399cb08
RL
1410 .procname = "inotify",
1411 .mode = 0555,
1412 .child = inotify_table,
1413 },
1414#endif
7ef9964e
DL
1415#ifdef CONFIG_EPOLL
1416 {
1417 .procname = "epoll",
1418 .mode = 0555,
1419 .child = epoll_table,
1420 },
1421#endif
1da177e4 1422#endif
d6e71144 1423 {
d6e71144
AC
1424 .procname = "suid_dumpable",
1425 .data = &suid_dumpable,
1426 .maxlen = sizeof(int),
1427 .mode = 0644,
6d456111 1428 .proc_handler = proc_dointvec_minmax,
8e654fba
MW
1429 .extra1 = &zero,
1430 .extra2 = &two,
d6e71144 1431 },
2abc26fc
EB
1432#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
1433 {
2abc26fc
EB
1434 .procname = "binfmt_misc",
1435 .mode = 0555,
1436 .child = binfmt_misc_table,
1437 },
1438#endif
2be7fe07
AM
1439/*
1440 * NOTE: do not add new entries to this table unless you have read
1441 * Documentation/sysctl/ctl_unnumbered.txt
2be7fe07 1442 */
6fce56ec 1443 { }
1da177e4
LT
1444};
1445
d8217f07 1446static struct ctl_table debug_table[] = {
4b177647 1447#if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC)
abd4f750 1448 {
abd4f750
MAS
1449 .procname = "exception-trace",
1450 .data = &show_unhandled_signals,
1451 .maxlen = sizeof(int),
1452 .mode = 0644,
1453 .proc_handler = proc_dointvec
1454 },
b2be84df
MH
1455#endif
1456#if defined(CONFIG_OPTPROBES)
1457 {
1458 .procname = "kprobes-optimization",
1459 .data = &sysctl_kprobes_optimization,
1460 .maxlen = sizeof(int),
1461 .mode = 0644,
1462 .proc_handler = proc_kprobes_optimization_handler,
1463 .extra1 = &zero,
1464 .extra2 = &one,
1465 },
abd4f750 1466#endif
6fce56ec 1467 { }
1da177e4
LT
1468};
1469
d8217f07 1470static struct ctl_table dev_table[] = {
6fce56ec 1471 { }
0eeca283 1472};
1da177e4 1473
330d57fb
AV
1474static DEFINE_SPINLOCK(sysctl_lock);
1475
1476/* called under sysctl_lock */
1477static int use_table(struct ctl_table_header *p)
1478{
1479 if (unlikely(p->unregistering))
1480 return 0;
1481 p->used++;
1482 return 1;
1483}
1484
1485/* called under sysctl_lock */
1486static void unuse_table(struct ctl_table_header *p)
1487{
1488 if (!--p->used)
1489 if (unlikely(p->unregistering))
1490 complete(p->unregistering);
1491}
1492
1493/* called under sysctl_lock, will reacquire if has to wait */
1494static void start_unregistering(struct ctl_table_header *p)
1495{
1496 /*
1497 * if p->used is 0, nobody will ever touch that entry again;
1498 * we'll eliminate all paths to it before dropping sysctl_lock
1499 */
1500 if (unlikely(p->used)) {
1501 struct completion wait;
1502 init_completion(&wait);
1503 p->unregistering = &wait;
1504 spin_unlock(&sysctl_lock);
1505 wait_for_completion(&wait);
1506 spin_lock(&sysctl_lock);
f7e6ced4
AV
1507 } else {
1508 /* anything non-NULL; we'll never dereference it */
1509 p->unregistering = ERR_PTR(-EINVAL);
330d57fb
AV
1510 }
1511 /*
1512 * do not remove from the list until nobody holds it; walking the
1513 * list in do_sysctl() relies on that.
1514 */
1515 list_del_init(&p->ctl_entry);
1516}
1517
f7e6ced4
AV
1518void sysctl_head_get(struct ctl_table_header *head)
1519{
1520 spin_lock(&sysctl_lock);
1521 head->count++;
1522 spin_unlock(&sysctl_lock);
1523}
1524
1525void sysctl_head_put(struct ctl_table_header *head)
1526{
1527 spin_lock(&sysctl_lock);
1528 if (!--head->count)
1529 kfree(head);
1530 spin_unlock(&sysctl_lock);
1531}
1532
1533struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
1534{
1535 if (!head)
1536 BUG();
1537 spin_lock(&sysctl_lock);
1538 if (!use_table(head))
1539 head = ERR_PTR(-ENOENT);
1540 spin_unlock(&sysctl_lock);
1541 return head;
1542}
1543
805b5d5e
EB
1544void sysctl_head_finish(struct ctl_table_header *head)
1545{
1546 if (!head)
1547 return;
1548 spin_lock(&sysctl_lock);
1549 unuse_table(head);
1550 spin_unlock(&sysctl_lock);
1551}
1552
73455092
AV
1553static struct ctl_table_set *
1554lookup_header_set(struct ctl_table_root *root, struct nsproxy *namespaces)
1555{
1556 struct ctl_table_set *set = &root->default_set;
1557 if (root->lookup)
1558 set = root->lookup(root, namespaces);
1559 return set;
1560}
1561
e51b6ba0
EB
1562static struct list_head *
1563lookup_header_list(struct ctl_table_root *root, struct nsproxy *namespaces)
805b5d5e 1564{
73455092
AV
1565 struct ctl_table_set *set = lookup_header_set(root, namespaces);
1566 return &set->list;
e51b6ba0
EB
1567}
1568
1569struct ctl_table_header *__sysctl_head_next(struct nsproxy *namespaces,
1570 struct ctl_table_header *prev)
1571{
1572 struct ctl_table_root *root;
1573 struct list_head *header_list;
805b5d5e
EB
1574 struct ctl_table_header *head;
1575 struct list_head *tmp;
e51b6ba0 1576
805b5d5e
EB
1577 spin_lock(&sysctl_lock);
1578 if (prev) {
e51b6ba0 1579 head = prev;
805b5d5e
EB
1580 tmp = &prev->ctl_entry;
1581 unuse_table(prev);
1582 goto next;
1583 }
1584 tmp = &root_table_header.ctl_entry;
1585 for (;;) {
1586 head = list_entry(tmp, struct ctl_table_header, ctl_entry);
1587
1588 if (!use_table(head))
1589 goto next;
1590 spin_unlock(&sysctl_lock);
1591 return head;
1592 next:
e51b6ba0 1593 root = head->root;
805b5d5e 1594 tmp = tmp->next;
e51b6ba0
EB
1595 header_list = lookup_header_list(root, namespaces);
1596 if (tmp != header_list)
1597 continue;
1598
1599 do {
1600 root = list_entry(root->root_list.next,
1601 struct ctl_table_root, root_list);
1602 if (root == &sysctl_table_root)
1603 goto out;
1604 header_list = lookup_header_list(root, namespaces);
1605 } while (list_empty(header_list));
1606 tmp = header_list->next;
805b5d5e 1607 }
e51b6ba0 1608out:
805b5d5e
EB
1609 spin_unlock(&sysctl_lock);
1610 return NULL;
1611}
1612
e51b6ba0
EB
1613struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev)
1614{
1615 return __sysctl_head_next(current->nsproxy, prev);
1616}
1617
1618void register_sysctl_root(struct ctl_table_root *root)
1619{
1620 spin_lock(&sysctl_lock);
1621 list_add_tail(&root->root_list, &sysctl_table_root.root_list);
1622 spin_unlock(&sysctl_lock);
1623}
1624
1da177e4 1625/*
1ff007eb 1626 * sysctl_perm does NOT grant the superuser all rights automatically, because
1da177e4
LT
1627 * some sysctl variables are readonly even to root.
1628 */
1629
1630static int test_perm(int mode, int op)
1631{
76aac0e9 1632 if (!current_euid())
1da177e4
LT
1633 mode >>= 6;
1634 else if (in_egroup_p(0))
1635 mode >>= 3;
e6305c43 1636 if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
1da177e4
LT
1637 return 0;
1638 return -EACCES;
1639}
1640
d7321cd6 1641int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op)
1da177e4
LT
1642{
1643 int error;
d7321cd6
PE
1644 int mode;
1645
e6305c43 1646 error = security_sysctl(table, op & (MAY_READ | MAY_WRITE | MAY_EXEC));
1da177e4
LT
1647 if (error)
1648 return error;
d7321cd6
PE
1649
1650 if (root->permissions)
1651 mode = root->permissions(root, current->nsproxy, table);
1652 else
1653 mode = table->mode;
1654
1655 return test_perm(mode, op);
1da177e4
LT
1656}
1657
d912b0cc
EB
1658static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
1659{
2315ffa0 1660 for (; table->procname; table++) {
d912b0cc
EB
1661 table->parent = parent;
1662 if (table->child)
1663 sysctl_set_parent(table, table->child);
1664 }
1665}
1666
1667static __init int sysctl_init(void)
1668{
1669 sysctl_set_parent(NULL, root_table);
88f458e4
HS
1670#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
1671 {
1672 int err;
1673 err = sysctl_check_table(current->nsproxy, root_table);
1674 }
1675#endif
d912b0cc
EB
1676 return 0;
1677}
1678
1679core_initcall(sysctl_init);
1680
bfbcf034
AV
1681static struct ctl_table *is_branch_in(struct ctl_table *branch,
1682 struct ctl_table *table)
ae7edecc
AV
1683{
1684 struct ctl_table *p;
1685 const char *s = branch->procname;
1686
1687 /* branch should have named subdirectory as its first element */
1688 if (!s || !branch->child)
bfbcf034 1689 return NULL;
ae7edecc
AV
1690
1691 /* ... and nothing else */
2315ffa0 1692 if (branch[1].procname)
bfbcf034 1693 return NULL;
ae7edecc
AV
1694
1695 /* table should contain subdirectory with the same name */
2315ffa0 1696 for (p = table; p->procname; p++) {
ae7edecc
AV
1697 if (!p->child)
1698 continue;
1699 if (p->procname && strcmp(p->procname, s) == 0)
bfbcf034 1700 return p;
ae7edecc 1701 }
bfbcf034 1702 return NULL;
ae7edecc
AV
1703}
1704
1705/* see if attaching q to p would be an improvement */
1706static void try_attach(struct ctl_table_header *p, struct ctl_table_header *q)
1707{
1708 struct ctl_table *to = p->ctl_table, *by = q->ctl_table;
bfbcf034 1709 struct ctl_table *next;
ae7edecc
AV
1710 int is_better = 0;
1711 int not_in_parent = !p->attached_by;
1712
bfbcf034 1713 while ((next = is_branch_in(by, to)) != NULL) {
ae7edecc
AV
1714 if (by == q->attached_by)
1715 is_better = 1;
1716 if (to == p->attached_by)
1717 not_in_parent = 1;
1718 by = by->child;
bfbcf034 1719 to = next->child;
ae7edecc
AV
1720 }
1721
1722 if (is_better && not_in_parent) {
1723 q->attached_by = by;
1724 q->attached_to = to;
1725 q->parent = p;
1726 }
1727}
1728
1da177e4 1729/**
e51b6ba0
EB
1730 * __register_sysctl_paths - register a sysctl hierarchy
1731 * @root: List of sysctl headers to register on
1732 * @namespaces: Data to compute which lists of sysctl entries are visible
29e796fd 1733 * @path: The path to the directory the sysctl table is in.
1da177e4 1734 * @table: the top-level table structure
1da177e4
LT
1735 *
1736 * Register a sysctl table hierarchy. @table should be a filled in ctl_table
29e796fd 1737 * array. A completely 0 filled entry terminates the table.
1da177e4 1738 *
d8217f07 1739 * The members of the &struct ctl_table structure are used as follows:
1da177e4 1740 *
1da177e4
LT
1741 * procname - the name of the sysctl file under /proc/sys. Set to %NULL to not
1742 * enter a sysctl file
1743 *
1744 * data - a pointer to data for use by proc_handler
1745 *
1746 * maxlen - the maximum size in bytes of the data
1747 *
1748 * mode - the file permissions for the /proc/sys file, and for sysctl(2)
1749 *
1750 * child - a pointer to the child sysctl table if this entry is a directory, or
1751 * %NULL.
1752 *
1753 * proc_handler - the text handler routine (described below)
1754 *
1da177e4
LT
1755 * de - for internal use by the sysctl routines
1756 *
1757 * extra1, extra2 - extra pointers usable by the proc handler routines
1758 *
1759 * Leaf nodes in the sysctl tree will be represented by a single file
1760 * under /proc; non-leaf nodes will be represented by directories.
1761 *
1762 * sysctl(2) can automatically manage read and write requests through
1763 * the sysctl table. The data and maxlen fields of the ctl_table
1764 * struct enable minimal validation of the values being written to be
1765 * performed, and the mode field allows minimal authentication.
1766 *
1da177e4
LT
1767 * There must be a proc_handler routine for any terminal nodes
1768 * mirrored under /proc/sys (non-terminals are handled by a built-in
1769 * directory handler). Several default handlers are available to
1770 * cover common cases -
1771 *
1772 * proc_dostring(), proc_dointvec(), proc_dointvec_jiffies(),
1773 * proc_dointvec_userhz_jiffies(), proc_dointvec_minmax(),
1774 * proc_doulongvec_ms_jiffies_minmax(), proc_doulongvec_minmax()
1775 *
1776 * It is the handler's job to read the input buffer from user memory
1777 * and process it. The handler should return 0 on success.
1778 *
1779 * This routine returns %NULL on a failure to register, and a pointer
1780 * to the table header on success.
1781 */
e51b6ba0
EB
1782struct ctl_table_header *__register_sysctl_paths(
1783 struct ctl_table_root *root,
1784 struct nsproxy *namespaces,
1785 const struct ctl_path *path, struct ctl_table *table)
1da177e4 1786{
29e796fd
EB
1787 struct ctl_table_header *header;
1788 struct ctl_table *new, **prevp;
1789 unsigned int n, npath;
ae7edecc 1790 struct ctl_table_set *set;
29e796fd
EB
1791
1792 /* Count the path components */
2315ffa0 1793 for (npath = 0; path[npath].procname; ++npath)
29e796fd
EB
1794 ;
1795
1796 /*
1797 * For each path component, allocate a 2-element ctl_table array.
1798 * The first array element will be filled with the sysctl entry
2315ffa0 1799 * for this, the second will be the sentinel (procname == 0).
29e796fd
EB
1800 *
1801 * We allocate everything in one go so that we don't have to
1802 * worry about freeing additional memory in unregister_sysctl_table.
1803 */
1804 header = kzalloc(sizeof(struct ctl_table_header) +
1805 (2 * npath * sizeof(struct ctl_table)), GFP_KERNEL);
1806 if (!header)
1da177e4 1807 return NULL;
29e796fd
EB
1808
1809 new = (struct ctl_table *) (header + 1);
1810
1811 /* Now connect the dots */
1812 prevp = &header->ctl_table;
1813 for (n = 0; n < npath; ++n, ++path) {
1814 /* Copy the procname */
1815 new->procname = path->procname;
29e796fd
EB
1816 new->mode = 0555;
1817
1818 *prevp = new;
1819 prevp = &new->child;
1820
1821 new += 2;
1822 }
1823 *prevp = table;
23eb06de 1824 header->ctl_table_arg = table;
29e796fd
EB
1825
1826 INIT_LIST_HEAD(&header->ctl_entry);
1827 header->used = 0;
1828 header->unregistering = NULL;
e51b6ba0 1829 header->root = root;
29e796fd 1830 sysctl_set_parent(NULL, header->ctl_table);
f7e6ced4 1831 header->count = 1;
88f458e4 1832#ifdef CONFIG_SYSCTL_SYSCALL_CHECK
e51b6ba0 1833 if (sysctl_check_table(namespaces, header->ctl_table)) {
29e796fd 1834 kfree(header);
fc6cd25b
EB
1835 return NULL;
1836 }
88f458e4 1837#endif
330d57fb 1838 spin_lock(&sysctl_lock);
73455092 1839 header->set = lookup_header_set(root, namespaces);
ae7edecc
AV
1840 header->attached_by = header->ctl_table;
1841 header->attached_to = root_table;
1842 header->parent = &root_table_header;
1843 for (set = header->set; set; set = set->parent) {
1844 struct ctl_table_header *p;
1845 list_for_each_entry(p, &set->list, ctl_entry) {
1846 if (p->unregistering)
1847 continue;
1848 try_attach(p, header);
1849 }
1850 }
1851 header->parent->count++;
73455092 1852 list_add_tail(&header->ctl_entry, &header->set->list);
330d57fb 1853 spin_unlock(&sysctl_lock);
29e796fd
EB
1854
1855 return header;
1856}
1857
e51b6ba0
EB
1858/**
1859 * register_sysctl_table_path - register a sysctl table hierarchy
1860 * @path: The path to the directory the sysctl table is in.
1861 * @table: the top-level table structure
1862 *
1863 * Register a sysctl table hierarchy. @table should be a filled in ctl_table
1864 * array. A completely 0 filled entry terminates the table.
1865 *
1866 * See __register_sysctl_paths for more details.
1867 */
1868struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
1869 struct ctl_table *table)
1870{
1871 return __register_sysctl_paths(&sysctl_table_root, current->nsproxy,
1872 path, table);
1873}
1874
29e796fd
EB
1875/**
1876 * register_sysctl_table - register a sysctl table hierarchy
1877 * @table: the top-level table structure
1878 *
1879 * Register a sysctl table hierarchy. @table should be a filled in ctl_table
1880 * array. A completely 0 filled entry terminates the table.
1881 *
1882 * See register_sysctl_paths for more details.
1883 */
1884struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
1885{
1886 static const struct ctl_path null_path[] = { {} };
1887
1888 return register_sysctl_paths(null_path, table);
1da177e4
LT
1889}
1890
1891/**
1892 * unregister_sysctl_table - unregister a sysctl table hierarchy
1893 * @header: the header returned from register_sysctl_table
1894 *
1895 * Unregisters the sysctl table and all children. proc entries may not
1896 * actually be removed until they are no longer used by anyone.
1897 */
1898void unregister_sysctl_table(struct ctl_table_header * header)
1899{
330d57fb 1900 might_sleep();
f1dad166
PE
1901
1902 if (header == NULL)
1903 return;
1904
330d57fb
AV
1905 spin_lock(&sysctl_lock);
1906 start_unregistering(header);
ae7edecc
AV
1907 if (!--header->parent->count) {
1908 WARN_ON(1);
1909 kfree(header->parent);
1910 }
f7e6ced4
AV
1911 if (!--header->count)
1912 kfree(header);
330d57fb 1913 spin_unlock(&sysctl_lock);
1da177e4
LT
1914}
1915
9043476f
AV
1916int sysctl_is_seen(struct ctl_table_header *p)
1917{
1918 struct ctl_table_set *set = p->set;
1919 int res;
1920 spin_lock(&sysctl_lock);
1921 if (p->unregistering)
1922 res = 0;
1923 else if (!set->is_seen)
1924 res = 1;
1925 else
1926 res = set->is_seen(set);
1927 spin_unlock(&sysctl_lock);
1928 return res;
1929}
1930
73455092
AV
1931void setup_sysctl_set(struct ctl_table_set *p,
1932 struct ctl_table_set *parent,
1933 int (*is_seen)(struct ctl_table_set *))
1934{
1935 INIT_LIST_HEAD(&p->list);
1936 p->parent = parent ? parent : &sysctl_table_root.default_set;
1937 p->is_seen = is_seen;
1938}
1939
b89a8171 1940#else /* !CONFIG_SYSCTL */
d8217f07 1941struct ctl_table_header *register_sysctl_table(struct ctl_table * table)
b89a8171
EB
1942{
1943 return NULL;
1944}
1945
29e796fd
EB
1946struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
1947 struct ctl_table *table)
1948{
1949 return NULL;
1950}
1951
b89a8171
EB
1952void unregister_sysctl_table(struct ctl_table_header * table)
1953{
1954}
1955
73455092
AV
1956void setup_sysctl_set(struct ctl_table_set *p,
1957 struct ctl_table_set *parent,
1958 int (*is_seen)(struct ctl_table_set *))
1959{
1960}
1961
f7e6ced4
AV
1962void sysctl_head_put(struct ctl_table_header *head)
1963{
1964}
1965
b89a8171
EB
1966#endif /* CONFIG_SYSCTL */
1967
1da177e4
LT
1968/*
1969 * /proc/sys support
1970 */
1971
b89a8171 1972#ifdef CONFIG_PROC_SYSCTL
1da177e4 1973
b1ba4ddd 1974static int _proc_do_string(void* data, int maxlen, int write,
8d65af78 1975 void __user *buffer,
b1ba4ddd 1976 size_t *lenp, loff_t *ppos)
1da177e4
LT
1977{
1978 size_t len;
1979 char __user *p;
1980 char c;
8d060877
ON
1981
1982 if (!data || !maxlen || !*lenp) {
1da177e4
LT
1983 *lenp = 0;
1984 return 0;
1985 }
8d060877 1986
1da177e4
LT
1987 if (write) {
1988 len = 0;
1989 p = buffer;
1990 while (len < *lenp) {
1991 if (get_user(c, p++))
1992 return -EFAULT;
1993 if (c == 0 || c == '\n')
1994 break;
1995 len++;
1996 }
f5dd3d6f
SV
1997 if (len >= maxlen)
1998 len = maxlen-1;
1999 if(copy_from_user(data, buffer, len))
1da177e4 2000 return -EFAULT;
f5dd3d6f 2001 ((char *) data)[len] = 0;
1da177e4
LT
2002 *ppos += *lenp;
2003 } else {
f5dd3d6f
SV
2004 len = strlen(data);
2005 if (len > maxlen)
2006 len = maxlen;
8d060877
ON
2007
2008 if (*ppos > len) {
2009 *lenp = 0;
2010 return 0;
2011 }
2012
2013 data += *ppos;
2014 len -= *ppos;
2015
1da177e4
LT
2016 if (len > *lenp)
2017 len = *lenp;
2018 if (len)
f5dd3d6f 2019 if(copy_to_user(buffer, data, len))
1da177e4
LT
2020 return -EFAULT;
2021 if (len < *lenp) {
2022 if(put_user('\n', ((char __user *) buffer) + len))
2023 return -EFAULT;
2024 len++;
2025 }
2026 *lenp = len;
2027 *ppos += len;
2028 }
2029 return 0;
2030}
2031
f5dd3d6f
SV
2032/**
2033 * proc_dostring - read a string sysctl
2034 * @table: the sysctl table
2035 * @write: %TRUE if this is a write to the sysctl file
f5dd3d6f
SV
2036 * @buffer: the user buffer
2037 * @lenp: the size of the user buffer
2038 * @ppos: file position
2039 *
2040 * Reads/writes a string from/to the user buffer. If the kernel
2041 * buffer provided is not large enough to hold the string, the
2042 * string is truncated. The copied string is %NULL-terminated.
2043 * If the string is being read by the user process, it is copied
2044 * and a newline '\n' is added. It is truncated if the buffer is
2045 * not large enough.
2046 *
2047 * Returns 0 on success.
2048 */
8d65af78 2049int proc_dostring(struct ctl_table *table, int write,
f5dd3d6f
SV
2050 void __user *buffer, size_t *lenp, loff_t *ppos)
2051{
8d65af78 2052 return _proc_do_string(table->data, table->maxlen, write,
f5dd3d6f
SV
2053 buffer, lenp, ppos);
2054}
2055
1da177e4
LT
2056
2057static int do_proc_dointvec_conv(int *negp, unsigned long *lvalp,
2058 int *valp,
2059 int write, void *data)
2060{
2061 if (write) {
2062 *valp = *negp ? -*lvalp : *lvalp;
2063 } else {
2064 int val = *valp;
2065 if (val < 0) {
2066 *negp = -1;
2067 *lvalp = (unsigned long)-val;
2068 } else {
2069 *negp = 0;
2070 *lvalp = (unsigned long)val;
2071 }
2072 }
2073 return 0;
2074}
2075
d8217f07 2076static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
8d65af78 2077 int write, void __user *buffer,
fcfbd547 2078 size_t *lenp, loff_t *ppos,
1da177e4
LT
2079 int (*conv)(int *negp, unsigned long *lvalp, int *valp,
2080 int write, void *data),
2081 void *data)
2082{
2083#define TMPBUFLEN 21
7338f299 2084 int *i, vleft, first = 1, neg;
1da177e4
LT
2085 unsigned long lval;
2086 size_t left, len;
2087
2088 char buf[TMPBUFLEN], *p;
2089 char __user *s = buffer;
2090
fcfbd547 2091 if (!tbl_data || !table->maxlen || !*lenp ||
1da177e4
LT
2092 (*ppos && !write)) {
2093 *lenp = 0;
2094 return 0;
2095 }
2096
fcfbd547 2097 i = (int *) tbl_data;
1da177e4
LT
2098 vleft = table->maxlen / sizeof(*i);
2099 left = *lenp;
2100
2101 if (!conv)
2102 conv = do_proc_dointvec_conv;
2103
2104 for (; left && vleft--; i++, first=0) {
2105 if (write) {
2106 while (left) {
2107 char c;
2108 if (get_user(c, s))
2109 return -EFAULT;
2110 if (!isspace(c))
2111 break;
2112 left--;
2113 s++;
2114 }
2115 if (!left)
2116 break;
2117 neg = 0;
2118 len = left;
2119 if (len > sizeof(buf) - 1)
2120 len = sizeof(buf) - 1;
2121 if (copy_from_user(buf, s, len))
2122 return -EFAULT;
2123 buf[len] = 0;
2124 p = buf;
2125 if (*p == '-' && left > 1) {
2126 neg = 1;
bd9b0bac 2127 p++;
1da177e4
LT
2128 }
2129 if (*p < '0' || *p > '9')
2130 break;
2131
2132 lval = simple_strtoul(p, &p, 0);
2133
2134 len = p-buf;
2135 if ((len < left) && *p && !isspace(*p))
2136 break;
1da177e4
LT
2137 s += len;
2138 left -= len;
2139
2140 if (conv(&neg, &lval, i, 1, data))
2141 break;
2142 } else {
2143 p = buf;
2144 if (!first)
2145 *p++ = '\t';
2146
2147 if (conv(&neg, &lval, i, 0, data))
2148 break;
2149
2150 sprintf(p, "%s%lu", neg ? "-" : "", lval);
2151 len = strlen(buf);
2152 if (len > left)
2153 len = left;
2154 if(copy_to_user(s, buf, len))
2155 return -EFAULT;
2156 left -= len;
2157 s += len;
2158 }
2159 }
2160
2161 if (!write && !first && left) {
2162 if(put_user('\n', s))
2163 return -EFAULT;
2164 left--, s++;
2165 }
2166 if (write) {
2167 while (left) {
2168 char c;
2169 if (get_user(c, s++))
2170 return -EFAULT;
2171 if (!isspace(c))
2172 break;
2173 left--;
2174 }
2175 }
2176 if (write && first)
2177 return -EINVAL;
2178 *lenp -= left;
2179 *ppos += *lenp;
2180 return 0;
2181#undef TMPBUFLEN
2182}
2183
8d65af78 2184static int do_proc_dointvec(struct ctl_table *table, int write,
fcfbd547
KK
2185 void __user *buffer, size_t *lenp, loff_t *ppos,
2186 int (*conv)(int *negp, unsigned long *lvalp, int *valp,
2187 int write, void *data),
2188 void *data)
2189{
8d65af78 2190 return __do_proc_dointvec(table->data, table, write,
fcfbd547
KK
2191 buffer, lenp, ppos, conv, data);
2192}
2193
1da177e4
LT
2194/**
2195 * proc_dointvec - read a vector of integers
2196 * @table: the sysctl table
2197 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2198 * @buffer: the user buffer
2199 * @lenp: the size of the user buffer
2200 * @ppos: file position
2201 *
2202 * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2203 * values from/to the user buffer, treated as an ASCII string.
2204 *
2205 * Returns 0 on success.
2206 */
8d65af78 2207int proc_dointvec(struct ctl_table *table, int write,
1da177e4
LT
2208 void __user *buffer, size_t *lenp, loff_t *ppos)
2209{
8d65af78 2210 return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4
LT
2211 NULL,NULL);
2212}
2213
34f5a398 2214/*
25ddbb18
AK
2215 * Taint values can only be increased
2216 * This means we can safely use a temporary.
34f5a398 2217 */
8d65af78 2218static int proc_taint(struct ctl_table *table, int write,
34f5a398
TT
2219 void __user *buffer, size_t *lenp, loff_t *ppos)
2220{
25ddbb18
AK
2221 struct ctl_table t;
2222 unsigned long tmptaint = get_taint();
2223 int err;
34f5a398 2224
91fcd412 2225 if (write && !capable(CAP_SYS_ADMIN))
34f5a398
TT
2226 return -EPERM;
2227
25ddbb18
AK
2228 t = *table;
2229 t.data = &tmptaint;
8d65af78 2230 err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
25ddbb18
AK
2231 if (err < 0)
2232 return err;
2233
2234 if (write) {
2235 /*
2236 * Poor man's atomic or. Not worth adding a primitive
2237 * to everyone's atomic.h for this
2238 */
2239 int i;
2240 for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
2241 if ((tmptaint >> i) & 1)
2242 add_taint(i);
2243 }
2244 }
2245
2246 return err;
34f5a398
TT
2247}
2248
1da177e4
LT
2249struct do_proc_dointvec_minmax_conv_param {
2250 int *min;
2251 int *max;
2252};
2253
2254static int do_proc_dointvec_minmax_conv(int *negp, unsigned long *lvalp,
2255 int *valp,
2256 int write, void *data)
2257{
2258 struct do_proc_dointvec_minmax_conv_param *param = data;
2259 if (write) {
2260 int val = *negp ? -*lvalp : *lvalp;
2261 if ((param->min && *param->min > val) ||
2262 (param->max && *param->max < val))
2263 return -EINVAL;
2264 *valp = val;
2265 } else {
2266 int val = *valp;
2267 if (val < 0) {
2268 *negp = -1;
2269 *lvalp = (unsigned long)-val;
2270 } else {
2271 *negp = 0;
2272 *lvalp = (unsigned long)val;
2273 }
2274 }
2275 return 0;
2276}
2277
2278/**
2279 * proc_dointvec_minmax - read a vector of integers with min/max values
2280 * @table: the sysctl table
2281 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2282 * @buffer: the user buffer
2283 * @lenp: the size of the user buffer
2284 * @ppos: file position
2285 *
2286 * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2287 * values from/to the user buffer, treated as an ASCII string.
2288 *
2289 * This routine will ensure the values are within the range specified by
2290 * table->extra1 (min) and table->extra2 (max).
2291 *
2292 * Returns 0 on success.
2293 */
8d65af78 2294int proc_dointvec_minmax(struct ctl_table *table, int write,
1da177e4
LT
2295 void __user *buffer, size_t *lenp, loff_t *ppos)
2296{
2297 struct do_proc_dointvec_minmax_conv_param param = {
2298 .min = (int *) table->extra1,
2299 .max = (int *) table->extra2,
2300 };
8d65af78 2301 return do_proc_dointvec(table, write, buffer, lenp, ppos,
1da177e4
LT
2302 do_proc_dointvec_minmax_conv, &param);
2303}
2304
d8217f07 2305static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
1da177e4
LT
2306 void __user *buffer,
2307 size_t *lenp, loff_t *ppos,
2308 unsigned long convmul,
2309 unsigned long convdiv)
2310{
2311#define TMPBUFLEN 21
2312 unsigned long *i, *min, *max, val;
2313 int vleft, first=1, neg;
2314 size_t len, left;
2315 char buf[TMPBUFLEN], *p;
2316 char __user *s = buffer;
2317
fcfbd547 2318 if (!data || !table->maxlen || !*lenp ||
1da177e4
LT
2319 (*ppos && !write)) {
2320 *lenp = 0;
2321 return 0;
2322 }
2323
fcfbd547 2324 i = (unsigned long *) data;
1da177e4
LT
2325 min = (unsigned long *) table->extra1;
2326 max = (unsigned long *) table->extra2;
2327 vleft = table->maxlen / sizeof(unsigned long);
2328 left = *lenp;
2329
2330 for (; left && vleft--; i++, min++, max++, first=0) {
2331 if (write) {
2332 while (left) {
2333 char c;
2334 if (get_user(c, s))
2335 return -EFAULT;
2336 if (!isspace(c))
2337 break;
2338 left--;
2339 s++;
2340 }
2341 if (!left)
2342 break;
2343 neg = 0;
2344 len = left;
2345 if (len > TMPBUFLEN-1)
2346 len = TMPBUFLEN-1;
2347 if (copy_from_user(buf, s, len))
2348 return -EFAULT;
2349 buf[len] = 0;
2350 p = buf;
2351 if (*p == '-' && left > 1) {
2352 neg = 1;
bd9b0bac 2353 p++;
1da177e4
LT
2354 }
2355 if (*p < '0' || *p > '9')
2356 break;
2357 val = simple_strtoul(p, &p, 0) * convmul / convdiv ;
2358 len = p-buf;
2359 if ((len < left) && *p && !isspace(*p))
2360 break;
2361 if (neg)
2362 val = -val;
2363 s += len;
2364 left -= len;
2365
2366 if(neg)
2367 continue;
2368 if ((min && val < *min) || (max && val > *max))
2369 continue;
2370 *i = val;
2371 } else {
2372 p = buf;
2373 if (!first)
2374 *p++ = '\t';
2375 sprintf(p, "%lu", convdiv * (*i) / convmul);
2376 len = strlen(buf);
2377 if (len > left)
2378 len = left;
2379 if(copy_to_user(s, buf, len))
2380 return -EFAULT;
2381 left -= len;
2382 s += len;
2383 }
2384 }
2385
2386 if (!write && !first && left) {
2387 if(put_user('\n', s))
2388 return -EFAULT;
2389 left--, s++;
2390 }
2391 if (write) {
2392 while (left) {
2393 char c;
2394 if (get_user(c, s++))
2395 return -EFAULT;
2396 if (!isspace(c))
2397 break;
2398 left--;
2399 }
2400 }
2401 if (write && first)
2402 return -EINVAL;
2403 *lenp -= left;
2404 *ppos += *lenp;
2405 return 0;
2406#undef TMPBUFLEN
2407}
2408
d8217f07 2409static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
fcfbd547
KK
2410 void __user *buffer,
2411 size_t *lenp, loff_t *ppos,
2412 unsigned long convmul,
2413 unsigned long convdiv)
2414{
2415 return __do_proc_doulongvec_minmax(table->data, table, write,
8d65af78 2416 buffer, lenp, ppos, convmul, convdiv);
fcfbd547
KK
2417}
2418
1da177e4
LT
2419/**
2420 * proc_doulongvec_minmax - read a vector of long integers with min/max values
2421 * @table: the sysctl table
2422 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2423 * @buffer: the user buffer
2424 * @lenp: the size of the user buffer
2425 * @ppos: file position
2426 *
2427 * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
2428 * values from/to the user buffer, treated as an ASCII string.
2429 *
2430 * This routine will ensure the values are within the range specified by
2431 * table->extra1 (min) and table->extra2 (max).
2432 *
2433 * Returns 0 on success.
2434 */
8d65af78 2435int proc_doulongvec_minmax(struct ctl_table *table, int write,
1da177e4
LT
2436 void __user *buffer, size_t *lenp, loff_t *ppos)
2437{
8d65af78 2438 return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
1da177e4
LT
2439}
2440
2441/**
2442 * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values
2443 * @table: the sysctl table
2444 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2445 * @buffer: the user buffer
2446 * @lenp: the size of the user buffer
2447 * @ppos: file position
2448 *
2449 * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
2450 * values from/to the user buffer, treated as an ASCII string. The values
2451 * are treated as milliseconds, and converted to jiffies when they are stored.
2452 *
2453 * This routine will ensure the values are within the range specified by
2454 * table->extra1 (min) and table->extra2 (max).
2455 *
2456 * Returns 0 on success.
2457 */
d8217f07 2458int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
1da177e4
LT
2459 void __user *buffer,
2460 size_t *lenp, loff_t *ppos)
2461{
8d65af78 2462 return do_proc_doulongvec_minmax(table, write, buffer,
1da177e4
LT
2463 lenp, ppos, HZ, 1000l);
2464}
2465
2466
2467static int do_proc_dointvec_jiffies_conv(int *negp, unsigned long *lvalp,
2468 int *valp,
2469 int write, void *data)
2470{
2471 if (write) {
cba9f33d
BS
2472 if (*lvalp > LONG_MAX / HZ)
2473 return 1;
1da177e4
LT
2474 *valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
2475 } else {
2476 int val = *valp;
2477 unsigned long lval;
2478 if (val < 0) {
2479 *negp = -1;
2480 lval = (unsigned long)-val;
2481 } else {
2482 *negp = 0;
2483 lval = (unsigned long)val;
2484 }
2485 *lvalp = lval / HZ;
2486 }
2487 return 0;
2488}
2489
2490static int do_proc_dointvec_userhz_jiffies_conv(int *negp, unsigned long *lvalp,
2491 int *valp,
2492 int write, void *data)
2493{
2494 if (write) {
cba9f33d
BS
2495 if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
2496 return 1;
1da177e4
LT
2497 *valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
2498 } else {
2499 int val = *valp;
2500 unsigned long lval;
2501 if (val < 0) {
2502 *negp = -1;
2503 lval = (unsigned long)-val;
2504 } else {
2505 *negp = 0;
2506 lval = (unsigned long)val;
2507 }
2508 *lvalp = jiffies_to_clock_t(lval);
2509 }
2510 return 0;
2511}
2512
2513static int do_proc_dointvec_ms_jiffies_conv(int *negp, unsigned long *lvalp,
2514 int *valp,
2515 int write, void *data)
2516{
2517 if (write) {
2518 *valp = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
2519 } else {
2520 int val = *valp;
2521 unsigned long lval;
2522 if (val < 0) {
2523 *negp = -1;
2524 lval = (unsigned long)-val;
2525 } else {
2526 *negp = 0;
2527 lval = (unsigned long)val;
2528 }
2529 *lvalp = jiffies_to_msecs(lval);
2530 }
2531 return 0;
2532}
2533
2534/**
2535 * proc_dointvec_jiffies - read a vector of integers as seconds
2536 * @table: the sysctl table
2537 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2538 * @buffer: the user buffer
2539 * @lenp: the size of the user buffer
2540 * @ppos: file position
2541 *
2542 * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2543 * values from/to the user buffer, treated as an ASCII string.
2544 * The values read are assumed to be in seconds, and are converted into
2545 * jiffies.
2546 *
2547 * Returns 0 on success.
2548 */
8d65af78 2549int proc_dointvec_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2550 void __user *buffer, size_t *lenp, loff_t *ppos)
2551{
8d65af78 2552 return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4
LT
2553 do_proc_dointvec_jiffies_conv,NULL);
2554}
2555
2556/**
2557 * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds
2558 * @table: the sysctl table
2559 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2560 * @buffer: the user buffer
2561 * @lenp: the size of the user buffer
1e5d5331 2562 * @ppos: pointer to the file position
1da177e4
LT
2563 *
2564 * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2565 * values from/to the user buffer, treated as an ASCII string.
2566 * The values read are assumed to be in 1/USER_HZ seconds, and
2567 * are converted into jiffies.
2568 *
2569 * Returns 0 on success.
2570 */
8d65af78 2571int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2572 void __user *buffer, size_t *lenp, loff_t *ppos)
2573{
8d65af78 2574 return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4
LT
2575 do_proc_dointvec_userhz_jiffies_conv,NULL);
2576}
2577
2578/**
2579 * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
2580 * @table: the sysctl table
2581 * @write: %TRUE if this is a write to the sysctl file
1da177e4
LT
2582 * @buffer: the user buffer
2583 * @lenp: the size of the user buffer
67be2dd1
MW
2584 * @ppos: file position
2585 * @ppos: the current position in the file
1da177e4
LT
2586 *
2587 * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
2588 * values from/to the user buffer, treated as an ASCII string.
2589 * The values read are assumed to be in 1/1000 seconds, and
2590 * are converted into jiffies.
2591 *
2592 * Returns 0 on success.
2593 */
8d65af78 2594int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2595 void __user *buffer, size_t *lenp, loff_t *ppos)
2596{
8d65af78 2597 return do_proc_dointvec(table, write, buffer, lenp, ppos,
1da177e4
LT
2598 do_proc_dointvec_ms_jiffies_conv, NULL);
2599}
2600
8d65af78 2601static int proc_do_cad_pid(struct ctl_table *table, int write,
9ec52099
CLG
2602 void __user *buffer, size_t *lenp, loff_t *ppos)
2603{
2604 struct pid *new_pid;
2605 pid_t tmp;
2606 int r;
2607
6c5f3e7b 2608 tmp = pid_vnr(cad_pid);
9ec52099 2609
8d65af78 2610 r = __do_proc_dointvec(&tmp, table, write, buffer,
9ec52099
CLG
2611 lenp, ppos, NULL, NULL);
2612 if (r || !write)
2613 return r;
2614
2615 new_pid = find_get_pid(tmp);
2616 if (!new_pid)
2617 return -ESRCH;
2618
2619 put_pid(xchg(&cad_pid, new_pid));
2620 return 0;
2621}
2622
1da177e4
LT
2623#else /* CONFIG_PROC_FS */
2624
8d65af78 2625int proc_dostring(struct ctl_table *table, int write,
1da177e4
LT
2626 void __user *buffer, size_t *lenp, loff_t *ppos)
2627{
2628 return -ENOSYS;
2629}
2630
8d65af78 2631int proc_dointvec(struct ctl_table *table, int write,
1da177e4 2632 void __user *buffer, size_t *lenp, loff_t *ppos)
1da177e4
LT
2633{
2634 return -ENOSYS;
2635}
2636
8d65af78 2637int proc_dointvec_minmax(struct ctl_table *table, int write,
1da177e4
LT
2638 void __user *buffer, size_t *lenp, loff_t *ppos)
2639{
2640 return -ENOSYS;
2641}
2642
8d65af78 2643int proc_dointvec_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2644 void __user *buffer, size_t *lenp, loff_t *ppos)
2645{
2646 return -ENOSYS;
2647}
2648
8d65af78 2649int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2650 void __user *buffer, size_t *lenp, loff_t *ppos)
2651{
2652 return -ENOSYS;
2653}
2654
8d65af78 2655int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
1da177e4
LT
2656 void __user *buffer, size_t *lenp, loff_t *ppos)
2657{
2658 return -ENOSYS;
2659}
2660
8d65af78 2661int proc_doulongvec_minmax(struct ctl_table *table, int write,
1da177e4
LT
2662 void __user *buffer, size_t *lenp, loff_t *ppos)
2663{
2664 return -ENOSYS;
2665}
2666
d8217f07 2667int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
1da177e4
LT
2668 void __user *buffer,
2669 size_t *lenp, loff_t *ppos)
2670{
2671 return -ENOSYS;
2672}
2673
2674
2675#endif /* CONFIG_PROC_FS */
2676
1da177e4
LT
2677/*
2678 * No sense putting this after each symbol definition, twice,
2679 * exception granted :-)
2680 */
2681EXPORT_SYMBOL(proc_dointvec);
2682EXPORT_SYMBOL(proc_dointvec_jiffies);
2683EXPORT_SYMBOL(proc_dointvec_minmax);
2684EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
2685EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
2686EXPORT_SYMBOL(proc_dostring);
2687EXPORT_SYMBOL(proc_doulongvec_minmax);
2688EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
2689EXPORT_SYMBOL(register_sysctl_table);
29e796fd 2690EXPORT_SYMBOL(register_sysctl_paths);
1da177e4 2691EXPORT_SYMBOL(unregister_sysctl_table);