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