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