1. 09 5月, 2007 40 次提交
    • P
      nfs: fix congestion control: use atomic_longs · 277866a0
      Peter Zijlstra 提交于
      Change the atomic_t in struct nfs_server to atomic_long_t in anticipation
      of machines that can handle 8+TB of (4K) pages under writeback.
      
      However I suspect other things in NFS will start going *bang* by then.
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      277866a0
    • U
      utimensat implementation · 1c710c89
      Ulrich Drepper 提交于
      Implement utimensat(2) which is an extension to futimesat(2) in that it
      
      a) supports nano-second resolution for the timestamps
      b) allows to selectively ignore the atime/mtime value
      c) allows to selectively use the current time for either atime or mtime
      d) supports changing the atime/mtime of a symlink itself along the lines
         of the BSD lutimes(3) functions
      
      For this change the internally used do_utimes() functions was changed to
      accept a timespec time value and an additional flags parameter.
      
      Additionally the sys_utime function was changed to match compat_sys_utime
      which already use do_utimes instead of duplicating the work.
      
      Also, the completely missing futimensat() functionality is added.  We have
      such a function in glibc but we have to resort to using /proc/self/fd/* which
      not everybody likes (chroot etc).
      
      Test application (the syscall number will need per-arch editing):
      
      #include <errno.h>
      #include <fcntl.h>
      #include <time.h>
      #include <sys/time.h>
      #include <stddef.h>
      #include <syscall.h>
      
      #define __NR_utimensat 280
      
      #define UTIME_NOW       ((1l << 30) - 1l)
      #define UTIME_OMIT      ((1l << 30) - 2l)
      
      int
      main(void)
      {
        int status = 0;
      
        int fd = open("ttt", O_RDWR|O_CREAT|O_EXCL, 0666);
        if (fd == -1)
          error (1, errno, "failed to create test file \"ttt\"");
      
        struct stat64 st1;
        if (fstat64 (fd, &st1) != 0)
          error (1, errno, "fstat failed");
      
        struct timespec t[2];
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        struct stat64 st2;
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0] = st1.st_atim;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_OMIT;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("atim not set");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim changed from zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_OMIT;
        t[1] = st1.st_mtim;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("mtim changed from original time");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != st1.st_mtim.tv_sec
            || st2.st_mtim.tv_nsec != st1.st_mtim.tv_nsec)
          {
            puts ("mtim not set");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        sleep (2);
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_NOW;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_NOW;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        struct timeval tv;
        gettimeofday(&tv,NULL);
      
        if (st2.st_atim.tv_sec <= st1.st_atim.tv_sec
            || st2.st_atim.tv_sec > tv.tv_sec)
          {
            puts ("atim not set to NOW");
            status = 1;
          }
        if (st2.st_mtim.tv_sec <= st1.st_mtim.tv_sec
            || st2.st_mtim.tv_sec > tv.tv_sec)
          {
            puts ("mtim not set to NOW");
            status = 1;
          }
      
        if (symlink ("ttt", "tttsym") != 0)
          error (1, errno, "cannot create symlink");
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "tttsym", t, AT_SYMLINK_NOFOLLOW) != 0)
          error (1, errno, "utimensat failed");
      
        if (lstat64 ("tttsym", &st2) != 0)
          error (1, errno, "lstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("symlink atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("symlink mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 1;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 1;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, fd, NULL, t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 1 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to one");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 1 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to one");
            status = 1;
          }
      
        if (status == 0)
           puts ("all OK");
      
       out:
        close (fd);
        unlink ("ttt");
        unlink ("tttsym");
      
        return status;
      }
      
      [akpm@linux-foundation.org: add missing i386 syscall table entry]
      Signed-off-by: NUlrich Drepper <drepper@redhat.com>
      Cc: Alexey Dobriyan <adobriyan@openvz.org>
      Cc: Michael Kerrisk <mtk-manpages@gmx.net>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1c710c89
    • J
      inode numbering: change libfs sb creation routines to avoid collisions with their root inodes · 1a1c9bb4
      Jeff Layton 提交于
      This patch makes it so that simple_fill_super and get_sb_pseudo assign their
      root inodes to be number 1.  It also fixes up a couple of callers of
      simple_fill_super that were passing in files arrays that had an index at
      number 1, and adds a warning for any caller that sends in such an array.
      
      It would have been nice to have made it so that it wasn't possible to make
      such a collision, but some callers need to be able to control what inode
      number their entries get, so I think this is the best that can be done.
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1a1c9bb4
    • J
      inode numbering: make static counters in new_inode and iunique be 32 bits · 866b04fc
      Jeff Layton 提交于
      The problems are:
      
      - on filesystems w/o permanent inode numbers, i_ino values can be larger
        than 32 bits, which can cause problems for some 32 bit userspace programs on
        a 64 bit kernel.  We can't do anything for filesystems that have actual
        >32-bit inode numbers, but on filesystems that generate i_ino values on the
        fly, we should try to have them fit in 32 bits.  We could trivially fix this
        by making the static counters in new_inode and iunique 32 bits, but...
      
      - many filesystems call new_inode and assume that the i_ino values they are
        given are unique.  They are not guaranteed to be so, since the static
        counter can wrap.  This problem is exacerbated by the fix for #1.
      
      - after allocating a new inode, some filesystems call iunique to try to get
        a unique i_ino value, but they don't actually add their inodes to the
        hashtable, and so they're still not guaranteed to be unique if that counter
        wraps.
      
      This patch set takes the simpler approach of simply using iunique and hashing
      the inodes afterward.  Christoph H.  previously mentioned that he thought that
      this approach may slow down lookups for filesystems that currently hash their
      inodes.
      
      The questions are:
      
      1) how much would this slow down lookups for these filesystems?
      2) is it enough to justify adding more infrastructure to avoid it?
      
      What might be best is to start with this approach and then only move to using
      IDR or some other scheme if these extra inodes in the hashtable prove to be
      problematic.
      
      I've done some cursory testing with this patch and the overhead of hashing and
      unhashing the inodes with pipefs is pretty low -- just a few seconds of system
      time added on to the creation and destruction of 10 million pipes (very
      similar to the overhead that the IDR approach would add).
      
      The hard thing to measure is what effect this has on other filesystems. I'm
      open to ways to try and gauge this.
      
      Again, I've only converted pipefs as an example. If this approach is
      acceptable then I'll start work on patches to convert other filesystems.
      
      With a pretty-much-worst-case microbenchmark provided by Eric Dumazet
      <dada1@cosmosbay.com>:
      
      hashing patch (pipebench):
      sys     1m15.329s
      sys     1m16.249s
      sys     1m17.169s
      
      unpatched (pipebench):
      sys     1m9.836s
      sys     1m12.541s
      sys     1m14.153s
      
      Which works out to 1.05642174294555027017.  So ~5-6% slowdown.
      
      This patch:
      
      When a 32-bit program that was not compiled with large file offsets does a
      stat and gets a st_ino value back that won't fit in the 32 bit field, glibc
      (correctly) generates an EOVERFLOW error.  We can't do anything about fs's
      with larger permanent inode numbers, but when we generate them on the fly, we
      ought to try and have them fit within a 32 bit field.
      
      This patch takes the first step toward this by making the static counters in
      these two functions be 32 bits.
      
      [jlayton@redhat.com: mention that it's only the case for 32bit, non-LFS stat]
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      866b04fc
    • A
      Invalid return value of execve() resulting in oopses · b140f251
      Alexey Kuznetsov 提交于
      When elf loader fails to map executable (due to memory shortage or because
      binary is malformed), it can return 0.  Normally, this is invisible because
      process is killed with SIGKILL and it never returns to user space.
      
      But if exec() is called from kernel thread (hotplug, whatever)
      consequences are more interesting and vary depending on architecture.
      
      i386.   Nothing especially interesting, execve() just returns
              with "success"  :-)
      
      x86_64. Fake zero frame is used on way to caller, RSP/RIP are loaded
              with zeros, ergo... double fault.
      
      ia64.   Similar to i386, but r32...r95 are corrupted. Sometimes it
              oopses due to return to zero PC, sometimes it sees NaT in
              rXX and oopses due to NaT consumption.
      Signed-off-by: NAlexey Kuznetsov <alexey@openvz.org>
      Signed-off-by: NKirill Korotaev <dev@openvz.org>
      Signed-off-by: NPavel Emelianov <xemul@openvz.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      b140f251
    • A
      procfs: use simple_read_from_buffer() · 0c28f287
      Akinobu Mita 提交于
      Cleanup using simple_read_from_buffer() in procfs.
      Signed-off-by: NAkinobu Mita <akinobu.mita@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      0c28f287
    • A
      Fix error handling in HDIO_GETGEO compat wrapper · 83ae1b79
      Andreas Schwab 提交于
      Don't clobber error from sys_ioctl in HDIO_GETGEO compat wrapper.
      Signed-off-by: NAndreas Schwab <schwab@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      83ae1b79
    • S
      udf: decrement correct link count in udf_rmdir · c007c06e
      Stephen Mollett 提交于
      It appears that a minor thinko occurred in udf_rmdir and the
      (already-cleared) link count on the directory that is being removed was
      being decremented instead of the link count on its parent directory.  This
      gives rise to lots of kernel messages similar to:
      
      UDF-fs warning (device loop1): udf_rmdir: empty directory has nlink != 2 (8)
      
      when removing directory trees.  No other ill effects have been observed but
      I guess it could theoretically result in the link count overflowing on a
      very long-lived, much modified directory.
      Signed-off-by: NStephen Mollett <molletts@yahoo.com>
      Cc: Dave Hansen <haveblue@us.ibm.com>
      Cc: Jan Kara <jack@ucw.cz>
      Cc: <stable@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c007c06e
    • O
      fat: fix VFAT compat ioctls on 64-bit systems · c483bab0
      OGAWA Hirofumi 提交于
      If you compile and run the below test case in an msdos or vfat directory on
      an x86-64 system with -m32 you'll get garbage in the kernel_dirent struct
      followed by a SIGSEGV.
      
      The patch fixes this.
      
      Reported and initial fix by Bart Oldeman
      
      #include <sys/types.h>
      #include <sys/ioctl.h>
      #include <dirent.h>
      #include <stdio.h>
      #include <unistd.h>
      #include <fcntl.h>
      struct kernel_dirent {
               long            d_ino;
               long		d_off;
               unsigned short  d_reclen;
               char            d_name[256]; /* We must not include limits.h! */
      };
      #define VFAT_IOCTL_READDIR_BOTH  _IOR('r', 1, struct kernel_dirent [2])
      #define VFAT_IOCTL_READDIR_SHORT  _IOR('r', 2, struct kernel_dirent [2])
      
      int main(void)
      {
               int fd = open(".", O_RDONLY);
               struct kernel_dirent de[2];
      
               while (1) {
                       int i = ioctl(fd, VFAT_IOCTL_READDIR_BOTH, (long)de);
                       if (i == -1) break;
                       if (de[0].d_reclen == 0) break;
                       printf("SFN: reclen=%2d off=%d ino=%d, %-12s",
       		       de[0].d_reclen, de[0].d_off, de[0].d_ino, de[0].d_name);
       		if (de[1].d_reclen)
       		  printf("\tLFN: reclen=%2d off=%d ino=%d, %s",
       		    de[1].d_reclen, de[1].d_off, de[1].d_ino, de[1].d_name);
       		printf("\n");
               }
               return 0;
      }
      Signed-off-by: NBart Oldeman <bartoldeman@users.sourceforge.net>
      Signed-off-by: NOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
      Cc: <stable@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c483bab0
    • J
      ext3: copy i_flags to inode flags on write · 4f99ed67
      Jan Kara 提交于
      Propagate flags such as S_APPEND, S_IMMUTABLE, etc.  from i_flags into
      ext2-specific i_flags.  Hence, when someone sets these flags via a different
      interface than ioctl, they are stored correctly.
      Signed-off-by: NJan Kara <jack@suse.cz>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      4f99ed67
    • O
      fat: don't use free_clusters for fat32 · 28ec039c
      OGAWA Hirofumi 提交于
      It seems that the recent Windows changed specification, and it's
      undocumented.  Windows doesn't update ->free_clusters correctly.
      
      This patch doesn't use ->free_clusters by default.  (instead, add "usefree"
      for forcing to use it)
      Signed-off-by: NOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
      Cc: Juergen Beisert <juergen127@kreuzholzen.de>
      Cc: Andreas Schwab <schwab@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      28ec039c
    • M
      reiserfs: use __set_current_state() · 5ab2f7e0
      Milind Arun Choudhary 提交于
      use __set_current_state(TASK_*) instead of current->state = TASK_*, in
      fs/reiserfs
      Signed-off-by: NMilind Arun Choudhary <milindchoudhary@gmail.com>
      Cc: <reiserfs-dev@namesys.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      5ab2f7e0
    • P
      jbd: check for error returned by kthread_create on creating journal thread · 97f06784
      Pavel Emelianov 提交于
      If the thread failed to create the subsequent wait_event will hang forever.
      
      This is likely to happen if kernel hits max_threads limit.
      
      Will be critical for virtualization systems that limit the number of tasks
      and kernel memory usage within the container.
      
      (akpm: JBD should be converted fully to the kthread API: kthread_should_stop()
      and kthread_stop()).
      
      Cc: <linux-ext4@vger.kernel.org>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      97f06784
    • M
      check privileges before setting mount propagation · ee6f9582
      Miklos Szeredi 提交于
      There's a missing check for CAP_SYS_ADMIN in do_change_type().
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ee6f9582
    • J
      ext3: copy i_flags to inode flags on write · 28be5abb
      Jan Kara 提交于
      A patch that stores inode flags such as S_IMMUTABLE, S_APPEND, etc.  from
      i_flags to EXT3_I(inode)->i_flags when inode is written to disk.  The same
      thing is done on GETFLAGS ioctl.
      
      Quota code changes these flags on quota files (to make it harder for
      sysadmin to screw himself) and these changes were not correctly propagated
      into the filesystem (especially, lsattr did not show them and users were
      wondering...).
      
      Propagate flags such as S_APPEND, S_IMMUTABLE, etc.  from i_flags into
      ext3-specific i_flags.  Hence, when someone sets these flags via a
      different interface than ioctl, they are stored correctly.
      Signed-off-by: NJan Kara <jack@suse.cz>
      Cc: <linux-ext4@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      28be5abb
    • P
      Introduce a handy list_first_entry macro · b5e61818
      Pavel Emelianov 提交于
      There are many places in the kernel where the construction like
      
         foo = list_entry(head->next, struct foo_struct, list);
      
      are used.
      The code might look more descriptive and neat if using the macro
      
         list_first_entry(head, type, member) \
                   list_entry((head)->next, type, member)
      
      Here is the macro itself and the examples of its usage in the generic code.
       If it will turn out to be useful, I can prepare the set of patches to
      inject in into arch-specific code, drivers, networking, etc.
      Signed-off-by: NPavel Emelianov <xemul@openvz.org>
      Signed-off-by: NKirill Korotaev <dev@openvz.org>
      Cc: Randy Dunlap <randy.dunlap@oracle.com>
      Cc: Andi Kleen <andi@firstfloor.org>
      Cc: Zach Brown <zach.brown@oracle.com>
      Cc: Davide Libenzi <davidel@xmailserver.org>
      Cc: John McCutchan <ttb@tentacle.dhs.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: john stultz <johnstul@us.ibm.com>
      Cc: Ram Pai <linuxram@us.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      b5e61818
    • E
    • J
      make iunique use a do/while loop rather than its obscure goto loop · 3361c7be
      Jeffrey Layton 提交于
      A while back, Christoph mentioned that he thought that iunique ought to be
      cleaned up to use a more conventional loop construct. This patch does that,
      turning the strange goto loop into a do/while.
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      3361c7be
    • J
      Remove redundant check from proc_sys_setattr() · 9d0633cf
      John Johansen 提交于
      notify_change() already calls security_inode_setattr() before
      calling iop->setattr.
      
      Alan sayeth
      
        This is a behaviour change on all of these and limits some behaviour of
        existing established security modules
      
        When inode_change_ok is called it has side effects.  This includes
        clearing the SGID bit on attribute changes caused by chmod.  If you make
        this change the results of some rulesets may be different before or after
        the change is made.
      
        I'm not saying the change is wrong but it does change behaviour so that
        needs looking at closely (ditto all other attribute twiddles)
      Signed-off-by: NSteve Beattie <sbeattie@suse.de>
      Signed-off-by: NAndreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NJohn Johansen <jjohansen@suse.de>
      Acked-by: NStephen Smalley <sds@tycho.nsa.gov>
      Cc: James Morris <jmorris@namei.org>
      Cc: Chris Wright <chrisw@sous-sol.org>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      9d0633cf
    • J
      Remove redundant check from proc_setattr() · 1e8123fd
      John Johansen 提交于
      notify_change() already calls security_inode_setattr() before
      calling iop->setattr.
      Signed-off-by: NTony Jones <tonyj@suse.de>
      Signed-off-by: NAndreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NJohn Johansen <jjohansen@suse.de>
      Acked-by: NStephen Smalley <sds@tycho.nsa.gov>
      Cc: James Morris <jmorris@namei.org>
      Cc: Chris Wright <chrisw@sous-sol.org>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1e8123fd
    • M
      proc: cleanup: use seq_release_private() where appropriate · 09f0892e
      Martin Peschke 提交于
      We can save some lines of code by using seq_release_private().
      Signed-off-by: NMartin Peschke <mp3@de.ibm.com>
      Cc: "Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      09f0892e
    • C
      cleanup compat ioctl handling · 6272e266
      Christoph Hellwig 提交于
      Merge all compat ioctl handling into compat_ioctl.c instead of splitting it
      over compat.c and compat_ioctl.c.  This also allows to get rid of ioctl32.h
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Looks-good-to: Andi Kleen <ak@suse.de>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      6272e266
    • P
      partition: add support for sysv68 partitions · 19d0e8ce
      Philippe De Muyter 提交于
      Add support for the Motorola sysv68 disk partition (slices in motorola
      doc).
      Signed-off-by: NPhilippe De Muyter <phdm@macqel.be>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      19d0e8ce
    • C
      merge compat_ioctl.h into compat_ioctl.c · 644fd4f5
      Christoph Hellwig 提交于
      Now that there is no arch-specific compat ioctl handling left there is not
      point in having a separate copat_ioctl.h, so merge it into compat_ioctl.c
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      Acked-by: NDavid S. Miller <davem@davemloft.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      644fd4f5
    • M
      ROUND_UP macro cleanup in fs/smbfs/request.c · 1525dccb
      Milind Arun Choudhary 提交于
      ROUND_UP macro cleanup use ALIGN
      Signed-off-by: NMilind Arun Choudhary <milindchoudhary@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1525dccb
    • M
      ROUND_UP macro cleanup in fs/(select|compat|readdir).c · 022a1692
      Milind Arun Choudhary 提交于
      ROUND_UP macro cleanup use,ALIGN or DIV_ROUND_UP where ever appropriate.
      Signed-off-by: NMilind Arun Choudhary <milindchoudhary@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      022a1692
    • A
      i386: sched.h inclusion from module.h is baack · 7e80d0d0
      Alexey Dobriyan 提交于
        linux/module.h
        -> linux/elf.h
           -> asm-i386/elf.h
              -> linux/utsname.h
                 -> linux/sched.h
      
      Noticeably cut the number of files which are rebuild upon touching sched.h
      and cut down pulled junk from every module.h inclusion.
      Signed-off-by: NAlexey Dobriyan <adobriyan@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7e80d0d0
    • A
      Fix race between cat /proc/*/wchan and rmmod et al · 9d65cb4a
      Alexey Dobriyan 提交于
      kallsyms_lookup() can go iterating over modules list unprotected which is OK
      for emergency situations (oops), but not OK for regular stuff like
      /proc/*/wchan.
      
      Introduce lookup_symbol_name()/lookup_module_symbol_name() which copy symbol
      name into caller-supplied buffer or return -ERANGE.  All copying is done with
      module_mutex held, so...
      Signed-off-by: NAlexey Dobriyan <adobriyan@sw.ru>
      Cc: Rusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      9d65cb4a
    • A
      Simplify kallsyms_lookup() · ffb45122
      Alexey Dobriyan 提交于
      Several kallsyms_lookup() pass dummy arguments but only need, say, module's
      name.  Make kallsyms_lookup() accept NULLs where possible.
      
      Also, makes picture clearer about what interfaces are needed for all symbol
      resolving business.
      Signed-off-by: NAlexey Dobriyan <adobriyan@sw.ru>
      Cc: Rusty Russell <rusty@rustcorp.com.au>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ffb45122
    • K
      (re)register_binfmt returns with -EBUSY · 98701d1b
      kalash nainwal 提交于
      When a binary format is unregistered and re-registered, register_binfmt
      fails with -EBUSY.  The reason is that unregister_binfmt does not set
      fmt->next to NULL, and seeing (fmt->next != NULL), register_binfmt fails
      with -EBUSY.
      
      One can find his way around by explicitly setting fmt->next to NULL after
      unregistering, but that is kind of unclean (one should better be using only
      the interfaces, and not the interal members, isn't it?)
      
      Attached one-liner can fix it.
      Signed-off-by: NKalash Nainwal <kalash.nainwal@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      98701d1b
    • R
      header cleaning: don't include smp_lock.h when not used · e63340ae
      Randy Dunlap 提交于
      Remove includes of <linux/smp_lock.h> where it is not used/needed.
      Suggested by Al Viro.
      
      Builds cleanly on x86_64, i386, alpha, ia64, powerpc, sparc,
      sparc64, and arm (all 59 defconfigs).
      Signed-off-by: NRandy Dunlap <randy.dunlap@oracle.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e63340ae
    • A
      make remove_inode_dquot_ref() static · e5f00f42
      Adrian Bunk 提交于
      remove_inode_dquot_ref() can now become static.
      Signed-off-by: NAdrian Bunk <bunk@stusta.de>
      Acked-by: NJan Kara <jack@suse.cz>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e5f00f42
    • A
      Protect tty drivers list with tty_mutex · ca509f69
      Alexey Dobriyan 提交于
      Additions and removal from tty_drivers list were just done as well as
      iterating on it for /proc/tty/drivers generation.
      
      testing: modprobe/rmmod loop of simple module which does nothing but
      tty_register_driver() vs cat /proc/tty/drivers loop
      
      BUG: unable to handle kernel paging request at virtual address 6b6b6b6b
       printing eip:
      c01cefa7
      *pde = 00000000
      Oops: 0000 [#1]
      PREEMPT
      last sysfs file: devices/pci0000:00/0000:00:1d.7/usb5/5-0:1.0/bInterfaceProtocol
      Modules linked in: ohci_hcd af_packet e1000 ehci_hcd uhci_hcd usbcore xfs
      CPU:    0
      EIP:    0060:[<c01cefa7>]    Not tainted VLI
      EFLAGS: 00010297   (2.6.21-rc4-mm1 #4)
      EIP is at vsnprintf+0x3a4/0x5fc
      eax: 6b6b6b6b   ebx: f6cb50f2   ecx: 6b6b6b6b   edx: fffffffe
      esi: c0354700   edi: f6cb6000   ebp: 6b6b6b6b   esp: f31f5e68
      ds: 007b   es: 007b   fs: 00d8  gs: 0033  ss: 0068
      Process cat (pid: 31864, ti=f31f4000 task=c1998030 task.ti=f31f4000)
      Stack: 00000000 c0103f20 c013003a c0103f20 00000000 f6cb50da 0000000a 00000f0e
             f6cb50f2 00000010 00000014 ffffffff ffffffff 00000007 c0354753 f6cb50f2
             f73e39dc f73e39dc 00000001 c0175416 f31f5ed8 f31f5ed4 0ee00000 f32090bc
      Call Trace:
       [<c0103f20>] restore_nocheck+0x12/0x15
       [<c013003a>] mark_held_locks+0x6d/0x86
       [<c0103f20>] restore_nocheck+0x12/0x15
       [<c0175416>] seq_printf+0x2e/0x52
       [<c0192895>] show_tty_range+0x35/0x1f3
       [<c0175416>] seq_printf+0x2e/0x52
       [<c0192add>] show_tty_driver+0x8a/0x1d9
       [<c01758f6>] seq_read+0x70/0x2ba
       [<c0175886>] seq_read+0x0/0x2ba
       [<c018d8e6>] proc_reg_read+0x63/0x9f
       [<c015e764>] vfs_read+0x7d/0xb5
       [<c018d883>] proc_reg_read+0x0/0x9f
       [<c015eab1>] sys_read+0x41/0x6a
       [<c0103e4e>] sysenter_past_esp+0x5f/0x99
       =======================
      Code: 00 8b 4d 04 e9 44 ff ff ff 8d 4d 04 89 4c 24 50 8b 6d 00 81 fd ff 0f 00 00 b8 a4 c1 35 c0 0f 46 e8 8b 54 24 2c 89 e9 89 c8 eb 06 <80> 38 00 74 07 40 4a 83 fa ff 75 f4 29 c8 89 c6 8b 44 24 28 89
      EIP: [<c01cefa7>] vsnprintf+0x3a4/0x5fc SS:ESP 0068:f31f5e68
      Signed-off-by: NAlexey Dobriyan <adobriyan@sw.ru>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ca509f69
    • M
      Remove do_sync_file_range() · ef51c976
      Mark Fasheh 提交于
      Remove do_sync_file_range() and convert callers to just use
      do_sync_mapping_range().
      Signed-off-by: NMark Fasheh <mark.fasheh@oracle.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ef51c976
    • R
      reiserfs: proc support requires PROC_FS · 880ebdc5
      Randy Dunlap 提交于
      REISER_FS /proc option needs to depend on PROC_FS.
      
      fs/reiserfs/procfs.c: In function 'show_super':
      fs/reiserfs/procfs.c:134: error: 'reiserfs_proc_info_data_t' has no member named 'max_hash_collisions'
      fs/reiserfs/procfs.c:134: error: 'reiserfs_proc_info_data_t' has no member named 'breads'
      fs/reiserfs/procfs.c:135: error: 'reiserfs_proc_info_data_t' has no member named 'bread_miss'
      fs/reiserfs/procfs.c:135: error: 'reiserfs_proc_info_data_t' has no member named 'search_by_key'
      fs/reiserfs/procfs.c:136: error: 'reiserfs_proc_info_data_t' has no member named 'search_by_key_fs_changed'
      fs/reiserfs/procfs.c:136: error: 'reiserfs_proc_info_data_t' has no member named 'search_by_key_restarted'
      fs/reiserfs/procfs.c:137: error: 'reiserfs_proc_info_data_t' has no member named 'insert_item_restarted'
      fs/reiserfs/procfs.c:137: error: 'reiserfs_proc_info_data_t' has no member named 'paste_into_item_restarted'
      fs/reiserfs/procfs.c:138: error: 'reiserfs_proc_info_data_t' has no member named 'cut_from_item_restarted'
      fs/reiserfs/procfs.c:139: error: 'reiserfs_proc_info_data_t' has no member named 'delete_solid_item_restarted'
      fs/reiserfs/procfs.c:139: error: 'reiserfs_proc_info_data_t' has no member named 'delete_item_restarted'
      fs/reiserfs/procfs.c:140: error: 'reiserfs_proc_info_data_t' has no member named 'leaked_oid'
      fs/reiserfs/procfs.c:140: error: 'reiserfs_proc_info_data_t' has no member named 'leaves_removable'
      fs/reiserfs/procfs.c: In function 'show_per_level':
      fs/reiserfs/procfs.c:184: error: 'reiserfs_proc_info_data_t' has no member named 'balance_at'
      fs/reiserfs/procfs.c:185: error: 'reiserfs_proc_info_data_t' has no member named 'sbk_read_at'
      fs/reiserfs/procfs.c:186: error: 'reiserfs_proc_info_data_t' has no member named 'sbk_fs_changed'
      fs/reiserfs/procfs.c:187: error: 'reiserfs_proc_info_data_t' has no member named 'sbk_restarted'
      fs/reiserfs/procfs.c:188: error: 'reiserfs_proc_info_data_t' has no member named 'free_at'
      fs/reiserfs/procfs.c:189: error: 'reiserfs_proc_info_data_t' has no member named 'items_at'
      fs/reiserfs/procfs.c:190: error: 'reiserfs_proc_info_data_t' has no member named 'can_node_be_removed'
      fs/reiserfs/procfs.c:191: error: 'reiserfs_proc_info_data_t' has no member named 'lnum'
      fs/reiserfs/procfs.c:192: error: 'reiserfs_proc_info_data_t' has no member named 'rnum'
      fs/reiserfs/procfs.c:193: error: 'reiserfs_proc_info_data_t' has no member named 'lbytes'
      fs/reiserfs/procfs.c:194: error: 'reiserfs_proc_info_data_t' has no member named 'rbytes'
      fs/reiserfs/procfs.c:195: error: 'reiserfs_proc_info_data_t' has no member named 'get_neighbors'
      fs/reiserfs/procfs.c:196: error: 'reiserfs_proc_info_data_t' has no member named 'get_neighbors_restart'
      fs/reiserfs/procfs.c:197: error: 'reiserfs_proc_info_data_t' has no member named 'need_l_neighbor'
      fs/reiserfs/procfs.c:197: error: 'reiserfs_proc_info_data_t' has no member named 'need_r_neighbor'
      fs/reiserfs/procfs.c: In function 'show_bitmap':
      fs/reiserfs/procfs.c:224: error: 'reiserfs_proc_info_data_t' has no member named 'free_block'
      fs/reiserfs/procfs.c:225: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:226: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:227: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:228: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:229: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:230: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c:230: error: 'reiserfs_proc_info_data_t' has no member named 'scan_bitmap'
      fs/reiserfs/procfs.c: In function 'show_journal':
      fs/reiserfs/procfs.c:384: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:385: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:386: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:387: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:388: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:389: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:390: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:391: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:392: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:393: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:394: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:395: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:395: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c:395: error: 'reiserfs_proc_info_data_t' has no member named 'journal'
      fs/reiserfs/procfs.c: In function 'reiserfs_proc_info_init':
      fs/reiserfs/procfs.c:504: warning: implicit declaration of function '__PINFO'
      fs/reiserfs/procfs.c:504: error: request for member 'lock' in something not a structure or union
      fs/reiserfs/procfs.c: In function 'reiserfs_proc_info_done':
      fs/reiserfs/procfs.c:544: error: request for member 'lock' in something not a structure or union
      fs/reiserfs/procfs.c:545: error: request for member 'exiting' in something not a structure or union
      fs/reiserfs/procfs.c:546: error: request for member 'lock' in something not a structure or union
      Signed-off-by: NRandy Dunlap <randy.dunlap@oracle.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      880ebdc5
    • A
      /proc/*/oom_score oops re badness · 19c5d45a
      Alexey Dobriyan 提交于
      Eternal quest to make
      
      	while true; do cat /proc/fs/xfs/stat >/dev/null 2>/dev/null; done
      	while true; do find /proc -type f 2>/dev/null | xargs cat >/dev/null 2>/dev/null; done
      	while true; do modprobe xfs; rmmod xfs; done
      
      work reliably continues and now kernel oopses in the following way:
      
      BUG: unable to handle ... at virtual address 6b6b6b6b
      EIP is at badness
      process: cat
      	proc_oom_score
      	proc_info_read
      	sys_fstat64
      	vfs_read
      	proc_info_read
      	sys_read
      
      Failing code is prefetch hidden in list_for_each_entry() in badness().
      badness() is reachable from two points. One is proc_oom_score, another
      is out_of_memory() => select_bad_process() => badness().
      
      Second path grabs tasklist_lock, while first doesn't.
      Signed-off-by: NAlexey Dobriyan <adobriyan@sw.ru>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      19c5d45a
    • E
      VFS: delay the dentry name generation on sockets and pipes · c23fbb6b
      Eric Dumazet 提交于
      1) Introduces a new method in 'struct dentry_operations'.  This method
         called d_dname() might be called from d_path() to build a pathname for
         special filesystems.  It is called without locks.
      
         Future patches (if we succeed in having one common dentry for all
         pipes/sockets) may need to change prototype of this method, but we now
         use : char *d_dname(struct dentry *dentry, char *buffer, int buflen);
      
      2) Adds a dynamic_dname() helper function that eases d_dname() implementations
      
      3) Defines d_dname method for sockets : No more sprintf() at socket
         creation.  This is delayed up to the moment someone does an access to
         /proc/pid/fd/...
      
      4) Defines d_dname method for pipes : No more sprintf() at pipe
         creation.  This is delayed up to the moment someone does an access to
         /proc/pid/fd/...
      
      A benchmark consisting of 1.000.000 calls to pipe()/close()/close() gives a
      *nice* speedup on my Pentium(M) 1.6 Ghz :
      
      3.090 s instead of 3.450 s
      Signed-off-by: NEric Dumazet <dada1@cosmosbay.com>
      Acked-by: NChristoph Hellwig <hch@infradead.org>
      Acked-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c23fbb6b
    • M
      add file position info to proc · 27932742
      Miklos Szeredi 提交于
      Add support for finding out the current file position, open flags and
      possibly other info in the future.
      
      These new entries are added:
      
        /proc/PID/fdinfo/FD
        /proc/PID/task/TID/fdinfo/FD
      
      For each fd the information is provided in the following format:
      
      pos:	1234
      flags:	0100002
      
      [bunk@stusta.de: make struct proc_fdinfo_file_operations static]
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Cc: Alexey Dobriyan <adobriyan@sw.ru>
      Signed-off-by: NAdrian Bunk <bunk@stusta.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      27932742
    • E
      procfs: reorder struct pid_dentry to save space on 64bit archs, and constify them · c5141e6d
      Eric Dumazet 提交于
      Change the order of fields of struct pid_entry (file fs/proc/base.c) in order
      to avoid a hole on 64bit archs.  (8 bytes saved per object)
      
      Also change all pid_entry arrays to be const qualified, to make clear they
      must not be modified.
      
      Before (on x86_64) :
      
      # size fs/proc/base.o
         text    data     bss     dec     hex filename
        15549    2192       0   17741    454d fs/proc/base.o
      
      After :
      
      # size fs/proc/base.o
         text    data     bss     dec     hex filename
        17229     176       0   17405    43fd fs/proc/base.o
      
      Thats 336 bytes saved on kernel size on x86_64
      Signed-off-by: NEric Dumazet <dada1@cosmosbay.com>
      Acked-by: N"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c5141e6d
    • K
      proc: maps protection · 5096add8
      Kees Cook 提交于
      The /proc/pid/ "maps", "smaps", and "numa_maps" files contain sensitive
      information about the memory location and usage of processes.  Issues:
      
      - maps should not be world-readable, especially if programs expect any
        kind of ASLR protection from local attackers.
      - maps cannot just be 0400 because "-D_FORTIFY_SOURCE=2 -O2" makes glibc
        check the maps when %n is in a *printf call, and a setuid(getuid())
        process wouldn't be able to read its own maps file.  (For reference
        see http://lkml.org/lkml/2006/1/22/150)
      - a system-wide toggle is needed to allow prior behavior in the case of
        non-root applications that depend on access to the maps contents.
      
      This change implements a check using "ptrace_may_attach" before allowing
      access to read the maps contents.  To control this protection, the new knob
      /proc/sys/kernel/maps_protect has been added, with corresponding updates to
      the procfs documentation.
      
      [akpm@linux-foundation.org: build fixes]
      [akpm@linux-foundation.org: New sysctl numbers are old hat]
      Signed-off-by: NKees Cook <kees@outflux.net>
      Cc: Arjan van de Ven <arjan@infradead.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      5096add8