1. 28 Sep, 2016 1 commit
  2. 07 Jun, 2016 1 commit
  3. 04 Apr, 2016 1 commit
    • Kirill A. Shutemov's avatar
      mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros · 09cbfeaf
      Kirill A. Shutemov authored
      PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time
      ago with promise that one day it will be possible to implement page
      cache with bigger chunks than PAGE_SIZE.
      
      This promise never materialized.  And unlikely will.
      
      We have many places where PAGE_CACHE_SIZE assumed to be equal to
      PAGE_SIZE.  And it's constant source of confusion on whether
      PAGE_CACHE_* or PAGE_* constant should be used in a particular case,
      especially on the border between fs and mm.
      
      Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much
      breakage to be doable.
      
      Let's stop pretending that pages in page cache are special.  They are
      not.
      
      The changes are pretty straight-forward:
      
       - <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
      
       - <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
      
       - PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN};
      
       - page_cache_get() -> get_page();
      
       - page_cache_release() -> put_page();
      
      This patch contains automated changes generated with coccinelle using
      script below.  For some reason, coccinelle doesn't patch header files.
      I've called spatch for them manually.
      
      The only adjustment after coccinelle is revert of changes to
      PAGE_CAHCE_ALIGN definition: we are going to drop it later.
      
      There are few places in the code where coccinelle didn't reach.  I'll
      fix them manually in a separate patch.  Comments and documentation also
      will be addressed with the separate patch.
      
      virtual patch
      
      @@
      expression E;
      @@
      - E << (PAGE_CACHE_SHIFT - PAGE_SHIFT)
      + E
      
      @@
      expression E;
      @@
      - E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT)
      + E
      
      @@
      @@
      - PAGE_CACHE_SHIFT
      + PAGE_SHIFT
      
      @@
      @@
      - PAGE_CACHE_SIZE
      + PAGE_SIZE
      
      @@
      @@
      - PAGE_CACHE_MASK
      + PAGE_MASK
      
      @@
      expression E;
      @@
      - PAGE_CACHE_ALIGN(E)
      + PAGE_ALIGN(E)
      
      @@
      expression E;
      @@
      - page_cache_get(E)
      + get_page(E)
      
      @@
      expression E;
      @@
      - page_cache_release(E)
      + put_page(E)
      Signed-off-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
      Acked-by: default avatarMichal Hocko <mhocko@suse.com>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      09cbfeaf
  4. 24 Feb, 2012 1 commit
  5. 03 Feb, 2012 1 commit
  6. 31 Mar, 2011 1 commit
  7. 31 Jan, 2011 1 commit
    • Anton Altaparmakov's avatar
      NTFS: Fix invalid pointer dereference in ntfs_mft_record_alloc(). · af5eb745
      Anton Altaparmakov authored
      In ntfs_mft_record_alloc() when mapping the new extent mft record with
      map_extent_mft_record() we overwrite @m with the return value and on
      error, we then try to use the old @m but that is no longer there as @m
      now contains an error code instead so we crash when dereferencing the
      error code as if it were a pointer.
      
      The simple fix is to use a temporary variable to store the return value
      thus preserving the original @m for later use.  This is a backport from
      the commercial Tuxera-NTFS driver and is well tested...
      
      Thanks go to Julia Lawall for pointing this out (whilst I had fixed it
      in the commercial driver I had failed to fix it in the Linux kernel).
      Signed-off-by: default avatarAnton Altaparmakov <anton@tuxera.com>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      af5eb745
  8. 30 Mar, 2010 1 commit
    • Tejun Heo's avatar
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking... · 5a0e3ad6
      Tejun Heo authored
      include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
      
      percpu.h is included by sched.h and module.h and thus ends up being
      included when building most .c files.  percpu.h includes slab.h which
      in turn includes gfp.h making everything defined by the two files
      universally available and complicating inclusion dependencies.
      
      percpu.h -> slab.h dependency is about to be removed.  Prepare for
      this change by updating users of gfp and slab facilities include those
      headers directly instead of assuming availability.  As this conversion
      needs to touch large number of source files, the following script is
      used as the basis of conversion.
      
        http://userweb.kernel.org/~tj/misc/slabh-sweep.py
      
      The script does the followings.
      
      * Scan files for gfp and slab usages and update includes such that
        only the necessary includes are there.  ie. if only gfp is used,
        gfp.h, if slab is used, slab.h.
      
      * When the script inserts a new include, it looks at the include
        blocks and try to put the new include such that its order conforms
        to its surrounding.  It's put in the include block which contains
        core kernel includes, in the same order that the rest are ordered -
        alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
        doesn't seem to be any matching order.
      
      * If the script can't find a place to put a new include (mostly
        because the file doesn't have fitting include block), it prints out
        an error message indicating which .h file needs to be added to the
        file.
      
      The conversion was done in the following steps.
      
      1. The initial automatic conversion of all .c files updated slightly
         over 4000 files, deleting around 700 includes and adding ~480 gfp.h
         and ~3000 slab.h inclusions.  The script emitted errors for ~400
         files.
      
      2. Each error was manually checked.  Some didn't need the inclusion,
         some needed manual addition while adding it to implementation .h or
         embedding .c file was more appropriate for others.  This step added
         inclusions to around 150 files.
      
      3. The script was run again and the output was compared to the edits
         from #2 to make sure no file was left behind.
      
      4. Several build tests were done and a couple of problems were fixed.
         e.g. lib/decompress_*.c used malloc/free() wrappers around slab
         APIs requiring slab.h to be added manually.
      
      5. The script was run on all .h files but without automatically
         editing them as sprinkling gfp.h and slab.h inclusions around .h
         files could easily lead to inclusion dependency hell.  Most gfp.h
         inclusion directives were ignored as stuff from gfp.h was usually
         wildly available and often used in preprocessor macros.  Each
         slab.h inclusion directive was examined and added manually as
         necessary.
      
      6. percpu.h was updated not to include slab.h.
      
      7. Build test were done on the following configurations and failures
         were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
         distributed build env didn't work with gcov compiles) and a few
         more options had to be turned off depending on archs to make things
         build (like ipr on powerpc/64 which failed due to missing writeq).
      
         * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
         * powerpc and powerpc64 SMP allmodconfig
         * sparc and sparc64 SMP allmodconfig
         * ia64 SMP allmodconfig
         * s390 SMP allmodconfig
         * alpha SMP allmodconfig
         * um on x86_64 SMP allmodconfig
      
      8. percpu.h modifications were reverted so that it could be applied as
         a separate patch and serve as bisection point.
      
      Given the fact that I had only a couple of failures from tests on step
      6, I'm fairly confident about the coverage of this conversion patch.
      If there is a breakage, it's likely to be something in one of the arch
      headers which should be easily discoverable easily on most builds of
      the specific arch.
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Guess-its-ok-by: default avatarChristoph Lameter <cl@linux-foundation.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
      5a0e3ad6
  9. 14 Sep, 2009 1 commit
    • Jan Kara's avatar
      ntfs: Use new syncing helpers and update comments · ebbbf757
      Jan Kara authored
      Use new syncing helpers in .write and .aio_write functions. Also
      remove superfluous syncing in ntfs_file_buffered_write() and update
      comments about generic_osync_inode().
      
      CC: Anton Altaparmakov <aia21@cantab.net>
      CC: linux-ntfs-dev@lists.sourceforge.net
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      ebbbf757
  10. 01 Apr, 2009 1 commit
  11. 05 Aug, 2008 1 commit
  12. 29 Apr, 2008 1 commit
  13. 01 Oct, 2006 1 commit
  14. 27 Sep, 2006 2 commits
  15. 26 Mar, 2006 1 commit
  16. 23 Mar, 2006 3 commits
  17. 24 Feb, 2006 1 commit
  18. 04 Oct, 2005 4 commits
  19. 23 Sep, 2005 1 commit
  20. 08 Sep, 2005 2 commits
  21. 16 Aug, 2005 1 commit
  22. 26 Jun, 2005 1 commit
    • Anton Altaparmakov's avatar
      NTFS: Fix a nasty deadlock that appeared in recent kernels. · ba6d2377
      Anton Altaparmakov authored
            The situation: VFS inode X on a mounted ntfs volume is dirty.  For
            same inode X, the ntfs_inode is dirty and thus corresponding on-disk
            inode, i.e. mft record, which is in a dirty PAGE_CACHE_PAGE belonging
            to the table of inodes, i.e. $MFT, inode 0.
            What happens:
            Process 1: sys_sync()/umount()/whatever...  calls
            __sync_single_inode() for $MFT -> do_writepages() -> write_page for
            the dirty page containing the on-disk inode X, the page is now locked
            -> ntfs_write_mst_block() which clears PageUptodate() on the page to
            prevent anyone else getting hold of it whilst it does the write out.
            This is necessary as the on-disk inode needs "fixups" applied before
            the write to disk which are removed again after the write and
            PageUptodate is then set again.  It then analyses the page looking
            for dirty on-disk inodes and when it finds one it calls
            ntfs_may_write_mft_record() to see if it is safe to write this
            on-disk inode.  This then calls ilookup5() to check if the
            corresponding VFS inode is in icache().  This in turn calls ifind()
            which waits on the inode lock via wait_on_inode whilst holding the
            global inode_lock.
            Process 2: pdflush results in a call to __sync_single_inode for the
            same VFS inode X on the ntfs volume.  This locks the inode (I_LOCK)
            then calls write-inode -> ntfs_write_inode -> map_mft_record() ->
            read_cache_page() for the page (in page cache of table of inodes
            $MFT, inode 0) containing the on-disk inode.  This page has
            PageUptodate() clear because of Process 1 (see above) so
            read_cache_page() blocks when it tries to take the page lock for the
            page so it can call ntfs_read_page().
            Thus Process 1 is holding the page lock on the page containing the
            on-disk inode X and it is waiting on the inode X to be unlocked in
            ifind() so it can write the page out and then unlock the page.
            And Process 2 is holding the inode lock on inode X and is waiting for
            the page to be unlocked so it can call ntfs_readpage() or discover
            that Process 1 set PageUptodate() again and use the page.
            Thus we have a deadlock due to ifind() waiting on the inode lock.
            The solution: The fix is to use the newly introduced
            ilookup5_nowait() which does not wait on the inode's lock and hence
            avoids the deadlock.  This is safe as we do not care about the VFS
            inode and only use the fact that it is in the VFS inode cache and the
            fact that the vfs and ntfs inodes are one struct in memory to find
            the ntfs inode in memory if present.  Also, the ntfs inode has its
            own locking so it does not matter if the vfs inode is locked.
      Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
      ba6d2377
  23. 25 Jun, 2005 1 commit
  24. 05 May, 2005 5 commits
  25. 16 Apr, 2005 1 commit
    • Linus Torvalds's avatar
      Linux-2.6.12-rc2 · 1da177e4
      Linus Torvalds authored
      Initial git repository build. I'm not bothering with the full history,
      even though we have it. We can create a separate "historical" git
      archive of that later if we want to, and in the meantime it's about
      3.2GB when imported into git - space that would just make the early
      git days unnecessarily complicated, when we don't have a lot of good
      infrastructure for it.
      
      Let it rip!
      1da177e4