Blame view

kernel/sysctl.c 61.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  /*
   * sysctl.c: General linux system control interface
   *
   * Begun 24 March 1995, Stephen Tweedie
   * Added /proc support, Dec 1995
   * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas.
   * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver.
   * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver.
   * Dynamic registration fixes, Stephen Tweedie.
   * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn.
   * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris
   *  Horn.
   * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer.
   * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer.
   * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill
   *  Wendling.
   * The list_for_each() macro wasn't appropriate for the sysctl loop.
   *  Removed it and replaced it with older style, 03/23/00, Bill Wendling
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
23
24
25
  #include <linux/module.h>
  #include <linux/mm.h>
  #include <linux/swap.h>
  #include <linux/slab.h>
  #include <linux/sysctl.h>
  #include <linux/proc_fs.h>
72c2d5823   Andrew Morgan   V3 file capabilit...
26
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  #include <linux/ctype.h>
dfec072ec   Vegard Nossum   kmemcheck: add th...
28
  #include <linux/kmemcheck.h>
62239ac2b   Adrian Bunk   proper prototype ...
29
  #include <linux/fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
  #include <linux/init.h>
  #include <linux/kernel.h>
0296b2281   Kay Sievers   [PATCH] remove CO...
32
  #include <linux/kobject.h>
20380731b   Arnaldo Carvalho de Melo   [NET]: Fix sparse...
33
  #include <linux/net.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
  #include <linux/sysrq.h>
  #include <linux/highuid.h>
  #include <linux/writeback.h>
3fff4c42b   Ingo Molnar   printk: Remove ra...
37
  #include <linux/ratelimit.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  #include <linux/hugetlb.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  #include <linux/initrd.h>
0b77f5bfb   David Howells   keys: make the ke...
40
  #include <linux/key.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
44
  #include <linux/times.h>
  #include <linux/limits.h>
  #include <linux/dcache.h>
  #include <linux/syscalls.h>
c748e1340   Adrian Bunk   mm/vmstat.c: prop...
45
  #include <linux/vmstat.h>
c255d844d   Pavel Machek   [PATCH] suspend-t...
46
47
  #include <linux/nfs_fs.h>
  #include <linux/acpi.h>
10a0a8d4e   Jeremy Fitzhardinge   Add common orderl...
48
  #include <linux/reboot.h>
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
49
  #include <linux/ftrace.h>
12e22c5e4   David Howells   Make the slow wor...
50
  #include <linux/slow-work.h>
cdd6c482c   Ingo Molnar   perf: Do the big ...
51
  #include <linux/perf_event.h>
b2be84df9   Masami Hiramatsu   kprobes: Jump opt...
52
  #include <linux/kprobes.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
55
  
  #include <asm/uaccess.h>
  #include <asm/processor.h>
29cbc78b9   Andi Kleen   [PATCH] x86: Clea...
56
57
  #ifdef CONFIG_X86
  #include <asm/nmi.h>
0741f4d20   Chuck Ebbert   [PATCH] x86: add ...
58
  #include <asm/stacktrace.h>
6e7c40259   Ingo Molnar   x86: various chan...
59
  #include <asm/io.h>
29cbc78b9   Andi Kleen   [PATCH] x86: Clea...
60
  #endif
7058cb02d   Eric W. Biederman   sysctl: deprecate...
61

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
65
  #if defined(CONFIG_SYSCTL)
  
  /* External variables not in a header file. */
  extern int C_A_D;
45807a1df   Ingo Molnar   vdso: print fatal...
66
  extern int print_fatal_signals;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
68
  extern int sysctl_overcommit_memory;
  extern int sysctl_overcommit_ratio;
fadd8fbd1   KAMEZAWA Hiroyuki   [PATCH] support f...
69
  extern int sysctl_panic_on_oom;
fe071d7e8   David Rientjes   oom: add oom_kill...
70
  extern int sysctl_oom_kill_allocating_task;
fef1bdd68   David Rientjes   oom: add sysctl t...
71
  extern int sysctl_oom_dump_tasks;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
  extern int max_threads;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  extern int core_uses_pid;
d6e711448   Alan Cox   [PATCH] setuid co...
74
  extern int suid_dumpable;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  extern char core_pattern[];
a293980c2   Neil Horman   exec: let do_core...
76
  extern unsigned int core_pipe_limit;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
  extern int pid_max;
  extern int min_free_kbytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  extern int pid_max_min, pid_max_max;
9d0243bca   Andrew Morton   [PATCH] drop-page...
80
  extern int sysctl_drop_caches;
8ad4b1fb8   Rohit Seth   [PATCH] Make high...
81
  extern int percpu_pagelist_fraction;
bebfa1013   Andi Kleen   [PATCH] x86_64: A...
82
  extern int compat_log;
9745512ce   Arjan van de Ven   sched: latencytop...
83
  extern int latencytop_enabled;
eceea0b3d   Al Viro   [PATCH] avoid mul...
84
  extern int sysctl_nr_open_min, sysctl_nr_open_max;
dd8632a12   Paul Mundt   NOMMU: Make mmap ...
85
86
87
  #ifndef CONFIG_MMU
  extern int sysctl_nr_trim_pages;
  #endif
31a72bce0   Paul E. McKenney   rcu: make rcutort...
88
89
90
  #ifdef CONFIG_RCU_TORTURE_TEST
  extern int rcutorture_runnable;
  #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */
cb684b5bc   Jens Axboe   block: fix linkag...
91
  #ifdef CONFIG_BLOCK
5e605b64a   Jens Axboe   block: add blk-io...
92
  extern int blk_iopoll_enabled;
cb684b5bc   Jens Axboe   block: fix linkag...
93
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94

c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
95
  /* Constants used for minimum and  maximum */
195cf453d   Bron Gondwana   mm/page-writeback...
96
  #ifdef CONFIG_DETECT_SOFTLOCKUP
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
97
  static int sixty = 60;
9383d9679   Dimitri Sivanich   softlockup: fix s...
98
  static int neg_one = -1;
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
99
  #endif
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
100
  static int zero;
cd5f9a4c3   Linus Torvalds   kernel/sysctl.c: ...
101
102
  static int __maybe_unused one = 1;
  static int __maybe_unused two = 2;
fc3501d41   Sven Wegener   mm: fix dirty_byt...
103
  static unsigned long one_ul = 1;
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
104
  static int one_hundred = 100;
af91322ef   Dave Young   printk: add print...
105
106
107
  #ifdef CONFIG_PRINTK
  static int ten_thousand = 10000;
  #endif
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
108

9e4a5bda8   Andrea Righi   mm: prevent divid...
109
110
  /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */
  static unsigned long dirty_bytes_min = 2 * PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
  /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */
  static int maxolduid = 65535;
  static int minolduid;
8ad4b1fb8   Rohit Seth   [PATCH] Make high...
114
  static int min_percpu_pagelist_fract = 8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
  
  static int ngroups_max = NGROUPS_MAX;
a1ef5adb4   Johannes Berg   remove CONFIG_KMO...
117
  #ifdef CONFIG_MODULES
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  extern char modprobe_path[];
3d43321b7   Kees Cook   modules: sysctl t...
119
  extern int modules_disabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
  #ifdef CONFIG_CHR_DEV_SG
  extern int sg_big_buff;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124

72c57ed50   David S. Miller   sysctl: Use CONFI...
125
  #ifdef CONFIG_SPARC
17f04fbb0   David S. Miller   sysctl: Use heade...
126
  #include <asm/system.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  #endif
0871420fa   David S. Miller   sparc64: Add tsb-...
128
129
130
  #ifdef CONFIG_SPARC64
  extern int sysctl_tsb_ratio;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
134
  #ifdef __hppa__
  extern int pwrsw_enabled;
  extern int unaligned_enabled;
  #endif
347a8dc3b   Martin Schwidefsky   [PATCH] s390: cle...
135
  #ifdef CONFIG_S390
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
  #ifdef CONFIG_MATHEMU
  extern int sysctl_ieee_emulation_warnings;
  #endif
  extern int sysctl_userprocess_debug;
951f22d5b   Martin Schwidefsky   [PATCH] s390: spi...
140
  extern int spin_retry;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
  #ifdef CONFIG_BSD_PROCESS_ACCT
  extern int acct_parm[];
  #endif
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
145
146
  #ifdef CONFIG_IA64
  extern int no_unaligned_warning;
88fc241f5   Doug Chapman   [IA64] dump stack...
147
  extern int unaligned_dump_stack;
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
148
  #endif
3fff4c42b   Ingo Molnar   printk: Remove ra...
149
  extern struct ratelimit_state printk_ratelimit_state;
23f78d4a0   Ingo Molnar   [PATCH] pi-futex:...
150
151
152
  #ifdef CONFIG_RT_MUTEXES
  extern int max_lock_depth;
  #endif
d6f8ff738   Randy Dunlap   [PATCH] cad_pid s...
153
  #ifdef CONFIG_PROC_SYSCTL
8d65af789   Alexey Dobriyan   sysctl: remove "s...
154
  static int proc_do_cad_pid(struct ctl_table *table, int write,
9ec52099e   Cedric Le Goater   [PATCH] replace c...
155
  		  void __user *buffer, size_t *lenp, loff_t *ppos);
8d65af789   Alexey Dobriyan   sysctl: remove "s...
156
  static int proc_taint(struct ctl_table *table, int write,
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
157
  			       void __user *buffer, size_t *lenp, loff_t *ppos);
d6f8ff738   Randy Dunlap   [PATCH] cad_pid s...
158
  #endif
9ec52099e   Cedric Le Goater   [PATCH] replace c...
159

d8217f076   Eric W. Biederman   sysctl core: Stop...
160
  static struct ctl_table root_table[];
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
161
162
  static struct ctl_table_root sysctl_table_root;
  static struct ctl_table_header root_table_header = {
b380b0d4f   Al Viro   forgotten refcoun...
163
  	.count = 1,
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
164
  	.ctl_table = root_table,
734550921   Al Viro   [PATCH] beginning...
165
  	.ctl_entry = LIST_HEAD_INIT(sysctl_table_root.default_set.list),
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
166
  	.root = &sysctl_table_root,
734550921   Al Viro   [PATCH] beginning...
167
  	.set = &sysctl_table_root.default_set,
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
168
169
170
  };
  static struct ctl_table_root sysctl_table_root = {
  	.root_list = LIST_HEAD_INIT(sysctl_table_root.root_list),
734550921   Al Viro   [PATCH] beginning...
171
  	.default_set.list = LIST_HEAD_INIT(root_table_header.ctl_entry),
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
172
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173

d8217f076   Eric W. Biederman   sysctl core: Stop...
174
175
176
177
178
179
  static struct ctl_table kern_table[];
  static struct ctl_table vm_table[];
  static struct ctl_table fs_table[];
  static struct ctl_table debug_table[];
  static struct ctl_table dev_table[];
  extern struct ctl_table random_table[];
2d9048e20   Amy Griffis   [PATCH] inotify (...
180
  #ifdef CONFIG_INOTIFY_USER
d8217f076   Eric W. Biederman   sysctl core: Stop...
181
  extern struct ctl_table inotify_table[];
0399cb08c   Robert Love   [PATCH] inotify: ...
182
  #endif
7ef9964e6   Davide Libenzi   epoll: introduce ...
183
184
185
  #ifdef CONFIG_EPOLL
  extern struct ctl_table epoll_table[];
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
188
189
  
  #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
  int sysctl_legacy_va_layout;
  #endif
f20786ff4   Peter Zijlstra   lockstat: core in...
190
191
  extern int prove_locking;
  extern int lock_stat;
9bc9a6bd3   Eric W. Biederman   [PATCH] sysctl: s...
192

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
  /* The default sysctl tables: */
d8217f076   Eric W. Biederman   sysctl core: Stop...
194
  static struct ctl_table root_table[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
199
200
  		.procname	= "kernel",
  		.mode		= 0555,
  		.child		= kern_table,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
204
  		.procname	= "vm",
  		.mode		= 0555,
  		.child		= vm_table,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
209
210
  		.procname	= "fs",
  		.mode		= 0555,
  		.child		= fs_table,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
214
215
  		.procname	= "debug",
  		.mode		= 0555,
  		.child		= debug_table,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
217
218
219
  		.procname	= "dev",
  		.mode		= 0555,
  		.child		= dev_table,
  	},
2be7fe075   Andrew Morton   sysctl.c: add tex...
220
221
222
223
  /*
   * NOTE: do not add new entries to this table unless you have read
   * Documentation/sysctl/ctl_unnumbered.txt
   */
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
224
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  };
77e54a1f8   Ingo Molnar   sched: add CFS de...
226
  #ifdef CONFIG_SCHED_DEBUG
73c4efd2c   Eric Dumazet   sched: sysctl, pr...
227
228
229
230
  static int min_sched_granularity_ns = 100000;		/* 100 usecs */
  static int max_sched_granularity_ns = NSEC_PER_SEC;	/* 1 second */
  static int min_wakeup_granularity_ns;			/* 0 usecs */
  static int max_wakeup_granularity_ns = NSEC_PER_SEC;	/* 1 second */
1983a922a   Christian Ehrhardt   sched: Make tunab...
231
232
  static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE;
  static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1;
acb4a848d   Christian Ehrhardt   sched: Update nor...
233
234
  static int min_sched_shares_ratelimit = 100000; /* 100 usec */
  static int max_sched_shares_ratelimit = NSEC_PER_SEC; /* 1 second */
77e54a1f8   Ingo Molnar   sched: add CFS de...
235
  #endif
d8217f076   Eric W. Biederman   sysctl core: Stop...
236
  static struct ctl_table kern_table[] = {
2bba22c50   Mike Galbraith   sched: Turn off c...
237
  	{
2bba22c50   Mike Galbraith   sched: Turn off c...
238
239
240
241
  		.procname	= "sched_child_runs_first",
  		.data		= &sysctl_sched_child_runs_first,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
242
  		.proc_handler	= proc_dointvec,
2bba22c50   Mike Galbraith   sched: Turn off c...
243
  	},
77e54a1f8   Ingo Molnar   sched: add CFS de...
244
245
  #ifdef CONFIG_SCHED_DEBUG
  	{
b2be5e96d   Peter Zijlstra   sched: reintroduc...
246
247
  		.procname	= "sched_min_granularity_ns",
  		.data		= &sysctl_sched_min_granularity,
77e54a1f8   Ingo Molnar   sched: add CFS de...
248
249
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
702a7c760   Linus Torvalds   Merge branch 'sch...
250
  		.proc_handler	= sched_proc_update_handler,
b2be5e96d   Peter Zijlstra   sched: reintroduc...
251
252
  		.extra1		= &min_sched_granularity_ns,
  		.extra2		= &max_sched_granularity_ns,
77e54a1f8   Ingo Molnar   sched: add CFS de...
253
254
  	},
  	{
218050855   Peter Zijlstra   sched: adaptive s...
255
256
257
258
  		.procname	= "sched_latency_ns",
  		.data		= &sysctl_sched_latency,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
702a7c760   Linus Torvalds   Merge branch 'sch...
259
  		.proc_handler	= sched_proc_update_handler,
218050855   Peter Zijlstra   sched: adaptive s...
260
261
262
263
  		.extra1		= &min_sched_granularity_ns,
  		.extra2		= &max_sched_granularity_ns,
  	},
  	{
77e54a1f8   Ingo Molnar   sched: add CFS de...
264
265
266
267
  		.procname	= "sched_wakeup_granularity_ns",
  		.data		= &sysctl_sched_wakeup_granularity,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
702a7c760   Linus Torvalds   Merge branch 'sch...
268
  		.proc_handler	= sched_proc_update_handler,
77e54a1f8   Ingo Molnar   sched: add CFS de...
269
270
271
272
  		.extra1		= &min_wakeup_granularity_ns,
  		.extra2		= &max_wakeup_granularity_ns,
  	},
  	{
2398f2c6d   Peter Zijlstra   sched: update sha...
273
274
275
276
  		.procname	= "sched_shares_ratelimit",
  		.data		= &sysctl_sched_shares_ratelimit,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
702a7c760   Linus Torvalds   Merge branch 'sch...
277
  		.proc_handler	= sched_proc_update_handler,
acb4a848d   Christian Ehrhardt   sched: Update nor...
278
279
  		.extra1		= &min_sched_shares_ratelimit,
  		.extra2		= &max_sched_shares_ratelimit,
2398f2c6d   Peter Zijlstra   sched: update sha...
280
281
  	},
  	{
1983a922a   Christian Ehrhardt   sched: Make tunab...
282
283
284
285
  		.procname	= "sched_tunable_scaling",
  		.data		= &sysctl_sched_tunable_scaling,
  		.maxlen		= sizeof(enum sched_tunable_scaling),
  		.mode		= 0644,
702a7c760   Linus Torvalds   Merge branch 'sch...
286
  		.proc_handler	= sched_proc_update_handler,
1983a922a   Christian Ehrhardt   sched: Make tunab...
287
288
  		.extra1		= &min_sched_tunable_scaling,
  		.extra2		= &max_sched_tunable_scaling,
2398f2c6d   Peter Zijlstra   sched: update sha...
289
290
  	},
  	{
ffda12a17   Peter Zijlstra   sched: optimize g...
291
292
293
294
  		.procname	= "sched_shares_thresh",
  		.data		= &sysctl_sched_shares_thresh,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
295
  		.proc_handler	= proc_dointvec_minmax,
ffda12a17   Peter Zijlstra   sched: optimize g...
296
297
298
  		.extra1		= &zero,
  	},
  	{
da84d9617   Ingo Molnar   sched: reintroduc...
299
300
301
302
  		.procname	= "sched_migration_cost",
  		.data		= &sysctl_sched_migration_cost,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
303
  		.proc_handler	= proc_dointvec,
da84d9617   Ingo Molnar   sched: reintroduc...
304
  	},
b82d9fdd8   Peter Zijlstra   sched: avoid larg...
305
  	{
b82d9fdd8   Peter Zijlstra   sched: avoid larg...
306
307
308
  		.procname	= "sched_nr_migrate",
  		.data		= &sysctl_sched_nr_migrate,
  		.maxlen		= sizeof(unsigned int),
fa85ae241   Peter Zijlstra   sched: rt time limit
309
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
310
  		.proc_handler	= proc_dointvec,
fa85ae241   Peter Zijlstra   sched: rt time limit
311
  	},
cd1bb94b4   Arun R Bharadwaj   timers: /proc/sys...
312
  	{
e9e9250bc   Peter Zijlstra   sched: Scale down...
313
314
315
316
  		.procname	= "sched_time_avg",
  		.data		= &sysctl_sched_time_avg,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
317
  		.proc_handler	= proc_dointvec,
e9e9250bc   Peter Zijlstra   sched: Scale down...
318
319
  	},
  	{
cd1bb94b4   Arun R Bharadwaj   timers: /proc/sys...
320
321
322
323
  		.procname	= "timer_migration",
  		.data		= &sysctl_timer_migration,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
324
  		.proc_handler	= proc_dointvec_minmax,
bfdb4d9f0   Arun R Bharadwaj   timers: Fix timer...
325
326
  		.extra1		= &zero,
  		.extra2		= &one,
fa85ae241   Peter Zijlstra   sched: rt time limit
327
  	},
1fc84aaae   Peter Zijlstra   sched: fix CONFIG...
328
  #endif
1799e35d5   Ingo Molnar   sched: add /proc/...
329
  	{
9f0c1e560   Peter Zijlstra   sched: rt-group: ...
330
331
332
333
  		.procname	= "sched_rt_period_us",
  		.data		= &sysctl_sched_rt_period,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
334
  		.proc_handler	= sched_rt_handler,
9f0c1e560   Peter Zijlstra   sched: rt-group: ...
335
336
  	},
  	{
9f0c1e560   Peter Zijlstra   sched: rt-group: ...
337
338
339
340
  		.procname	= "sched_rt_runtime_us",
  		.data		= &sysctl_sched_rt_runtime,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
341
  		.proc_handler	= sched_rt_handler,
9f0c1e560   Peter Zijlstra   sched: rt-group: ...
342
343
  	},
  	{
1799e35d5   Ingo Molnar   sched: add /proc/...
344
345
346
347
  		.procname	= "sched_compat_yield",
  		.data		= &sysctl_sched_compat_yield,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
348
  		.proc_handler	= proc_dointvec,
1799e35d5   Ingo Molnar   sched: add /proc/...
349
  	},
f20786ff4   Peter Zijlstra   lockstat: core in...
350
351
  #ifdef CONFIG_PROVE_LOCKING
  	{
f20786ff4   Peter Zijlstra   lockstat: core in...
352
353
354
355
  		.procname	= "prove_locking",
  		.data		= &prove_locking,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
356
  		.proc_handler	= proc_dointvec,
f20786ff4   Peter Zijlstra   lockstat: core in...
357
358
359
360
  	},
  #endif
  #ifdef CONFIG_LOCK_STAT
  	{
f20786ff4   Peter Zijlstra   lockstat: core in...
361
362
363
364
  		.procname	= "lock_stat",
  		.data		= &lock_stat,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
365
  		.proc_handler	= proc_dointvec,
f20786ff4   Peter Zijlstra   lockstat: core in...
366
367
  	},
  #endif
77e54a1f8   Ingo Molnar   sched: add CFS de...
368
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
370
371
372
  		.procname	= "panic",
  		.data		= &panic_timeout,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
373
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
377
378
379
  		.procname	= "core_uses_pid",
  		.data		= &core_uses_pid,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
380
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
382
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
  		.procname	= "core_pattern",
  		.data		= core_pattern,
71ce92f3f   Dan Aloni   make sysctl/kerne...
385
  		.maxlen		= CORENAME_MAX_SIZE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
387
  		.proc_handler	= proc_dostring,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
  	},
a293980c2   Neil Horman   exec: let do_core...
389
  	{
a293980c2   Neil Horman   exec: let do_core...
390
391
392
393
  		.procname	= "core_pipe_limit",
  		.data		= &core_pipe_limit,
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
394
  		.proc_handler	= proc_dointvec,
a293980c2   Neil Horman   exec: let do_core...
395
  	},
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
396
  #ifdef CONFIG_PROC_SYSCTL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
398
  		.procname	= "tainted",
25ddbb18a   Andi Kleen   Make the taint fl...
399
  		.maxlen 	= sizeof(long),
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
400
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
401
  		.proc_handler	= proc_taint,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402
  	},
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
403
  #endif
9745512ce   Arjan van de Ven   sched: latencytop...
404
405
406
407
408
409
  #ifdef CONFIG_LATENCYTOP
  	{
  		.procname	= "latencytop",
  		.data		= &latencytop_enabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
410
  		.proc_handler	= proc_dointvec,
9745512ce   Arjan van de Ven   sched: latencytop...
411
412
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
  #ifdef CONFIG_BLK_DEV_INITRD
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
416
417
418
  		.procname	= "real-root-dev",
  		.data		= &real_root_dev,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
419
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
421
  	},
  #endif
45807a1df   Ingo Molnar   vdso: print fatal...
422
  	{
45807a1df   Ingo Molnar   vdso: print fatal...
423
424
425
426
  		.procname	= "print-fatal-signals",
  		.data		= &print_fatal_signals,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
427
  		.proc_handler	= proc_dointvec,
45807a1df   Ingo Molnar   vdso: print fatal...
428
  	},
72c57ed50   David S. Miller   sysctl: Use CONFI...
429
  #ifdef CONFIG_SPARC
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
430
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
432
433
434
  		.procname	= "reboot-cmd",
  		.data		= reboot_command,
  		.maxlen		= 256,
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
435
  		.proc_handler	= proc_dostring,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
437
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
441
  		.procname	= "stop-a",
  		.data		= &stop_a_enabled,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
442
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
  		.procname	= "scons-poweroff",
  		.data		= &scons_pwroff,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
449
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
451
  	},
  #endif
0871420fa   David S. Miller   sparc64: Add tsb-...
452
453
  #ifdef CONFIG_SPARC64
  	{
0871420fa   David S. Miller   sparc64: Add tsb-...
454
455
456
457
  		.procname	= "tsb-ratio",
  		.data		= &sysctl_tsb_ratio,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
458
  		.proc_handler	= proc_dointvec,
0871420fa   David S. Miller   sparc64: Add tsb-...
459
460
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
  #ifdef __hppa__
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
466
  		.procname	= "soft-power",
  		.data		= &pwrsw_enabled,
  		.maxlen		= sizeof (int),
  	 	.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
467
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
469
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
470
471
472
473
  		.procname	= "unaligned-trap",
  		.data		= &unaligned_enabled,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
474
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
477
  	},
  #endif
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
479
480
481
  		.procname	= "ctrl-alt-del",
  		.data		= &C_A_D,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
482
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483
  	},
606576ce8   Steven Rostedt   ftrace: rename FT...
484
  #ifdef CONFIG_FUNCTION_TRACER
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
485
  	{
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
486
487
488
489
  		.procname	= "ftrace_enabled",
  		.data		= &ftrace_enabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
490
  		.proc_handler	= ftrace_enable_sysctl,
b0fc494fa   Steven Rostedt   ftrace: add ftrac...
491
492
  	},
  #endif
f38f1d2aa   Steven Rostedt   trace: add a way ...
493
494
  #ifdef CONFIG_STACK_TRACER
  	{
f38f1d2aa   Steven Rostedt   trace: add a way ...
495
496
497
498
  		.procname	= "stack_tracer_enabled",
  		.data		= &stack_tracer_enabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
499
  		.proc_handler	= stack_trace_sysctl,
f38f1d2aa   Steven Rostedt   trace: add a way ...
500
501
  	},
  #endif
944ac4259   Steven Rostedt   ftrace: ftrace du...
502
503
  #ifdef CONFIG_TRACING
  	{
3299b4dd1   Peter Zijlstra   ftrace: sysctl typo
504
  		.procname	= "ftrace_dump_on_oops",
944ac4259   Steven Rostedt   ftrace: ftrace du...
505
506
507
  		.data		= &ftrace_dump_on_oops,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
508
  		.proc_handler	= proc_dointvec,
944ac4259   Steven Rostedt   ftrace: ftrace du...
509
510
  	},
  #endif
a1ef5adb4   Johannes Berg   remove CONFIG_KMO...
511
  #ifdef CONFIG_MODULES
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
515
516
  		.procname	= "modprobe",
  		.data		= &modprobe_path,
  		.maxlen		= KMOD_PATH_LEN,
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
517
  		.proc_handler	= proc_dostring,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
518
  	},
3d43321b7   Kees Cook   modules: sysctl t...
519
  	{
3d43321b7   Kees Cook   modules: sysctl t...
520
521
522
523
524
  		.procname	= "modules_disabled",
  		.data		= &modules_disabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		/* only handle a transition from default "0" to "1" */
6d4561110   Eric W. Biederman   sysctl: Drop & in...
525
  		.proc_handler	= proc_dointvec_minmax,
3d43321b7   Kees Cook   modules: sysctl t...
526
527
528
  		.extra1		= &one,
  		.extra2		= &one,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
529
  #endif
57ae25086   Andrew Morton   [PATCH] CONFIG_NE...
530
  #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
  		.procname	= "hotplug",
312c004d3   Kay Sievers   [PATCH] driver co...
533
534
  		.data		= &uevent_helper,
  		.maxlen		= UEVENT_HELPER_PATH_LEN,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
536
  		.proc_handler	= proc_dostring,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
538
539
540
  	},
  #endif
  #ifdef CONFIG_CHR_DEV_SG
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
542
543
544
  		.procname	= "sg-big-buff",
  		.data		= &sg_big_buff,
  		.maxlen		= sizeof (int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
545
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546
547
548
549
  	},
  #endif
  #ifdef CONFIG_BSD_PROCESS_ACCT
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
550
551
552
553
  		.procname	= "acct",
  		.data		= &acct_parm,
  		.maxlen		= 3*sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
554
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
556
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
  #ifdef CONFIG_MAGIC_SYSRQ
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
  		.procname	= "sysrq",
5d6f647fc   Ingo Molnar   [PATCH] debug: ad...
560
  		.data		= &__sysrq_enabled,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
561
562
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
563
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
565
  	},
  #endif
d6f8ff738   Randy Dunlap   [PATCH] cad_pid s...
566
  #ifdef CONFIG_PROC_SYSCTL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
567
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
  		.procname	= "cad_pid",
9ec52099e   Cedric Le Goater   [PATCH] replace c...
569
  		.data		= NULL,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
570
571
  		.maxlen		= sizeof (int),
  		.mode		= 0600,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
572
  		.proc_handler	= proc_do_cad_pid,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
  	},
d6f8ff738   Randy Dunlap   [PATCH] cad_pid s...
574
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
575
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
577
578
579
  		.procname	= "threads-max",
  		.data		= &max_threads,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
580
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
581
582
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
583
584
585
586
  		.procname	= "random",
  		.mode		= 0555,
  		.child		= random_table,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
590
591
  		.procname	= "overflowuid",
  		.data		= &overflowuid,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
592
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
594
595
596
  		.extra1		= &minolduid,
  		.extra2		= &maxolduid,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597
598
599
600
  		.procname	= "overflowgid",
  		.data		= &overflowgid,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
601
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
603
604
  		.extra1		= &minolduid,
  		.extra2		= &maxolduid,
  	},
347a8dc3b   Martin Schwidefsky   [PATCH] s390: cle...
605
  #ifdef CONFIG_S390
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
607
  #ifdef CONFIG_MATHEMU
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
610
611
  		.procname	= "ieee_emulation_warnings",
  		.data		= &sysctl_ieee_emulation_warnings,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
612
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
614
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
617
618
619
  		.procname	= "userprocess_debug",
  		.data		= &sysctl_userprocess_debug,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
620
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
621
622
623
  	},
  #endif
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624
625
626
627
  		.procname	= "pid_max",
  		.data		= &pid_max,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
628
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
630
631
632
  		.extra1		= &pid_max_min,
  		.extra2		= &pid_max_max,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633
634
635
636
  		.procname	= "panic_on_oops",
  		.data		= &panic_on_oops,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
637
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
  	},
7ef3d2fd1   Joe Perches   printk_ratelimit(...
639
640
  #if defined CONFIG_PRINTK
  	{
7ef3d2fd1   Joe Perches   printk_ratelimit(...
641
642
643
644
  		.procname	= "printk",
  		.data		= &console_loglevel,
  		.maxlen		= 4*sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
645
  		.proc_handler	= proc_dointvec,
7ef3d2fd1   Joe Perches   printk_ratelimit(...
646
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648
  		.procname	= "printk_ratelimit",
717115e1a   Dave Young   printk ratelimiti...
649
  		.data		= &printk_ratelimit_state.interval,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
651
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
652
  		.proc_handler	= proc_dointvec_jiffies,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
655
  		.procname	= "printk_ratelimit_burst",
717115e1a   Dave Young   printk ratelimiti...
656
  		.data		= &printk_ratelimit_state.burst,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
658
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
659
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660
  	},
af91322ef   Dave Young   printk: add print...
661
  	{
af91322ef   Dave Young   printk: add print...
662
663
664
665
  		.procname	= "printk_delay",
  		.data		= &printk_delay_msec,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
666
  		.proc_handler	= proc_dointvec_minmax,
af91322ef   Dave Young   printk: add print...
667
668
669
  		.extra1		= &zero,
  		.extra2		= &ten_thousand,
  	},
7ef3d2fd1   Joe Perches   printk_ratelimit(...
670
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
673
674
675
  		.procname	= "ngroups_max",
  		.data		= &ngroups_max,
  		.maxlen		= sizeof (int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
676
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
678
679
  	},
  #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
680
681
682
683
  		.procname       = "unknown_nmi_panic",
  		.data           = &unknown_nmi_panic,
  		.maxlen         = sizeof (int),
  		.mode           = 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
684
  		.proc_handler   = proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
685
  	},
407984f1a   Don Zickus   [PATCH] x86: Add ...
686
  	{
407984f1a   Don Zickus   [PATCH] x86: Add ...
687
688
689
690
  		.procname       = "nmi_watchdog",
  		.data           = &nmi_watchdog_enabled,
  		.maxlen         = sizeof (int),
  		.mode           = 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
691
  		.proc_handler   = proc_nmi_enabled,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
692
693
694
695
  	},
  #endif
  #if defined(CONFIG_X86)
  	{
8da5adda9   Don Zickus   [PATCH] x86: Allo...
696
697
698
699
  		.procname	= "panic_on_unrecovered_nmi",
  		.data		= &panic_on_unrecovered_nmi,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
700
  		.proc_handler	= proc_dointvec,
8da5adda9   Don Zickus   [PATCH] x86: Allo...
701
702
  	},
  	{
5211a242d   Kurt Garloff   x86: Add sysctl t...
703
704
705
706
  		.procname	= "panic_on_io_nmi",
  		.data		= &panic_on_io_nmi,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
707
  		.proc_handler	= proc_dointvec,
5211a242d   Kurt Garloff   x86: Add sysctl t...
708
709
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
710
711
712
713
  		.procname	= "bootloader_type",
  		.data		= &bootloader_type,
  		.maxlen		= sizeof (int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
714
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
715
  	},
0741f4d20   Chuck Ebbert   [PATCH] x86: add ...
716
  	{
5031296c5   H. Peter Anvin   x86: add extensio...
717
718
719
720
  		.procname	= "bootloader_version",
  		.data		= &bootloader_version,
  		.maxlen		= sizeof (int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
721
  		.proc_handler	= proc_dointvec,
5031296c5   H. Peter Anvin   x86: add extensio...
722
723
  	},
  	{
0741f4d20   Chuck Ebbert   [PATCH] x86: add ...
724
725
726
727
  		.procname	= "kstack_depth_to_print",
  		.data		= &kstack_depth_to_print,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
728
  		.proc_handler	= proc_dointvec,
0741f4d20   Chuck Ebbert   [PATCH] x86: add ...
729
  	},
6e7c40259   Ingo Molnar   x86: various chan...
730
  	{
6e7c40259   Ingo Molnar   x86: various chan...
731
732
733
734
  		.procname	= "io_delay_type",
  		.data		= &io_delay_type,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
735
  		.proc_handler	= proc_dointvec,
6e7c40259   Ingo Molnar   x86: various chan...
736
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
  #endif
7a9166e3b   Luke Yang   [PATCH] Fix undef...
738
  #if defined(CONFIG_MMU)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
740
741
742
743
  		.procname	= "randomize_va_space",
  		.data		= &randomize_va_space,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
744
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
745
  	},
7a9166e3b   Luke Yang   [PATCH] Fix undef...
746
  #endif
0152fb376   Martin Schwidefsky   [PATCH] s390: spi...
747
  #if defined(CONFIG_S390) && defined(CONFIG_SMP)
951f22d5b   Martin Schwidefsky   [PATCH] s390: spi...
748
  	{
951f22d5b   Martin Schwidefsky   [PATCH] s390: spi...
749
750
751
752
  		.procname	= "spin_retry",
  		.data		= &spin_retry,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
753
  		.proc_handler	= proc_dointvec,
951f22d5b   Martin Schwidefsky   [PATCH] s390: spi...
754
755
  	},
  #endif
673d5b43d   Len Brown   ACPI: restore CON...
756
  #if	defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
c255d844d   Pavel Machek   [PATCH] suspend-t...
757
  	{
c255d844d   Pavel Machek   [PATCH] suspend-t...
758
  		.procname	= "acpi_video_flags",
77afcf78a   Pavel Machek   PM: Integrate bee...
759
  		.data		= &acpi_realmode_flags,
c255d844d   Pavel Machek   [PATCH] suspend-t...
760
761
  		.maxlen		= sizeof (unsigned long),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
762
  		.proc_handler	= proc_doulongvec_minmax,
c255d844d   Pavel Machek   [PATCH] suspend-t...
763
764
  	},
  #endif
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
765
766
  #ifdef CONFIG_IA64
  	{
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
767
768
769
770
  		.procname	= "ignore-unaligned-usertrap",
  		.data		= &no_unaligned_warning,
  		.maxlen		= sizeof (int),
  	 	.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
771
  		.proc_handler	= proc_dointvec,
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
772
  	},
88fc241f5   Doug Chapman   [IA64] dump stack...
773
  	{
88fc241f5   Doug Chapman   [IA64] dump stack...
774
775
776
777
  		.procname	= "unaligned-dump-stack",
  		.data		= &unaligned_dump_stack,
  		.maxlen		= sizeof (int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
778
  		.proc_handler	= proc_dointvec,
88fc241f5   Doug Chapman   [IA64] dump stack...
779
  	},
d2b176ed8   Jes Sorensen   [IA64] sysctl opt...
780
  #endif
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
781
782
  #ifdef CONFIG_DETECT_SOFTLOCKUP
  	{
9c44bc03f   Ingo Molnar   softlockup: allow...
783
784
785
786
  		.procname	= "softlockup_panic",
  		.data		= &softlockup_panic,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
787
  		.proc_handler	= proc_dointvec_minmax,
9c44bc03f   Ingo Molnar   softlockup: allow...
788
789
790
791
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
  	{
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
792
793
  		.procname	= "softlockup_thresh",
  		.data		= &softlockup_thresh,
9383d9679   Dimitri Sivanich   softlockup: fix s...
794
  		.maxlen		= sizeof(int),
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
795
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
796
  		.proc_handler	= proc_dosoftlockup_thresh,
9383d9679   Dimitri Sivanich   softlockup: fix s...
797
  		.extra1		= &neg_one,
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
798
799
  		.extra2		= &sixty,
  	},
e162b39a3   Mandeep Singh Baines   softlockup: decou...
800
801
802
  #endif
  #ifdef CONFIG_DETECT_HUNG_TASK
  	{
e162b39a3   Mandeep Singh Baines   softlockup: decou...
803
804
805
806
  		.procname	= "hung_task_panic",
  		.data		= &sysctl_hung_task_panic,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
807
  		.proc_handler	= proc_dointvec_minmax,
e162b39a3   Mandeep Singh Baines   softlockup: decou...
808
809
810
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
82a1fcb90   Ingo Molnar   softlockup: autom...
811
  	{
82a1fcb90   Ingo Molnar   softlockup: autom...
812
813
  		.procname	= "hung_task_check_count",
  		.data		= &sysctl_hung_task_check_count,
90739081e   Ingo Molnar   softlockup: fix s...
814
  		.maxlen		= sizeof(unsigned long),
82a1fcb90   Ingo Molnar   softlockup: autom...
815
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
816
  		.proc_handler	= proc_doulongvec_minmax,
82a1fcb90   Ingo Molnar   softlockup: autom...
817
818
  	},
  	{
82a1fcb90   Ingo Molnar   softlockup: autom...
819
820
  		.procname	= "hung_task_timeout_secs",
  		.data		= &sysctl_hung_task_timeout_secs,
90739081e   Ingo Molnar   softlockup: fix s...
821
  		.maxlen		= sizeof(unsigned long),
82a1fcb90   Ingo Molnar   softlockup: autom...
822
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
823
  		.proc_handler	= proc_dohung_task_timeout_secs,
82a1fcb90   Ingo Molnar   softlockup: autom...
824
825
  	},
  	{
82a1fcb90   Ingo Molnar   softlockup: autom...
826
827
  		.procname	= "hung_task_warnings",
  		.data		= &sysctl_hung_task_warnings,
90739081e   Ingo Molnar   softlockup: fix s...
828
  		.maxlen		= sizeof(unsigned long),
82a1fcb90   Ingo Molnar   softlockup: autom...
829
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
830
  		.proc_handler	= proc_doulongvec_minmax,
82a1fcb90   Ingo Molnar   softlockup: autom...
831
  	},
c4f3b63fe   Ravikiran G Thirumalai   softlockup: add a...
832
  #endif
bebfa1013   Andi Kleen   [PATCH] x86_64: A...
833
834
  #ifdef CONFIG_COMPAT
  	{
bebfa1013   Andi Kleen   [PATCH] x86_64: A...
835
836
837
838
  		.procname	= "compat-log",
  		.data		= &compat_log,
  		.maxlen		= sizeof (int),
  	 	.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
839
  		.proc_handler	= proc_dointvec,
bebfa1013   Andi Kleen   [PATCH] x86_64: A...
840
841
  	},
  #endif
23f78d4a0   Ingo Molnar   [PATCH] pi-futex:...
842
843
  #ifdef CONFIG_RT_MUTEXES
  	{
23f78d4a0   Ingo Molnar   [PATCH] pi-futex:...
844
845
846
847
  		.procname	= "max_lock_depth",
  		.data		= &max_lock_depth,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
848
  		.proc_handler	= proc_dointvec,
23f78d4a0   Ingo Molnar   [PATCH] pi-futex:...
849
850
  	},
  #endif
10a0a8d4e   Jeremy Fitzhardinge   Add common orderl...
851
  	{
10a0a8d4e   Jeremy Fitzhardinge   Add common orderl...
852
853
854
855
  		.procname	= "poweroff_cmd",
  		.data		= &poweroff_cmd,
  		.maxlen		= POWEROFF_CMD_PATH_LEN,
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
856
  		.proc_handler	= proc_dostring,
10a0a8d4e   Jeremy Fitzhardinge   Add common orderl...
857
  	},
0b77f5bfb   David Howells   keys: make the ke...
858
859
  #ifdef CONFIG_KEYS
  	{
0b77f5bfb   David Howells   keys: make the ke...
860
861
862
863
864
  		.procname	= "keys",
  		.mode		= 0555,
  		.child		= key_sysctls,
  	},
  #endif
31a72bce0   Paul E. McKenney   rcu: make rcutort...
865
866
  #ifdef CONFIG_RCU_TORTURE_TEST
  	{
31a72bce0   Paul E. McKenney   rcu: make rcutort...
867
868
869
870
  		.procname       = "rcutorture_runnable",
  		.data           = &rcutorture_runnable,
  		.maxlen         = sizeof(int),
  		.mode           = 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
871
  		.proc_handler	= proc_dointvec,
31a72bce0   Paul E. McKenney   rcu: make rcutort...
872
873
  	},
  #endif
12e22c5e4   David Howells   Make the slow wor...
874
875
  #ifdef CONFIG_SLOW_WORK
  	{
12e22c5e4   David Howells   Make the slow wor...
876
877
878
879
880
  		.procname	= "slow-work",
  		.mode		= 0555,
  		.child		= slow_work_sysctls,
  	},
  #endif
cdd6c482c   Ingo Molnar   perf: Do the big ...
881
  #ifdef CONFIG_PERF_EVENTS
1ccd15497   Peter Zijlstra   perf_counter: sys...
882
  	{
cdd6c482c   Ingo Molnar   perf: Do the big ...
883
884
885
  		.procname	= "perf_event_paranoid",
  		.data		= &sysctl_perf_event_paranoid,
  		.maxlen		= sizeof(sysctl_perf_event_paranoid),
1ccd15497   Peter Zijlstra   perf_counter: sys...
886
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
887
  		.proc_handler	= proc_dointvec,
1ccd15497   Peter Zijlstra   perf_counter: sys...
888
  	},
c5078f78b   Peter Zijlstra   perf_counter: pro...
889
  	{
cdd6c482c   Ingo Molnar   perf: Do the big ...
890
891
892
  		.procname	= "perf_event_mlock_kb",
  		.data		= &sysctl_perf_event_mlock,
  		.maxlen		= sizeof(sysctl_perf_event_mlock),
c5078f78b   Peter Zijlstra   perf_counter: pro...
893
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
894
  		.proc_handler	= proc_dointvec,
c5078f78b   Peter Zijlstra   perf_counter: pro...
895
  	},
a78ac3258   Peter Zijlstra   perf_counter: Gen...
896
  	{
cdd6c482c   Ingo Molnar   perf: Do the big ...
897
898
899
  		.procname	= "perf_event_max_sample_rate",
  		.data		= &sysctl_perf_event_sample_rate,
  		.maxlen		= sizeof(sysctl_perf_event_sample_rate),
a78ac3258   Peter Zijlstra   perf_counter: Gen...
900
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
901
  		.proc_handler	= proc_dointvec,
a78ac3258   Peter Zijlstra   perf_counter: Gen...
902
  	},
1ccd15497   Peter Zijlstra   perf_counter: sys...
903
  #endif
dfec072ec   Vegard Nossum   kmemcheck: add th...
904
905
  #ifdef CONFIG_KMEMCHECK
  	{
dfec072ec   Vegard Nossum   kmemcheck: add th...
906
907
908
909
  		.procname	= "kmemcheck",
  		.data		= &kmemcheck_enabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
910
  		.proc_handler	= proc_dointvec,
dfec072ec   Vegard Nossum   kmemcheck: add th...
911
912
  	},
  #endif
cb684b5bc   Jens Axboe   block: fix linkag...
913
  #ifdef CONFIG_BLOCK
5e605b64a   Jens Axboe   block: add blk-io...
914
  	{
5e605b64a   Jens Axboe   block: add blk-io...
915
916
917
918
  		.procname	= "blk_iopoll",
  		.data		= &blk_iopoll_enabled,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
919
  		.proc_handler	= proc_dointvec,
5e605b64a   Jens Axboe   block: add blk-io...
920
  	},
cb684b5bc   Jens Axboe   block: fix linkag...
921
  #endif
ed2c12f32   Andrew Morton   kernel/sysctl.c: ...
922
923
924
925
  /*
   * NOTE: do not add new entries to this table unless you have read
   * Documentation/sysctl/ctl_unnumbered.txt
   */
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
926
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
  };
d8217f076   Eric W. Biederman   sysctl core: Stop...
928
  static struct ctl_table vm_table[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
929
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
930
931
932
933
  		.procname	= "overcommit_memory",
  		.data		= &sysctl_overcommit_memory,
  		.maxlen		= sizeof(sysctl_overcommit_memory),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
934
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
936
  	},
  	{
fadd8fbd1   KAMEZAWA Hiroyuki   [PATCH] support f...
937
938
939
940
  		.procname	= "panic_on_oom",
  		.data		= &sysctl_panic_on_oom,
  		.maxlen		= sizeof(sysctl_panic_on_oom),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
941
  		.proc_handler	= proc_dointvec,
fadd8fbd1   KAMEZAWA Hiroyuki   [PATCH] support f...
942
943
  	},
  	{
fe071d7e8   David Rientjes   oom: add oom_kill...
944
945
946
947
  		.procname	= "oom_kill_allocating_task",
  		.data		= &sysctl_oom_kill_allocating_task,
  		.maxlen		= sizeof(sysctl_oom_kill_allocating_task),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
948
  		.proc_handler	= proc_dointvec,
fe071d7e8   David Rientjes   oom: add oom_kill...
949
950
  	},
  	{
fef1bdd68   David Rientjes   oom: add sysctl t...
951
952
953
954
  		.procname	= "oom_dump_tasks",
  		.data		= &sysctl_oom_dump_tasks,
  		.maxlen		= sizeof(sysctl_oom_dump_tasks),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
955
  		.proc_handler	= proc_dointvec,
fef1bdd68   David Rientjes   oom: add sysctl t...
956
957
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
959
960
961
  		.procname	= "overcommit_ratio",
  		.data		= &sysctl_overcommit_ratio,
  		.maxlen		= sizeof(sysctl_overcommit_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
962
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
964
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
966
967
968
  		.procname	= "page-cluster", 
  		.data		= &page_cluster,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
969
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
970
971
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
972
973
974
975
  		.procname	= "dirty_background_ratio",
  		.data		= &dirty_background_ratio,
  		.maxlen		= sizeof(dirty_background_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
976
  		.proc_handler	= dirty_background_ratio_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
978
979
980
  		.extra1		= &zero,
  		.extra2		= &one_hundred,
  	},
  	{
2da02997e   David Rientjes   mm: add dirty_bac...
981
982
983
984
  		.procname	= "dirty_background_bytes",
  		.data		= &dirty_background_bytes,
  		.maxlen		= sizeof(dirty_background_bytes),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
985
  		.proc_handler	= dirty_background_bytes_handler,
fc3501d41   Sven Wegener   mm: fix dirty_byt...
986
  		.extra1		= &one_ul,
2da02997e   David Rientjes   mm: add dirty_bac...
987
988
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
991
992
  		.procname	= "dirty_ratio",
  		.data		= &vm_dirty_ratio,
  		.maxlen		= sizeof(vm_dirty_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
993
  		.proc_handler	= dirty_ratio_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
994
995
996
997
  		.extra1		= &zero,
  		.extra2		= &one_hundred,
  	},
  	{
2da02997e   David Rientjes   mm: add dirty_bac...
998
999
1000
1001
  		.procname	= "dirty_bytes",
  		.data		= &vm_dirty_bytes,
  		.maxlen		= sizeof(vm_dirty_bytes),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1002
  		.proc_handler	= dirty_bytes_handler,
9e4a5bda8   Andrea Righi   mm: prevent divid...
1003
  		.extra1		= &dirty_bytes_min,
2da02997e   David Rientjes   mm: add dirty_bac...
1004
1005
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  		.procname	= "dirty_writeback_centisecs",
f6ef94381   Bart Samwel   [PATCH] Represent...
1007
1008
  		.data		= &dirty_writeback_interval,
  		.maxlen		= sizeof(dirty_writeback_interval),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1010
  		.proc_handler	= dirty_writeback_centisecs_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
1012
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013
  		.procname	= "dirty_expire_centisecs",
f6ef94381   Bart Samwel   [PATCH] Represent...
1014
1015
  		.data		= &dirty_expire_interval,
  		.maxlen		= sizeof(dirty_expire_interval),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1017
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1018
1019
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
1021
1022
1023
  		.procname	= "nr_pdflush_threads",
  		.data		= &nr_pdflush_threads,
  		.maxlen		= sizeof nr_pdflush_threads,
  		.mode		= 0444 /* read-only*/,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1024
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025
1026
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
1028
1029
1030
  		.procname	= "swappiness",
  		.data		= &vm_swappiness,
  		.maxlen		= sizeof(vm_swappiness),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1031
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1032
1033
1034
1035
  		.extra1		= &zero,
  		.extra2		= &one_hundred,
  	},
  #ifdef CONFIG_HUGETLB_PAGE
06808b082   Lee Schermerhorn   hugetlb: derive h...
1036
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037
  		.procname	= "nr_hugepages",
e5ff21594   Andi Kleen   hugetlb: multiple...
1038
  		.data		= NULL,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1039
1040
  		.maxlen		= sizeof(unsigned long),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1041
  		.proc_handler	= hugetlb_sysctl_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042
1043
  		.extra1		= (void *)&hugetlb_zero,
  		.extra2		= (void *)&hugetlb_infinity,
06808b082   Lee Schermerhorn   hugetlb: derive h...
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  	},
  #ifdef CONFIG_NUMA
  	{
  		.procname       = "nr_hugepages_mempolicy",
  		.data           = NULL,
  		.maxlen         = sizeof(unsigned long),
  		.mode           = 0644,
  		.proc_handler   = &hugetlb_mempolicy_sysctl_handler,
  		.extra1		= (void *)&hugetlb_zero,
  		.extra2		= (void *)&hugetlb_infinity,
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1056
  	 {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
1058
1059
1060
  		.procname	= "hugetlb_shm_group",
  		.data		= &sysctl_hugetlb_shm_group,
  		.maxlen		= sizeof(gid_t),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1061
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1062
  	 },
396faf030   Mel Gorman   Allow huge page a...
1063
  	 {
396faf030   Mel Gorman   Allow huge page a...
1064
1065
1066
1067
  		.procname	= "hugepages_treat_as_movable",
  		.data		= &hugepages_treat_as_movable,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1068
  		.proc_handler	= hugetlb_treat_movable_handler,
396faf030   Mel Gorman   Allow huge page a...
1069
  	},
54f9f80d6   Adam Litke   hugetlb: Add huge...
1070
  	{
d1c3fb1f8   Nishanth Aravamudan   hugetlb: introduc...
1071
  		.procname	= "nr_overcommit_hugepages",
e5ff21594   Andi Kleen   hugetlb: multiple...
1072
1073
  		.data		= NULL,
  		.maxlen		= sizeof(unsigned long),
d1c3fb1f8   Nishanth Aravamudan   hugetlb: introduc...
1074
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1075
  		.proc_handler	= hugetlb_overcommit_handler,
e5ff21594   Andi Kleen   hugetlb: multiple...
1076
1077
  		.extra1		= (void *)&hugetlb_zero,
  		.extra2		= (void *)&hugetlb_infinity,
d1c3fb1f8   Nishanth Aravamudan   hugetlb: introduc...
1078
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
1080
  #endif
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1081
1082
1083
1084
  		.procname	= "lowmem_reserve_ratio",
  		.data		= &sysctl_lowmem_reserve_ratio,
  		.maxlen		= sizeof(sysctl_lowmem_reserve_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1085
  		.proc_handler	= lowmem_reserve_ratio_sysctl_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
1087
  	},
  	{
9d0243bca   Andrew Morton   [PATCH] drop-page...
1088
1089
1090
1091
1092
  		.procname	= "drop_caches",
  		.data		= &sysctl_drop_caches,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= drop_caches_sysctl_handler,
9d0243bca   Andrew Morton   [PATCH] drop-page...
1093
1094
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1095
1096
1097
1098
  		.procname	= "min_free_kbytes",
  		.data		= &min_free_kbytes,
  		.maxlen		= sizeof(min_free_kbytes),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1099
  		.proc_handler	= min_free_kbytes_sysctl_handler,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1100
1101
  		.extra1		= &zero,
  	},
8ad4b1fb8   Rohit Seth   [PATCH] Make high...
1102
  	{
8ad4b1fb8   Rohit Seth   [PATCH] Make high...
1103
1104
1105
1106
  		.procname	= "percpu_pagelist_fraction",
  		.data		= &percpu_pagelist_fraction,
  		.maxlen		= sizeof(percpu_pagelist_fraction),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1107
  		.proc_handler	= percpu_pagelist_fraction_sysctl_handler,
8ad4b1fb8   Rohit Seth   [PATCH] Make high...
1108
1109
  		.extra1		= &min_percpu_pagelist_fract,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110
1111
  #ifdef CONFIG_MMU
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1112
1113
1114
1115
  		.procname	= "max_map_count",
  		.data		= &sysctl_max_map_count,
  		.maxlen		= sizeof(sysctl_max_map_count),
  		.mode		= 0644,
3e26120cc   WANG Cong   kernel/sysctl.c: ...
1116
  		.proc_handler	= proc_dointvec_minmax,
70da2340f   Amerigo Wang   'sysctl_max_map_c...
1117
  		.extra1		= &zero,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1118
  	},
dd8632a12   Paul Mundt   NOMMU: Make mmap ...
1119
1120
  #else
  	{
dd8632a12   Paul Mundt   NOMMU: Make mmap ...
1121
1122
1123
1124
  		.procname	= "nr_trim_pages",
  		.data		= &sysctl_nr_trim_pages,
  		.maxlen		= sizeof(sysctl_nr_trim_pages),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1125
  		.proc_handler	= proc_dointvec_minmax,
dd8632a12   Paul Mundt   NOMMU: Make mmap ...
1126
1127
  		.extra1		= &zero,
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1128
1129
  #endif
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1130
1131
1132
1133
  		.procname	= "laptop_mode",
  		.data		= &laptop_mode,
  		.maxlen		= sizeof(laptop_mode),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1134
  		.proc_handler	= proc_dointvec_jiffies,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135
1136
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1137
1138
1139
1140
  		.procname	= "block_dump",
  		.data		= &block_dump,
  		.maxlen		= sizeof(block_dump),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1141
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1142
1143
1144
  		.extra1		= &zero,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145
1146
1147
1148
  		.procname	= "vfs_cache_pressure",
  		.data		= &sysctl_vfs_cache_pressure,
  		.maxlen		= sizeof(sysctl_vfs_cache_pressure),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1149
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1150
1151
1152
1153
  		.extra1		= &zero,
  	},
  #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1154
1155
1156
1157
  		.procname	= "legacy_va_layout",
  		.data		= &sysctl_legacy_va_layout,
  		.maxlen		= sizeof(sysctl_legacy_va_layout),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1158
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
1160
1161
  		.extra1		= &zero,
  	},
  #endif
1743660b9   Christoph Lameter   [PATCH] Zone recl...
1162
1163
  #ifdef CONFIG_NUMA
  	{
1743660b9   Christoph Lameter   [PATCH] Zone recl...
1164
1165
1166
1167
  		.procname	= "zone_reclaim_mode",
  		.data		= &zone_reclaim_mode,
  		.maxlen		= sizeof(zone_reclaim_mode),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1168
  		.proc_handler	= proc_dointvec,
c84db23c6   Christoph Lameter   [PATCH] zone_recl...
1169
  		.extra1		= &zero,
1743660b9   Christoph Lameter   [PATCH] Zone recl...
1170
  	},
9614634fe   Christoph Lameter   [PATCH] ZVC/zone_...
1171
  	{
9614634fe   Christoph Lameter   [PATCH] ZVC/zone_...
1172
1173
1174
1175
  		.procname	= "min_unmapped_ratio",
  		.data		= &sysctl_min_unmapped_ratio,
  		.maxlen		= sizeof(sysctl_min_unmapped_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1176
  		.proc_handler	= sysctl_min_unmapped_ratio_sysctl_handler,
9614634fe   Christoph Lameter   [PATCH] ZVC/zone_...
1177
1178
1179
  		.extra1		= &zero,
  		.extra2		= &one_hundred,
  	},
0ff38490c   Christoph Lameter   [PATCH] zone_recl...
1180
  	{
0ff38490c   Christoph Lameter   [PATCH] zone_recl...
1181
1182
1183
1184
  		.procname	= "min_slab_ratio",
  		.data		= &sysctl_min_slab_ratio,
  		.maxlen		= sizeof(sysctl_min_slab_ratio),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1185
  		.proc_handler	= sysctl_min_slab_ratio_sysctl_handler,
0ff38490c   Christoph Lameter   [PATCH] zone_recl...
1186
1187
1188
  		.extra1		= &zero,
  		.extra2		= &one_hundred,
  	},
1743660b9   Christoph Lameter   [PATCH] Zone recl...
1189
  #endif
77461ab33   Christoph Lameter   Make vm statistic...
1190
1191
  #ifdef CONFIG_SMP
  	{
77461ab33   Christoph Lameter   Make vm statistic...
1192
1193
1194
1195
  		.procname	= "stat_interval",
  		.data		= &sysctl_stat_interval,
  		.maxlen		= sizeof(sysctl_stat_interval),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1196
  		.proc_handler	= proc_dointvec_jiffies,
77461ab33   Christoph Lameter   Make vm statistic...
1197
1198
  	},
  #endif
6e1415467   David Howells   NOMMU: Optimise a...
1199
  #ifdef CONFIG_MMU
ed0321895   Eric Paris   security: Protect...
1200
  	{
ed0321895   Eric Paris   security: Protect...
1201
  		.procname	= "mmap_min_addr",
788084aba   Eric Paris   Security/SELinux:...
1202
1203
  		.data		= &dac_mmap_min_addr,
  		.maxlen		= sizeof(unsigned long),
ed0321895   Eric Paris   security: Protect...
1204
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1205
  		.proc_handler	= mmap_min_addr_handler,
ed0321895   Eric Paris   security: Protect...
1206
  	},
6e1415467   David Howells   NOMMU: Optimise a...
1207
  #endif
f0c0b2b80   KAMEZAWA Hiroyuki   change zonelist o...
1208
1209
  #ifdef CONFIG_NUMA
  	{
f0c0b2b80   KAMEZAWA Hiroyuki   change zonelist o...
1210
1211
1212
1213
  		.procname	= "numa_zonelist_order",
  		.data		= &numa_zonelist_order,
  		.maxlen		= NUMA_ZONELIST_ORDER_LEN,
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1214
  		.proc_handler	= numa_zonelist_order_handler,
f0c0b2b80   KAMEZAWA Hiroyuki   change zonelist o...
1215
1216
  	},
  #endif
2b8232ce5   Al Viro   minimal build fix...
1217
  #if (defined(CONFIG_X86_32) && !defined(CONFIG_UML))|| \
5c36e6578   Paul Mundt   sysctl: Support v...
1218
     (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
e6e5494cb   Ingo Molnar   [PATCH] vdso: ran...
1219
  	{
e6e5494cb   Ingo Molnar   [PATCH] vdso: ran...
1220
1221
1222
1223
  		.procname	= "vdso_enabled",
  		.data		= &vdso_enabled,
  		.maxlen		= sizeof(vdso_enabled),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1224
  		.proc_handler	= proc_dointvec,
e6e5494cb   Ingo Molnar   [PATCH] vdso: ran...
1225
1226
1227
  		.extra1		= &zero,
  	},
  #endif
195cf453d   Bron Gondwana   mm/page-writeback...
1228
1229
  #ifdef CONFIG_HIGHMEM
  	{
195cf453d   Bron Gondwana   mm/page-writeback...
1230
1231
1232
1233
  		.procname	= "highmem_is_dirtyable",
  		.data		= &vm_highmem_is_dirtyable,
  		.maxlen		= sizeof(vm_highmem_is_dirtyable),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1234
  		.proc_handler	= proc_dointvec_minmax,
195cf453d   Bron Gondwana   mm/page-writeback...
1235
1236
1237
1238
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
  #endif
4be6f6bb6   Peter Zijlstra   mm: move the scan...
1239
  	{
4be6f6bb6   Peter Zijlstra   mm: move the scan...
1240
1241
1242
1243
  		.procname	= "scan_unevictable_pages",
  		.data		= &scan_unevictable_pages,
  		.maxlen		= sizeof(scan_unevictable_pages),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1244
  		.proc_handler	= scan_unevictable_handler,
4be6f6bb6   Peter Zijlstra   mm: move the scan...
1245
  	},
6a46079cf   Andi Kleen   HWPOISON: The hig...
1246
1247
  #ifdef CONFIG_MEMORY_FAILURE
  	{
6a46079cf   Andi Kleen   HWPOISON: The hig...
1248
1249
1250
1251
  		.procname	= "memory_failure_early_kill",
  		.data		= &sysctl_memory_failure_early_kill,
  		.maxlen		= sizeof(sysctl_memory_failure_early_kill),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1252
  		.proc_handler	= proc_dointvec_minmax,
6a46079cf   Andi Kleen   HWPOISON: The hig...
1253
1254
1255
1256
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
  	{
6a46079cf   Andi Kleen   HWPOISON: The hig...
1257
1258
1259
1260
  		.procname	= "memory_failure_recovery",
  		.data		= &sysctl_memory_failure_recovery,
  		.maxlen		= sizeof(sysctl_memory_failure_recovery),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1261
  		.proc_handler	= proc_dointvec_minmax,
6a46079cf   Andi Kleen   HWPOISON: The hig...
1262
1263
1264
1265
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
  #endif
2be7fe075   Andrew Morton   sysctl.c: add tex...
1266
1267
1268
1269
  /*
   * NOTE: do not add new entries to this table unless you have read
   * Documentation/sysctl/ctl_unnumbered.txt
   */
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
1270
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1271
  };
2abc26fc6   Eric W. Biederman   [PATCH] sysctl: c...
1272
  #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
d8217f076   Eric W. Biederman   sysctl core: Stop...
1273
  static struct ctl_table binfmt_misc_table[] = {
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
1274
  	{ }
2abc26fc6   Eric W. Biederman   [PATCH] sysctl: c...
1275
1276
  };
  #endif
d8217f076   Eric W. Biederman   sysctl core: Stop...
1277
  static struct ctl_table fs_table[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1278
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1279
1280
1281
1282
  		.procname	= "inode-nr",
  		.data		= &inodes_stat,
  		.maxlen		= 2*sizeof(int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1283
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284
1285
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1286
1287
1288
1289
  		.procname	= "inode-state",
  		.data		= &inodes_stat,
  		.maxlen		= 7*sizeof(int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1290
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1291
1292
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
1294
1295
1296
  		.procname	= "file-nr",
  		.data		= &files_stat,
  		.maxlen		= 3*sizeof(int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1297
  		.proc_handler	= proc_nr_files,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
1299
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1300
1301
1302
1303
  		.procname	= "file-max",
  		.data		= &files_stat.max_files,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1304
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1305
1306
  	},
  	{
9cfe015aa   Eric Dumazet   get rid of NR_OPE...
1307
1308
1309
1310
  		.procname	= "nr_open",
  		.data		= &sysctl_nr_open,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1311
  		.proc_handler	= proc_dointvec_minmax,
eceea0b3d   Al Viro   [PATCH] avoid mul...
1312
1313
  		.extra1		= &sysctl_nr_open_min,
  		.extra2		= &sysctl_nr_open_max,
9cfe015aa   Eric Dumazet   get rid of NR_OPE...
1314
1315
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1316
1317
1318
1319
  		.procname	= "dentry-state",
  		.data		= &dentry_stat,
  		.maxlen		= 6*sizeof(int),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1320
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1321
1322
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1323
1324
1325
1326
  		.procname	= "overflowuid",
  		.data		= &fs_overflowuid,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1327
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1328
1329
1330
1331
  		.extra1		= &minolduid,
  		.extra2		= &maxolduid,
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1332
1333
1334
1335
  		.procname	= "overflowgid",
  		.data		= &fs_overflowgid,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1336
  		.proc_handler	= proc_dointvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337
1338
1339
  		.extra1		= &minolduid,
  		.extra2		= &maxolduid,
  	},
bfcd17a6c   Thomas Petazzoni   Configure out fil...
1340
  #ifdef CONFIG_FILE_LOCKING
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1341
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1342
1343
1344
1345
  		.procname	= "leases-enable",
  		.data		= &leases_enable,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1346
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1347
  	},
bfcd17a6c   Thomas Petazzoni   Configure out fil...
1348
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1349
1350
  #ifdef CONFIG_DNOTIFY
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1351
1352
1353
1354
  		.procname	= "dir-notify-enable",
  		.data		= &dir_notify_enable,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1355
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
1357
1358
  	},
  #endif
  #ifdef CONFIG_MMU
bfcd17a6c   Thomas Petazzoni   Configure out fil...
1359
  #ifdef CONFIG_FILE_LOCKING
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1360
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361
1362
1363
1364
  		.procname	= "lease-break-time",
  		.data		= &lease_break_time,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1365
  		.proc_handler	= proc_dointvec,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1366
  	},
bfcd17a6c   Thomas Petazzoni   Configure out fil...
1367
  #endif
ebf3f09c6   Thomas Petazzoni   Configure out AIO...
1368
  #ifdef CONFIG_AIO
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1369
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1370
1371
1372
1373
  		.procname	= "aio-nr",
  		.data		= &aio_nr,
  		.maxlen		= sizeof(aio_nr),
  		.mode		= 0444,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1374
  		.proc_handler	= proc_doulongvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1375
1376
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
1378
1379
1380
  		.procname	= "aio-max-nr",
  		.data		= &aio_max_nr,
  		.maxlen		= sizeof(aio_max_nr),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1381
  		.proc_handler	= proc_doulongvec_minmax,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1382
  	},
ebf3f09c6   Thomas Petazzoni   Configure out AIO...
1383
  #endif /* CONFIG_AIO */
2d9048e20   Amy Griffis   [PATCH] inotify (...
1384
  #ifdef CONFIG_INOTIFY_USER
0399cb08c   Robert Love   [PATCH] inotify: ...
1385
  	{
0399cb08c   Robert Love   [PATCH] inotify: ...
1386
1387
1388
1389
1390
  		.procname	= "inotify",
  		.mode		= 0555,
  		.child		= inotify_table,
  	},
  #endif	
7ef9964e6   Davide Libenzi   epoll: introduce ...
1391
1392
1393
1394
1395
1396
1397
  #ifdef CONFIG_EPOLL
  	{
  		.procname	= "epoll",
  		.mode		= 0555,
  		.child		= epoll_table,
  	},
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1398
  #endif
d6e711448   Alan Cox   [PATCH] setuid co...
1399
  	{
d6e711448   Alan Cox   [PATCH] setuid co...
1400
1401
1402
1403
  		.procname	= "suid_dumpable",
  		.data		= &suid_dumpable,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d4561110   Eric W. Biederman   sysctl: Drop & in...
1404
  		.proc_handler	= proc_dointvec_minmax,
8e654fba4   Matthew Wilcox   sysctl: fix suid_...
1405
1406
  		.extra1		= &zero,
  		.extra2		= &two,
d6e711448   Alan Cox   [PATCH] setuid co...
1407
  	},
2abc26fc6   Eric W. Biederman   [PATCH] sysctl: c...
1408
1409
  #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
  	{
2abc26fc6   Eric W. Biederman   [PATCH] sysctl: c...
1410
1411
1412
1413
1414
  		.procname	= "binfmt_misc",
  		.mode		= 0555,
  		.child		= binfmt_misc_table,
  	},
  #endif
2be7fe075   Andrew Morton   sysctl.c: add tex...
1415
1416
1417
  /*
   * NOTE: do not add new entries to this table unless you have read
   * Documentation/sysctl/ctl_unnumbered.txt
2be7fe075   Andrew Morton   sysctl.c: add tex...
1418
   */
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
1419
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1420
  };
d8217f076   Eric W. Biederman   sysctl core: Stop...
1421
  static struct ctl_table debug_table[] = {
4b1776473   David S. Miller   sparc: Support sh...
1422
  #if defined(CONFIG_X86) || defined(CONFIG_PPC) || defined(CONFIG_SPARC)
abd4f7505   Masoud Asgharifard Sharbiani   x86: i386-show-un...
1423
  	{
abd4f7505   Masoud Asgharifard Sharbiani   x86: i386-show-un...
1424
1425
1426
1427
1428
1429
1430
  		.procname	= "exception-trace",
  		.data		= &show_unhandled_signals,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec
  	},
  #endif
b2be84df9   Masami Hiramatsu   kprobes: Jump opt...
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
  #if defined(CONFIG_OPTPROBES)
  	{
  		.procname	= "kprobes-optimization",
  		.data		= &sysctl_kprobes_optimization,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
  		.proc_handler	= proc_kprobes_optimization_handler,
  		.extra1		= &zero,
  		.extra2		= &one,
  	},
  #endif
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
1442
  	{ }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
  };
d8217f076   Eric W. Biederman   sysctl core: Stop...
1444
  static struct ctl_table dev_table[] = {
6fce56ec9   Eric W. Biederman   sysctl: Remove re...
1445
  	{ }
0eeca2830   Robert Love   [PATCH] inotify
1446
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1447

330d57fb9   Al Viro   [PATCH] Fix sysct...
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
  static DEFINE_SPINLOCK(sysctl_lock);
  
  /* called under sysctl_lock */
  static int use_table(struct ctl_table_header *p)
  {
  	if (unlikely(p->unregistering))
  		return 0;
  	p->used++;
  	return 1;
  }
  
  /* called under sysctl_lock */
  static void unuse_table(struct ctl_table_header *p)
  {
  	if (!--p->used)
  		if (unlikely(p->unregistering))
  			complete(p->unregistering);
  }
  
  /* called under sysctl_lock, will reacquire if has to wait */
  static void start_unregistering(struct ctl_table_header *p)
  {
  	/*
  	 * if p->used is 0, nobody will ever touch that entry again;
  	 * we'll eliminate all paths to it before dropping sysctl_lock
  	 */
  	if (unlikely(p->used)) {
  		struct completion wait;
  		init_completion(&wait);
  		p->unregistering = &wait;
  		spin_unlock(&sysctl_lock);
  		wait_for_completion(&wait);
  		spin_lock(&sysctl_lock);
f7e6ced40   Al Viro   [PATCH] allow del...
1481
1482
1483
  	} else {
  		/* anything non-NULL; we'll never dereference it */
  		p->unregistering = ERR_PTR(-EINVAL);
330d57fb9   Al Viro   [PATCH] Fix sysct...
1484
1485
1486
1487
1488
1489
1490
  	}
  	/*
  	 * do not remove from the list until nobody holds it; walking the
  	 * list in do_sysctl() relies on that.
  	 */
  	list_del_init(&p->ctl_entry);
  }
f7e6ced40   Al Viro   [PATCH] allow del...
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
  void sysctl_head_get(struct ctl_table_header *head)
  {
  	spin_lock(&sysctl_lock);
  	head->count++;
  	spin_unlock(&sysctl_lock);
  }
  
  void sysctl_head_put(struct ctl_table_header *head)
  {
  	spin_lock(&sysctl_lock);
  	if (!--head->count)
  		kfree(head);
  	spin_unlock(&sysctl_lock);
  }
  
  struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
  {
  	if (!head)
  		BUG();
  	spin_lock(&sysctl_lock);
  	if (!use_table(head))
  		head = ERR_PTR(-ENOENT);
  	spin_unlock(&sysctl_lock);
  	return head;
  }
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1516
1517
1518
1519
1520
1521
1522
1523
  void sysctl_head_finish(struct ctl_table_header *head)
  {
  	if (!head)
  		return;
  	spin_lock(&sysctl_lock);
  	unuse_table(head);
  	spin_unlock(&sysctl_lock);
  }
734550921   Al Viro   [PATCH] beginning...
1524
1525
1526
1527
1528
1529
1530
1531
  static struct ctl_table_set *
  lookup_header_set(struct ctl_table_root *root, struct nsproxy *namespaces)
  {
  	struct ctl_table_set *set = &root->default_set;
  	if (root->lookup)
  		set = root->lookup(root, namespaces);
  	return set;
  }
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1532
1533
  static struct list_head *
  lookup_header_list(struct ctl_table_root *root, struct nsproxy *namespaces)
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1534
  {
734550921   Al Viro   [PATCH] beginning...
1535
1536
  	struct ctl_table_set *set = lookup_header_set(root, namespaces);
  	return &set->list;
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1537
1538
1539
1540
1541
1542
1543
  }
  
  struct ctl_table_header *__sysctl_head_next(struct nsproxy *namespaces,
  					    struct ctl_table_header *prev)
  {
  	struct ctl_table_root *root;
  	struct list_head *header_list;
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1544
1545
  	struct ctl_table_header *head;
  	struct list_head *tmp;
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1546

805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1547
1548
  	spin_lock(&sysctl_lock);
  	if (prev) {
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1549
  		head = prev;
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
  		tmp = &prev->ctl_entry;
  		unuse_table(prev);
  		goto next;
  	}
  	tmp = &root_table_header.ctl_entry;
  	for (;;) {
  		head = list_entry(tmp, struct ctl_table_header, ctl_entry);
  
  		if (!use_table(head))
  			goto next;
  		spin_unlock(&sysctl_lock);
  		return head;
  	next:
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1563
  		root = head->root;
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1564
  		tmp = tmp->next;
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
  		header_list = lookup_header_list(root, namespaces);
  		if (tmp != header_list)
  			continue;
  
  		do {
  			root = list_entry(root->root_list.next,
  					struct ctl_table_root, root_list);
  			if (root == &sysctl_table_root)
  				goto out;
  			header_list = lookup_header_list(root, namespaces);
  		} while (list_empty(header_list));
  		tmp = header_list->next;
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1577
  	}
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1578
  out:
805b5d5e0   Eric W. Biederman   [PATCH] sysctl: f...
1579
1580
1581
  	spin_unlock(&sysctl_lock);
  	return NULL;
  }
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
  struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev)
  {
  	return __sysctl_head_next(current->nsproxy, prev);
  }
  
  void register_sysctl_root(struct ctl_table_root *root)
  {
  	spin_lock(&sysctl_lock);
  	list_add_tail(&root->root_list, &sysctl_table_root.root_list);
  	spin_unlock(&sysctl_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593
  /*
1ff007eb8   Eric W. Biederman   [PATCH] sysctl: a...
1594
   * sysctl_perm does NOT grant the superuser all rights automatically, because
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1595
1596
1597
1598
1599
   * some sysctl variables are readonly even to root.
   */
  
  static int test_perm(int mode, int op)
  {
76aac0e9a   David Howells   CRED: Wrap task c...
1600
  	if (!current_euid())
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1601
1602
1603
  		mode >>= 6;
  	else if (in_egroup_p(0))
  		mode >>= 3;
e6305c43e   Al Viro   [PATCH] sanitize ...
1604
  	if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1605
1606
1607
  		return 0;
  	return -EACCES;
  }
d7321cd62   Pavel Emelyanov   sysctl: add the -...
1608
  int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1609
1610
  {
  	int error;
d7321cd62   Pavel Emelyanov   sysctl: add the -...
1611
  	int mode;
e6305c43e   Al Viro   [PATCH] sanitize ...
1612
  	error = security_sysctl(table, op & (MAY_READ | MAY_WRITE | MAY_EXEC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1613
1614
  	if (error)
  		return error;
d7321cd62   Pavel Emelyanov   sysctl: add the -...
1615
1616
1617
1618
1619
1620
1621
  
  	if (root->permissions)
  		mode = root->permissions(root, current->nsproxy, table);
  	else
  		mode = table->mode;
  
  	return test_perm(mode, op);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1622
  }
d912b0cc1   Eric W. Biederman   [PATCH] sysctl: a...
1623
1624
  static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
  {
2315ffa0a   Eric W. Biederman   sysctl: Don't loo...
1625
  	for (; table->procname; table++) {
d912b0cc1   Eric W. Biederman   [PATCH] sysctl: a...
1626
1627
1628
1629
1630
1631
1632
1633
1634
  		table->parent = parent;
  		if (table->child)
  			sysctl_set_parent(table, table->child);
  	}
  }
  
  static __init int sysctl_init(void)
  {
  	sysctl_set_parent(NULL, root_table);
88f458e4b   Holger Schurig   sysctl: allow emb...
1635
1636
1637
1638
1639
1640
  #ifdef CONFIG_SYSCTL_SYSCALL_CHECK
  	{
  		int err;
  		err = sysctl_check_table(current->nsproxy, root_table);
  	}
  #endif
d912b0cc1   Eric W. Biederman   [PATCH] sysctl: a...
1641
1642
1643
1644
  	return 0;
  }
  
  core_initcall(sysctl_init);
bfbcf0347   Al Viro   lost sysctl fix
1645
1646
  static struct ctl_table *is_branch_in(struct ctl_table *branch,
  				      struct ctl_table *table)
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1647
1648
1649
1650
1651
1652
  {
  	struct ctl_table *p;
  	const char *s = branch->procname;
  
  	/* branch should have named subdirectory as its first element */
  	if (!s || !branch->child)
bfbcf0347   Al Viro   lost sysctl fix
1653
  		return NULL;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1654
1655
  
  	/* ... and nothing else */
2315ffa0a   Eric W. Biederman   sysctl: Don't loo...
1656
  	if (branch[1].procname)
bfbcf0347   Al Viro   lost sysctl fix
1657
  		return NULL;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1658
1659
  
  	/* table should contain subdirectory with the same name */
2315ffa0a   Eric W. Biederman   sysctl: Don't loo...
1660
  	for (p = table; p->procname; p++) {
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1661
1662
1663
  		if (!p->child)
  			continue;
  		if (p->procname && strcmp(p->procname, s) == 0)
bfbcf0347   Al Viro   lost sysctl fix
1664
  			return p;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1665
  	}
bfbcf0347   Al Viro   lost sysctl fix
1666
  	return NULL;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1667
1668
1669
1670
1671
1672
  }
  
  /* see if attaching q to p would be an improvement */
  static void try_attach(struct ctl_table_header *p, struct ctl_table_header *q)
  {
  	struct ctl_table *to = p->ctl_table, *by = q->ctl_table;
bfbcf0347   Al Viro   lost sysctl fix
1673
  	struct ctl_table *next;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1674
1675
  	int is_better = 0;
  	int not_in_parent = !p->attached_by;
bfbcf0347   Al Viro   lost sysctl fix
1676
  	while ((next = is_branch_in(by, to)) != NULL) {
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1677
1678
1679
1680
1681
  		if (by == q->attached_by)
  			is_better = 1;
  		if (to == p->attached_by)
  			not_in_parent = 1;
  		by = by->child;
bfbcf0347   Al Viro   lost sysctl fix
1682
  		to = next->child;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1683
1684
1685
1686
1687
1688
1689
1690
  	}
  
  	if (is_better && not_in_parent) {
  		q->attached_by = by;
  		q->attached_to = to;
  		q->parent = p;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1691
  /**
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1692
1693
1694
   * __register_sysctl_paths - register a sysctl hierarchy
   * @root: List of sysctl headers to register on
   * @namespaces: Data to compute which lists of sysctl entries are visible
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1695
   * @path: The path to the directory the sysctl table is in.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1696
   * @table: the top-level table structure
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1697
1698
   *
   * Register a sysctl table hierarchy. @table should be a filled in ctl_table
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1699
   * array. A completely 0 filled entry terminates the table.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1700
   *
d8217f076   Eric W. Biederman   sysctl core: Stop...
1701
   * The members of the &struct ctl_table structure are used as follows:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1702
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
   * procname - the name of the sysctl file under /proc/sys. Set to %NULL to not
   *            enter a sysctl file
   *
   * data - a pointer to data for use by proc_handler
   *
   * maxlen - the maximum size in bytes of the data
   *
   * mode - the file permissions for the /proc/sys file, and for sysctl(2)
   *
   * child - a pointer to the child sysctl table if this entry is a directory, or
   *         %NULL.
   *
   * proc_handler - the text handler routine (described below)
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
   * de - for internal use by the sysctl routines
   *
   * extra1, extra2 - extra pointers usable by the proc handler routines
   *
   * Leaf nodes in the sysctl tree will be represented by a single file
   * under /proc; non-leaf nodes will be represented by directories.
   *
   * sysctl(2) can automatically manage read and write requests through
   * the sysctl table.  The data and maxlen fields of the ctl_table
   * struct enable minimal validation of the values being written to be
   * performed, and the mode field allows minimal authentication.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
   * There must be a proc_handler routine for any terminal nodes
   * mirrored under /proc/sys (non-terminals are handled by a built-in
   * directory handler).  Several default handlers are available to
   * cover common cases -
   *
   * proc_dostring(), proc_dointvec(), proc_dointvec_jiffies(),
   * proc_dointvec_userhz_jiffies(), proc_dointvec_minmax(), 
   * proc_doulongvec_ms_jiffies_minmax(), proc_doulongvec_minmax()
   *
   * It is the handler's job to read the input buffer from user memory
   * and process it. The handler should return 0 on success.
   *
   * This routine returns %NULL on a failure to register, and a pointer
   * to the table header on success.
   */
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1744
1745
1746
1747
  struct ctl_table_header *__register_sysctl_paths(
  	struct ctl_table_root *root,
  	struct nsproxy *namespaces,
  	const struct ctl_path *path, struct ctl_table *table)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1748
  {
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1749
1750
1751
  	struct ctl_table_header *header;
  	struct ctl_table *new, **prevp;
  	unsigned int n, npath;
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1752
  	struct ctl_table_set *set;
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1753
1754
  
  	/* Count the path components */
2315ffa0a   Eric W. Biederman   sysctl: Don't loo...
1755
  	for (npath = 0; path[npath].procname; ++npath)
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1756
1757
1758
1759
1760
  		;
  
  	/*
  	 * For each path component, allocate a 2-element ctl_table array.
  	 * The first array element will be filled with the sysctl entry
2315ffa0a   Eric W. Biederman   sysctl: Don't loo...
1761
  	 * for this, the second will be the sentinel (procname == 0).
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1762
1763
1764
1765
1766
1767
1768
  	 *
  	 * We allocate everything in one go so that we don't have to
  	 * worry about freeing additional memory in unregister_sysctl_table.
  	 */
  	header = kzalloc(sizeof(struct ctl_table_header) +
  			 (2 * npath * sizeof(struct ctl_table)), GFP_KERNEL);
  	if (!header)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1769
  		return NULL;
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1770
1771
1772
1773
1774
1775
1776
1777
  
  	new = (struct ctl_table *) (header + 1);
  
  	/* Now connect the dots */
  	prevp = &header->ctl_table;
  	for (n = 0; n < npath; ++n, ++path) {
  		/* Copy the procname */
  		new->procname = path->procname;
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1778
1779
1780
1781
1782
1783
1784
1785
  		new->mode     = 0555;
  
  		*prevp = new;
  		prevp = &new->child;
  
  		new += 2;
  	}
  	*prevp = table;
23eb06de7   Eric W. Biederman   sysctl: Remember ...
1786
  	header->ctl_table_arg = table;
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1787
1788
1789
1790
  
  	INIT_LIST_HEAD(&header->ctl_entry);
  	header->used = 0;
  	header->unregistering = NULL;
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1791
  	header->root = root;
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1792
  	sysctl_set_parent(NULL, header->ctl_table);
f7e6ced40   Al Viro   [PATCH] allow del...
1793
  	header->count = 1;
88f458e4b   Holger Schurig   sysctl: allow emb...
1794
  #ifdef CONFIG_SYSCTL_SYSCALL_CHECK
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1795
  	if (sysctl_check_table(namespaces, header->ctl_table)) {
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1796
  		kfree(header);
fc6cd25b7   Eric W. Biederman   sysctl: Error on ...
1797
1798
  		return NULL;
  	}
88f458e4b   Holger Schurig   sysctl: allow emb...
1799
  #endif
330d57fb9   Al Viro   [PATCH] Fix sysct...
1800
  	spin_lock(&sysctl_lock);
734550921   Al Viro   [PATCH] beginning...
1801
  	header->set = lookup_header_set(root, namespaces);
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
  	header->attached_by = header->ctl_table;
  	header->attached_to = root_table;
  	header->parent = &root_table_header;
  	for (set = header->set; set; set = set->parent) {
  		struct ctl_table_header *p;
  		list_for_each_entry(p, &set->list, ctl_entry) {
  			if (p->unregistering)
  				continue;
  			try_attach(p, header);
  		}
  	}
  	header->parent->count++;
734550921   Al Viro   [PATCH] beginning...
1814
  	list_add_tail(&header->ctl_entry, &header->set->list);
330d57fb9   Al Viro   [PATCH] Fix sysct...
1815
  	spin_unlock(&sysctl_lock);
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1816
1817
1818
1819
1820
  
  	return header;
  }
  
  /**
e51b6ba07   Eric W. Biederman   sysctl: Infrastru...
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
   * register_sysctl_table_path - register a sysctl table hierarchy
   * @path: The path to the directory the sysctl table is in.
   * @table: the top-level table structure
   *
   * Register a sysctl table hierarchy. @table should be a filled in ctl_table
   * array. A completely 0 filled entry terminates the table.
   *
   * See __register_sysctl_paths for more details.
   */
  struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
  						struct ctl_table *table)
  {
  	return __register_sysctl_paths(&sysctl_table_root, current->nsproxy,
  					path, table);
  }
  
  /**
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
   * register_sysctl_table - register a sysctl table hierarchy
   * @table: the top-level table structure
   *
   * Register a sysctl table hierarchy. @table should be a filled in ctl_table
   * array. A completely 0 filled entry terminates the table.
   *
   * See register_sysctl_paths for more details.
   */
  struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
  {
  	static const struct ctl_path null_path[] = { {} };
  
  	return register_sysctl_paths(null_path, table);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
  }
  
  /**
   * unregister_sysctl_table - unregister a sysctl table hierarchy
   * @header: the header returned from register_sysctl_table
   *
   * Unregisters the sysctl table and all children. proc entries may not
   * actually be removed until they are no longer used by anyone.
   */
  void unregister_sysctl_table(struct ctl_table_header * header)
  {
330d57fb9   Al Viro   [PATCH] Fix sysct...
1862
  	might_sleep();
f1dad166e   Pavel Emelyanov   Avoid potential N...
1863
1864
1865
  
  	if (header == NULL)
  		return;
330d57fb9   Al Viro   [PATCH] Fix sysct...
1866
1867
  	spin_lock(&sysctl_lock);
  	start_unregistering(header);
ae7edecc9   Al Viro   [PATCH] sysctl: k...
1868
1869
1870
1871
  	if (!--header->parent->count) {
  		WARN_ON(1);
  		kfree(header->parent);
  	}
f7e6ced40   Al Viro   [PATCH] allow del...
1872
1873
  	if (!--header->count)
  		kfree(header);
330d57fb9   Al Viro   [PATCH] Fix sysct...
1874
  	spin_unlock(&sysctl_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1875
  }
9043476f7   Al Viro   [PATCH] sanitize ...
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
  int sysctl_is_seen(struct ctl_table_header *p)
  {
  	struct ctl_table_set *set = p->set;
  	int res;
  	spin_lock(&sysctl_lock);
  	if (p->unregistering)
  		res = 0;
  	else if (!set->is_seen)
  		res = 1;
  	else
  		res = set->is_seen(set);
  	spin_unlock(&sysctl_lock);
  	return res;
  }
734550921   Al Viro   [PATCH] beginning...
1890
1891
1892
1893
1894
1895
1896
1897
  void setup_sysctl_set(struct ctl_table_set *p,
  	struct ctl_table_set *parent,
  	int (*is_seen)(struct ctl_table_set *))
  {
  	INIT_LIST_HEAD(&p->list);
  	p->parent = parent ? parent : &sysctl_table_root.default_set;
  	p->is_seen = is_seen;
  }
b89a81712   Eric W. Biederman   [PATCH] sysctl: A...
1898
  #else /* !CONFIG_SYSCTL */
d8217f076   Eric W. Biederman   sysctl core: Stop...
1899
  struct ctl_table_header *register_sysctl_table(struct ctl_table * table)
b89a81712   Eric W. Biederman   [PATCH] sysctl: A...
1900
1901
1902
  {
  	return NULL;
  }
29e796fd4   Eric W. Biederman   sysctl: Add regis...
1903
1904
1905
1906
1907
  struct ctl_table_header *register_sysctl_paths(const struct ctl_path *path,
  						    struct ctl_table *table)
  {
  	return NULL;
  }
b89a81712   Eric W. Biederman   [PATCH] sysctl: A...
1908
1909
1910
  void unregister_sysctl_table(struct ctl_table_header * table)
  {
  }
734550921   Al Viro   [PATCH] beginning...
1911
1912
1913
1914
1915
  void setup_sysctl_set(struct ctl_table_set *p,
  	struct ctl_table_set *parent,
  	int (*is_seen)(struct ctl_table_set *))
  {
  }
f7e6ced40   Al Viro   [PATCH] allow del...
1916
1917
1918
  void sysctl_head_put(struct ctl_table_header *head)
  {
  }
b89a81712   Eric W. Biederman   [PATCH] sysctl: A...
1919
  #endif /* CONFIG_SYSCTL */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1920
1921
1922
  /*
   * /proc/sys support
   */
b89a81712   Eric W. Biederman   [PATCH] sysctl: A...
1923
  #ifdef CONFIG_PROC_SYSCTL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1924

b1ba4ddde   Adrian Bunk   [PATCH] make kern...
1925
  static int _proc_do_string(void* data, int maxlen, int write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
1926
  			   void __user *buffer,
b1ba4ddde   Adrian Bunk   [PATCH] make kern...
1927
  			   size_t *lenp, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1928
1929
1930
1931
  {
  	size_t len;
  	char __user *p;
  	char c;
8d0608771   Oleg Nesterov   [PATCH] _proc_do_...
1932
1933
  
  	if (!data || !maxlen || !*lenp) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1934
1935
1936
  		*lenp = 0;
  		return 0;
  	}
8d0608771   Oleg Nesterov   [PATCH] _proc_do_...
1937

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
  	if (write) {
  		len = 0;
  		p = buffer;
  		while (len < *lenp) {
  			if (get_user(c, p++))
  				return -EFAULT;
  			if (c == 0 || c == '
  ')
  				break;
  			len++;
  		}
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1949
1950
1951
  		if (len >= maxlen)
  			len = maxlen-1;
  		if(copy_from_user(data, buffer, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1952
  			return -EFAULT;
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1953
  		((char *) data)[len] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1954
1955
  		*ppos += *lenp;
  	} else {
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1956
1957
1958
  		len = strlen(data);
  		if (len > maxlen)
  			len = maxlen;
8d0608771   Oleg Nesterov   [PATCH] _proc_do_...
1959
1960
1961
1962
1963
1964
1965
1966
  
  		if (*ppos > len) {
  			*lenp = 0;
  			return 0;
  		}
  
  		data += *ppos;
  		len  -= *ppos;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1967
1968
1969
  		if (len > *lenp)
  			len = *lenp;
  		if (len)
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1970
  			if(copy_to_user(buffer, data, len))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
  				return -EFAULT;
  		if (len < *lenp) {
  			if(put_user('
  ', ((char __user *) buffer) + len))
  				return -EFAULT;
  			len++;
  		}
  		*lenp = len;
  		*ppos += len;
  	}
  	return 0;
  }
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1983
1984
1985
1986
  /**
   * proc_dostring - read a string sysctl
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes a string from/to the user buffer. If the kernel
   * buffer provided is not large enough to hold the string, the
   * string is truncated. The copied string is %NULL-terminated.
   * If the string is being read by the user process, it is copied
   * and a newline '
  ' is added. It is truncated if the buffer is
   * not large enough.
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2001
  int proc_dostring(struct ctl_table *table, int write,
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
2002
2003
  		  void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2004
  	return _proc_do_string(table->data, table->maxlen, write,
f5dd3d6fa   Sam Vilain   [PATCH] proc: sys...
2005
2006
  			       buffer, lenp, ppos);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
  
  static int do_proc_dointvec_conv(int *negp, unsigned long *lvalp,
  				 int *valp,
  				 int write, void *data)
  {
  	if (write) {
  		*valp = *negp ? -*lvalp : *lvalp;
  	} else {
  		int val = *valp;
  		if (val < 0) {
  			*negp = -1;
  			*lvalp = (unsigned long)-val;
  		} else {
  			*negp = 0;
  			*lvalp = (unsigned long)val;
  		}
  	}
  	return 0;
  }
d8217f076   Eric W. Biederman   sysctl core: Stop...
2026
  static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2027
  		  int write, void __user *buffer,
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2028
  		  size_t *lenp, loff_t *ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2029
2030
2031
2032
2033
  		  int (*conv)(int *negp, unsigned long *lvalp, int *valp,
  			      int write, void *data),
  		  void *data)
  {
  #define TMPBUFLEN 21
7338f2998   Sukanto Ghosh   sysctl.c: remove ...
2034
  	int *i, vleft, first = 1, neg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2035
2036
2037
2038
2039
2040
  	unsigned long lval;
  	size_t left, len;
  	
  	char buf[TMPBUFLEN], *p;
  	char __user *s = buffer;
  	
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2041
  	if (!tbl_data || !table->maxlen || !*lenp ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2042
2043
2044
2045
2046
  	    (*ppos && !write)) {
  		*lenp = 0;
  		return 0;
  	}
  	
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2047
  	i = (int *) tbl_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
  	vleft = table->maxlen / sizeof(*i);
  	left = *lenp;
  
  	if (!conv)
  		conv = do_proc_dointvec_conv;
  
  	for (; left && vleft--; i++, first=0) {
  		if (write) {
  			while (left) {
  				char c;
  				if (get_user(c, s))
  					return -EFAULT;
  				if (!isspace(c))
  					break;
  				left--;
  				s++;
  			}
  			if (!left)
  				break;
  			neg = 0;
  			len = left;
  			if (len > sizeof(buf) - 1)
  				len = sizeof(buf) - 1;
  			if (copy_from_user(buf, s, len))
  				return -EFAULT;
  			buf[len] = 0;
  			p = buf;
  			if (*p == '-' && left > 1) {
  				neg = 1;
bd9b0bac6   Praveen BP   [PATCH] sysctl: s...
2077
  				p++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2078
2079
2080
2081
2082
2083
2084
2085
2086
  			}
  			if (*p < '0' || *p > '9')
  				break;
  
  			lval = simple_strtoul(p, &p, 0);
  
  			len = p-buf;
  			if ((len < left) && *p && !isspace(*p))
  				break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
  			s += len;
  			left -= len;
  
  			if (conv(&neg, &lval, i, 1, data))
  				break;
  		} else {
  			p = buf;
  			if (!first)
  				*p++ = '\t';
  	
  			if (conv(&neg, &lval, i, 0, data))
  				break;
  
  			sprintf(p, "%s%lu", neg ? "-" : "", lval);
  			len = strlen(buf);
  			if (len > left)
  				len = left;
  			if(copy_to_user(s, buf, len))
  				return -EFAULT;
  			left -= len;
  			s += len;
  		}
  	}
  
  	if (!write && !first && left) {
  		if(put_user('
  ', s))
  			return -EFAULT;
  		left--, s++;
  	}
  	if (write) {
  		while (left) {
  			char c;
  			if (get_user(c, s++))
  				return -EFAULT;
  			if (!isspace(c))
  				break;
  			left--;
  		}
  	}
  	if (write && first)
  		return -EINVAL;
  	*lenp -= left;
  	*ppos += *lenp;
  	return 0;
  #undef TMPBUFLEN
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2134
  static int do_proc_dointvec(struct ctl_table *table, int write,
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2135
2136
2137
2138
2139
  		  void __user *buffer, size_t *lenp, loff_t *ppos,
  		  int (*conv)(int *negp, unsigned long *lvalp, int *valp,
  			      int write, void *data),
  		  void *data)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2140
  	return __do_proc_dointvec(table->data, table, write,
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2141
2142
  			buffer, lenp, ppos, conv, data);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2143
2144
2145
2146
  /**
   * proc_dointvec - read a vector of integers
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2147
2148
2149
2150
2151
2152
2153
2154
2155
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
   * values from/to the user buffer, treated as an ASCII string. 
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2156
  int proc_dointvec(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2157
2158
  		     void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2159
      return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2160
2161
  		    	    NULL,NULL);
  }
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2162
  /*
25ddbb18a   Andi Kleen   Make the taint fl...
2163
2164
   * Taint values can only be increased
   * This means we can safely use a temporary.
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2165
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2166
  static int proc_taint(struct ctl_table *table, int write,
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2167
2168
  			       void __user *buffer, size_t *lenp, loff_t *ppos)
  {
25ddbb18a   Andi Kleen   Make the taint fl...
2169
2170
2171
  	struct ctl_table t;
  	unsigned long tmptaint = get_taint();
  	int err;
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2172

91fcd412e   Bastian Blank   Allow reading tai...
2173
  	if (write && !capable(CAP_SYS_ADMIN))
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2174
  		return -EPERM;
25ddbb18a   Andi Kleen   Make the taint fl...
2175
2176
  	t = *table;
  	t.data = &tmptaint;
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2177
  	err = proc_doulongvec_minmax(&t, write, buffer, lenp, ppos);
25ddbb18a   Andi Kleen   Make the taint fl...
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
  	if (err < 0)
  		return err;
  
  	if (write) {
  		/*
  		 * Poor man's atomic or. Not worth adding a primitive
  		 * to everyone's atomic.h for this
  		 */
  		int i;
  		for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
  			if ((tmptaint >> i) & 1)
  				add_taint(i);
  		}
  	}
  
  	return err;
34f5a3989   Theodore Ts'o   [PATCH] Add TAINT...
2194
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
  struct do_proc_dointvec_minmax_conv_param {
  	int *min;
  	int *max;
  };
  
  static int do_proc_dointvec_minmax_conv(int *negp, unsigned long *lvalp, 
  					int *valp, 
  					int write, void *data)
  {
  	struct do_proc_dointvec_minmax_conv_param *param = data;
  	if (write) {
  		int val = *negp ? -*lvalp : *lvalp;
  		if ((param->min && *param->min > val) ||
  		    (param->max && *param->max < val))
  			return -EINVAL;
  		*valp = val;
  	} else {
  		int val = *valp;
  		if (val < 0) {
  			*negp = -1;
  			*lvalp = (unsigned long)-val;
  		} else {
  			*negp = 0;
  			*lvalp = (unsigned long)val;
  		}
  	}
  	return 0;
  }
  
  /**
   * proc_dointvec_minmax - read a vector of integers with min/max values
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
   * values from/to the user buffer, treated as an ASCII string.
   *
   * This routine will ensure the values are within the range specified by
   * table->extra1 (min) and table->extra2 (max).
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2240
  int proc_dointvec_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2241
2242
2243
2244
2245
2246
  		  void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	struct do_proc_dointvec_minmax_conv_param param = {
  		.min = (int *) table->extra1,
  		.max = (int *) table->extra2,
  	};
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2247
  	return do_proc_dointvec(table, write, buffer, lenp, ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2248
2249
  				do_proc_dointvec_minmax_conv, &param);
  }
d8217f076   Eric W. Biederman   sysctl core: Stop...
2250
  static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
  				     void __user *buffer,
  				     size_t *lenp, loff_t *ppos,
  				     unsigned long convmul,
  				     unsigned long convdiv)
  {
  #define TMPBUFLEN 21
  	unsigned long *i, *min, *max, val;
  	int vleft, first=1, neg;
  	size_t len, left;
  	char buf[TMPBUFLEN], *p;
  	char __user *s = buffer;
  	
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2263
  	if (!data || !table->maxlen || !*lenp ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2264
2265
2266
2267
2268
  	    (*ppos && !write)) {
  		*lenp = 0;
  		return 0;
  	}
  	
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2269
  	i = (unsigned long *) data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
  	min = (unsigned long *) table->extra1;
  	max = (unsigned long *) table->extra2;
  	vleft = table->maxlen / sizeof(unsigned long);
  	left = *lenp;
  	
  	for (; left && vleft--; i++, min++, max++, first=0) {
  		if (write) {
  			while (left) {
  				char c;
  				if (get_user(c, s))
  					return -EFAULT;
  				if (!isspace(c))
  					break;
  				left--;
  				s++;
  			}
  			if (!left)
  				break;
  			neg = 0;
  			len = left;
  			if (len > TMPBUFLEN-1)
  				len = TMPBUFLEN-1;
  			if (copy_from_user(buf, s, len))
  				return -EFAULT;
  			buf[len] = 0;
  			p = buf;
  			if (*p == '-' && left > 1) {
  				neg = 1;
bd9b0bac6   Praveen BP   [PATCH] sysctl: s...
2298
  				p++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
  			}
  			if (*p < '0' || *p > '9')
  				break;
  			val = simple_strtoul(p, &p, 0) * convmul / convdiv ;
  			len = p-buf;
  			if ((len < left) && *p && !isspace(*p))
  				break;
  			if (neg)
  				val = -val;
  			s += len;
  			left -= len;
  
  			if(neg)
  				continue;
  			if ((min && val < *min) || (max && val > *max))
  				continue;
  			*i = val;
  		} else {
  			p = buf;
  			if (!first)
  				*p++ = '\t';
  			sprintf(p, "%lu", convdiv * (*i) / convmul);
  			len = strlen(buf);
  			if (len > left)
  				len = left;
  			if(copy_to_user(s, buf, len))
  				return -EFAULT;
  			left -= len;
  			s += len;
  		}
  	}
  
  	if (!write && !first && left) {
  		if(put_user('
  ', s))
  			return -EFAULT;
  		left--, s++;
  	}
  	if (write) {
  		while (left) {
  			char c;
  			if (get_user(c, s++))
  				return -EFAULT;
  			if (!isspace(c))
  				break;
  			left--;
  		}
  	}
  	if (write && first)
  		return -EINVAL;
  	*lenp -= left;
  	*ppos += *lenp;
  	return 0;
  #undef TMPBUFLEN
  }
d8217f076   Eric W. Biederman   sysctl core: Stop...
2354
  static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2355
2356
2357
2358
2359
2360
  				     void __user *buffer,
  				     size_t *lenp, loff_t *ppos,
  				     unsigned long convmul,
  				     unsigned long convdiv)
  {
  	return __do_proc_doulongvec_minmax(table->data, table, write,
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2361
  			buffer, lenp, ppos, convmul, convdiv);
fcfbd547b   Kirill Korotaev   [PATCH] IPC names...
2362
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2363
2364
2365
2366
  /**
   * proc_doulongvec_minmax - read a vector of long integers with min/max values
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
   * values from/to the user buffer, treated as an ASCII string.
   *
   * This routine will ensure the values are within the range specified by
   * table->extra1 (min) and table->extra2 (max).
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2379
  int proc_doulongvec_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2380
2381
  			   void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2382
      return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2383
2384
2385
2386
2387
2388
  }
  
  /**
   * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values with min/max values
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long
   * values from/to the user buffer, treated as an ASCII string. The values
   * are treated as milliseconds, and converted to jiffies when they are stored.
   *
   * This routine will ensure the values are within the range specified by
   * table->extra1 (min) and table->extra2 (max).
   *
   * Returns 0 on success.
   */
d8217f076   Eric W. Biederman   sysctl core: Stop...
2402
  int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2403
2404
2405
  				      void __user *buffer,
  				      size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2406
      return do_proc_doulongvec_minmax(table, write, buffer,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2407
2408
2409
2410
2411
2412
2413
2414
2415
  				     lenp, ppos, HZ, 1000l);
  }
  
  
  static int do_proc_dointvec_jiffies_conv(int *negp, unsigned long *lvalp,
  					 int *valp,
  					 int write, void *data)
  {
  	if (write) {
cba9f33d1   Bart Samwel   [PATCH] Range che...
2416
2417
  		if (*lvalp > LONG_MAX / HZ)
  			return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
  		*valp = *negp ? -(*lvalp*HZ) : (*lvalp*HZ);
  	} else {
  		int val = *valp;
  		unsigned long lval;
  		if (val < 0) {
  			*negp = -1;
  			lval = (unsigned long)-val;
  		} else {
  			*negp = 0;
  			lval = (unsigned long)val;
  		}
  		*lvalp = lval / HZ;
  	}
  	return 0;
  }
  
  static int do_proc_dointvec_userhz_jiffies_conv(int *negp, unsigned long *lvalp,
  						int *valp,
  						int write, void *data)
  {
  	if (write) {
cba9f33d1   Bart Samwel   [PATCH] Range che...
2439
2440
  		if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
  			return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
  		*valp = clock_t_to_jiffies(*negp ? -*lvalp : *lvalp);
  	} else {
  		int val = *valp;
  		unsigned long lval;
  		if (val < 0) {
  			*negp = -1;
  			lval = (unsigned long)-val;
  		} else {
  			*negp = 0;
  			lval = (unsigned long)val;
  		}
  		*lvalp = jiffies_to_clock_t(lval);
  	}
  	return 0;
  }
  
  static int do_proc_dointvec_ms_jiffies_conv(int *negp, unsigned long *lvalp,
  					    int *valp,
  					    int write, void *data)
  {
  	if (write) {
  		*valp = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
  	} else {
  		int val = *valp;
  		unsigned long lval;
  		if (val < 0) {
  			*negp = -1;
  			lval = (unsigned long)-val;
  		} else {
  			*negp = 0;
  			lval = (unsigned long)val;
  		}
  		*lvalp = jiffies_to_msecs(lval);
  	}
  	return 0;
  }
  
  /**
   * proc_dointvec_jiffies - read a vector of integers as seconds
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
   * @ppos: file position
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
   * values from/to the user buffer, treated as an ASCII string. 
   * The values read are assumed to be in seconds, and are converted into
   * jiffies.
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2493
  int proc_dointvec_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2494
2495
  			  void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2496
      return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2497
2498
2499
2500
2501
2502
2503
  		    	    do_proc_dointvec_jiffies_conv,NULL);
  }
  
  /**
   * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ seconds
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2504
2505
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
1e5d53314   Randy Dunlap   [PATCH] more kern...
2506
   * @ppos: pointer to the file position
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2507
2508
2509
2510
2511
2512
2513
2514
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
   * values from/to the user buffer, treated as an ASCII string. 
   * The values read are assumed to be in 1/USER_HZ seconds, and 
   * are converted into jiffies.
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2515
  int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2516
2517
  				 void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2518
      return do_proc_dointvec(table,write,buffer,lenp,ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2519
2520
2521
2522
2523
2524
2525
  		    	    do_proc_dointvec_userhz_jiffies_conv,NULL);
  }
  
  /**
   * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
   * @table: the sysctl table
   * @write: %TRUE if this is a write to the sysctl file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2526
2527
   * @buffer: the user buffer
   * @lenp: the size of the user buffer
67be2dd1b   Martin Waitz   [PATCH] DocBook: ...
2528
2529
   * @ppos: file position
   * @ppos: the current position in the file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2530
2531
2532
2533
2534
2535
2536
2537
   *
   * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
   * values from/to the user buffer, treated as an ASCII string. 
   * The values read are assumed to be in 1/1000 seconds, and 
   * are converted into jiffies.
   *
   * Returns 0 on success.
   */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2538
  int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2539
2540
  			     void __user *buffer, size_t *lenp, loff_t *ppos)
  {
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2541
  	return do_proc_dointvec(table, write, buffer, lenp, ppos,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2542
2543
  				do_proc_dointvec_ms_jiffies_conv, NULL);
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2544
  static int proc_do_cad_pid(struct ctl_table *table, int write,
9ec52099e   Cedric Le Goater   [PATCH] replace c...
2545
2546
2547
2548
2549
  			   void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	struct pid *new_pid;
  	pid_t tmp;
  	int r;
6c5f3e7b4   Pavel Emelyanov   Pidns: make full ...
2550
  	tmp = pid_vnr(cad_pid);
9ec52099e   Cedric Le Goater   [PATCH] replace c...
2551

8d65af789   Alexey Dobriyan   sysctl: remove "s...
2552
  	r = __do_proc_dointvec(&tmp, table, write, buffer,
9ec52099e   Cedric Le Goater   [PATCH] replace c...
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
  			       lenp, ppos, NULL, NULL);
  	if (r || !write)
  		return r;
  
  	new_pid = find_get_pid(tmp);
  	if (!new_pid)
  		return -ESRCH;
  
  	put_pid(xchg(&cad_pid, new_pid));
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2564
  #else /* CONFIG_PROC_FS */
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2565
  int proc_dostring(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2566
2567
2568
2569
  		  void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2570
  int proc_dointvec(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2571
  		  void __user *buffer, size_t *lenp, loff_t *ppos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2572
2573
2574
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2575
  int proc_dointvec_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2576
2577
2578
2579
  		    void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2580
  int proc_dointvec_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2581
2582
2583
2584
  		    void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2585
  int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2586
2587
2588
2589
  		    void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2590
  int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2591
2592
2593
2594
  			     void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
8d65af789   Alexey Dobriyan   sysctl: remove "s...
2595
  int proc_doulongvec_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2596
2597
2598
2599
  		    void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	return -ENOSYS;
  }
d8217f076   Eric W. Biederman   sysctl core: Stop...
2600
  int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2601
2602
2603
2604
2605
2606
2607
2608
  				      void __user *buffer,
  				      size_t *lenp, loff_t *ppos)
  {
      return -ENOSYS;
  }
  
  
  #endif /* CONFIG_PROC_FS */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
  /*
   * No sense putting this after each symbol definition, twice,
   * exception granted :-)
   */
  EXPORT_SYMBOL(proc_dointvec);
  EXPORT_SYMBOL(proc_dointvec_jiffies);
  EXPORT_SYMBOL(proc_dointvec_minmax);
  EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
  EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
  EXPORT_SYMBOL(proc_dostring);
  EXPORT_SYMBOL(proc_doulongvec_minmax);
  EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
  EXPORT_SYMBOL(register_sysctl_table);
29e796fd4   Eric W. Biederman   sysctl: Add regis...
2622
  EXPORT_SYMBOL(register_sysctl_paths);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2623
  EXPORT_SYMBOL(unregister_sysctl_table);