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