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