1. 09 Jun, 2009 1 commit
  2. 25 May, 2009 2 commits
  3. 18 May, 2009 4 commits
  4. 17 May, 2009 1 commit
    • Theodore Ts'o's avatar
      ext4: Add a comprehensive block validity check to ext4_get_blocks() · 6fd058f7
      Theodore Ts'o authored
      To catch filesystem bugs or corruption which could lead to the
      filesystem getting severly damaged, this patch adds a facility for
      tracking all of the filesystem metadata blocks by contiguous regions
      in a red-black tree.  This allows quick searching of the tree to
      locate extents which might overlap with filesystem metadata blocks.
      
      This facility is also used by the multi-block allocator to assure that
      it is not allocating blocks out of the system zone, as well as by the
      routines used when reading indirect blocks and extents information
      from disk to make sure their contents are valid.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      6fd058f7
  5. 14 May, 2009 2 commits
  6. 12 May, 2009 1 commit
  7. 14 May, 2009 3 commits
    • Theodore Ts'o's avatar
      ext4: Add documentation to the ext4_*get_block* functions · b920c755
      Theodore Ts'o authored
      This adds more documentation to various internal functions in
      fs/ext4/inode.c, most notably ext4_ind_get_blocks(),
      ext4_da_get_block_write(), ext4_da_get_block_prep(),
      ext4_normal_get_block_write().
      
      In addition, the static function ext4_normal_get_block_write() has
      been renamed noalloc_get_block_write(), since it is used in many
      places far beyond ext4_normal_writepage().
      
      Plenty of warnings have been added to the noalloc_get_block_write()
      function, since the way it is used is amazingly fragile.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      b920c755
    • Theodore Ts'o's avatar
      ext4: Define a new set of flags for ext4_get_blocks() · c2177057
      Theodore Ts'o authored
      The functions ext4_get_blocks(), ext4_ext_get_blocks(), and
      ext4_ind_get_blocks() used an ad-hoc set of integer variables used as
      boolean flags passed in as arguments.  Use a single flags parameter
      and a setandard set of bitfield flags instead.  This saves space on
      the call stack, and it also makes the code a bit more understandable.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      c2177057
    • Theodore Ts'o's avatar
      ext4: Rename ext4_get_blocks_wrap() to be ext4_get_blocks() · 12b7ac17
      Theodore Ts'o authored
      Another function rename for clarity's sake.  The _wrap prefix simply
      confuses people, and didn't add much people trying to follow the code
      paths.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      12b7ac17
  8. 12 May, 2009 2 commits
  9. 15 May, 2009 1 commit
  10. 03 May, 2009 1 commit
  11. 02 May, 2009 2 commits
  12. 13 May, 2009 1 commit
  13. 03 May, 2009 1 commit
  14. 02 May, 2009 1 commit
  15. 01 May, 2009 2 commits
  16. 03 May, 2009 1 commit
  17. 01 May, 2009 2 commits
    • Theodore Ts'o's avatar
      ext4: Move the ext4_i.h header file into ext4.h · d444c3c3
      Theodore Ts'o authored
      There is no longer a reason for a separate ext4_i.h header file, so
      move it into ext4.h just to make life easier for developers to find
      the relevant data structures and typedefs.  Should also speed up
      compiles slightly, too.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      d444c3c3
    • Theodore Ts'o's avatar
      ext4: Don't avoid using BLOCK_UNINIT block groups in mballoc · 75507efb
      Theodore Ts'o authored
      By avoiding the use of not-yet-used block groups (i.e., block groups
      with the BLOCK_UNINIT flag), mballoc had a tendency to create large
      files with large non-contiguous gaps.  In addition avoiding the use of
      new block groups had a tendency to push regular file data into the
      first block group in a flex_bg group, which slows down the speed of
      e2fsck pass 2, since it has a tendency to seek much more.  For
      example:
      
                     Before Patch                       After Patch
                    Time in seconds                   Time in seconds
                  Real /  User/  Sys   MB/s      Real /  User/  Sys    MB/s
      Pass 1      8.52 / 2.21 / 0.46  20.43      8.84 / 4.97 / 1.11   19.68
      Pass 2     21.16 / 1.02 / 1.86  11.30      6.54 / 1.77 / 1.78   36.39
      Pass 3      0.01 / 0.00 / 0.00 139.00      0.01 / 0.01 / 0.00  128.90
      Pass 4      0.16 / 0.15 / 0.00   0.00      0.17 / 0.17 / 0.00    0.00
      Pass 5      2.52 / 1.99 / 0.09   0.79      2.31 / 1.78 / 0.06    0.86
      Total      32.40 / 5.11 / 2.49  12.81     17.99 / 8.75 / 2.98   23.01
      
      This was on a sample 80 gig root filesystem which was approximately
      50% full.  Note the improved e2fsck pass 2 performance, by over a
      factor of 3, due to a decreased number of seeks.  (The total amount of
      I/O in pass 2 was unchanged; the layout of the directory blocks was
      simply much better from e2fsck's's perspective.)
      
      Other changes as a result of this patch on this sample filesystem:
      
                                   Before Patch    After Patch
      # of non-contig files           762             779
      # of non-contig directories     571             570
      # of BLOCK_UNINIT bg's          307             293
      # of INODE_UNINIT bg's          503             503
      
      Out of 640 block groups, of which 333 were in use, this patch caused
      an extra 14 block groups to be utilized.  The number of non-contiguous
      files did go up slightly, but when measured against the 99.9% of the
      files (603,154) which were contiguously allocated, this is pretty
      insignificant.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarAndreas Dilger <adilger@sun.com>
      75507efb
  18. 26 Apr, 2009 2 commits
  19. 01 May, 2009 1 commit
    • Theodore Ts'o's avatar
      ext4: ext4_mark_recovery_complete() doesn't need to use lock_super · a63c9eb2
      Theodore Ts'o authored
      The function ext4_mark_recovery_complete() is called from two call
      paths: either (a) while mounting the filesystem, in which case there's
      no danger of any other CPU calling write_super() until the mount is
      completed, and (b) while remounting the filesystem read-write, in
      which case the fs core has already locked the superblock.  This also
      allows us to take out a very vile unlock_super()/lock_super() pair in
      ext4_remount().
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      a63c9eb2
  20. 25 Apr, 2009 1 commit
  21. 01 May, 2009 4 commits
    • Theodore Ts'o's avatar
      ext4: Avoid races caused by on-line resizing and SMP memory reordering · 8df9675f
      Theodore Ts'o authored
      Ext4's on-line resizing adds a new block group and then, only at the
      last step adjusts s_groups_count.  However, it's possible on SMP
      systems that another CPU could see the updated the s_group_count and
      not see the newly initialized data structures for the just-added block
      group.  For this reason, it's important to insert a SMP read barrier
      after reading s_groups_count and before reading any (for example) the
      new block group descriptors allowed by the increased value of
      s_groups_count.
      
      Unfortunately, we rather blatently violate this locking protocol
      documented in fs/ext4/resize.c.  Fortunately, (1) on-line resizes
      happen relatively rarely, and (2) it seems rare that the filesystem
      code will immediately try to use just-added block group before any
      memory ordering issues resolve themselves.  So apparently problems
      here are relatively hard to hit, since ext3 has been vulnerable to the
      same issue for years with no one apparently complaining.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      8df9675f
    • Theodore Ts'o's avatar
      ext4: Use separate super_operations structure for no_journal filesystems · 9ca92389
      Theodore Ts'o authored
      By using a separate super_operations structure for filesystems that
      have and don't have journals, we can simply ext4_write_super() ---
      which is only needed when no journal is present --- and ext4_freeze(),
      ext4_unfreeze(), and ext4_sync_fs(), which are only needed when the
      journal is present.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      9ca92389
    • Theodore Ts'o's avatar
      ext4: Fix and simplify s_dirt handling · 7234ab2a
      Theodore Ts'o authored
      The s_dirt flag wasn't completely handled correctly, but it didn't
      really matter when journalling was enabled.  It turns out that when
      ext4 runs without a journal, we don't clear s_dirt in places where we
      should have, with the result that the high-level write_super()
      function was writing the superblock when it wasn't necessary.
      
      So we fix this by making ext4_commit_super() clear the s_dirt flag,
      and removing many of the other places where s_dirt is manipulated.
      When journalling is enabled, the s_dirt flag might be left set more
      often, but s_dirt really doesn't matter when journalling is enabled.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      7234ab2a
    • Theodore Ts'o's avatar
      ext4: Simplify ext4_commit_super()'s function signature · e2d67052
      Theodore Ts'o authored
      The ext4_commit_super() function took both a struct super_block * and
      a struct ext4_super_block *, but the struct ext4_super_block can be
      derived from the struct super_block.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      e2d67052
  22. 25 Apr, 2009 1 commit
  23. 28 Apr, 2009 1 commit
    • Theodore Ts'o's avatar
      ext4: Fallback to vmalloc if kmalloc can't allocate s_flex_groups array · c5ca7c76
      Theodore Ts'o authored
      For very large filesystems, the s_flex_groups array can get quite big.
      For example, a filesystem that can be resized up to 16TB will have
      8192 flex groups (assuming the default flex_bg size of 16), so the
      array is 96k, which is *very* marginal for kmalloc().  On the other
      hand, a 160GB filesystem without the resize_inode feature will only
      require 960 bytes.  So we try to allocate the array first using
      kmalloc(), and if that fails, we'll try to use vmalloc() instead.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      c5ca7c76
  24. 12 May, 2009 2 commits
    • Aneesh Kumar K.V's avatar
      ext4: Mark the unwritten buffer_head as mapped during write_begin · 29fa89d0
      Aneesh Kumar K.V authored
      Setting BH_Unwritten buffer_heads as BH_Mapped avoids multiple
      (unnecessary) calls to get_block() during the call to the write(2)
      system call.  Setting BH_Unwritten buffer heads as BH_Mapped requires
      that the writepages() functions can handle BH_Unwritten buffer_heads.
      
      After this commit, things work as follows:
      
      ext4_ext_get_block() returns unmapped, unwritten, buffer head when
      called with create = 0 for prealloc space. This makes sure we handle
      the read path and non-delayed allocation case correctly.  Even though
      the buffer head is marked unmapped we have valid b_blocknr and b_bdev
      values in the buffer_head.
      
      ext4_da_get_block_prep() called for block resrevation will now return
      mapped, unwritten, new buffer_head for prealloc space. This avoids
      multiple calls to get_block() for write to same offset. By making such
      buffers as BH_New, we also assure that sub-block zeroing of buffered
      writes happens correctly.
      Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      29fa89d0
    • Aneesh Kumar K.V's avatar
      vfs: Add BUG_ON for delayed and unwritten flags in submit_bh() · 8fb0e342
      Aneesh Kumar K.V authored
      The BH_Delay and BH_Unwritten flags should never leak out to
      submit_bh().  So add some BUG_ON() checks to submit_bh so we can get a
      stack trace and determine how and why this might have happened.
      
      (Note that only XFS and ext4 use these buffer head flags, and XFS does
      not use submit_bh().  So this patch should only modify behavior for
      ext4.)
      Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Cc: linux-fsdevel@vger.kernel.org
      8fb0e342