]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 25 Apr 2010 17:01:51 +0000 (10:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 25 Apr 2010 17:01:51 +0000 (10:01 -0700)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
  ext4: Issue the discard operation *before* releasing the blocks to be reused
  ext4: Fix buffer head leaks after calls to ext4_get_inode_loc()
  ext4: Fix possible lost inode write in no journal mode

1  2 
fs/ext4/inode.c
fs/ext4/mballoc.c

diff --combined fs/ext4/inode.c
index 5381802d60523417b25b5885ee90f097e0a23575,ba1eee847e32118b91693da17e64a2f901ab22e0..81d605412844895c4386c92c0f4920db39acbd94
@@@ -39,7 -39,6 +39,7 @@@
  #include <linux/bio.h>
  #include <linux/workqueue.h>
  #include <linux/kernel.h>
 +#include <linux/slab.h>
  
  #include "ext4_jbd2.h"
  #include "xattr.h"
@@@ -5375,7 -5374,7 +5375,7 @@@ int ext4_write_inode(struct inode *inod
        } else {
                struct ext4_iloc iloc;
  
-               err = ext4_get_inode_loc(inode, &iloc);
+               err = __ext4_get_inode_loc(inode, &iloc, 0);
                if (err)
                        return err;
                if (wbc->sync_mode == WB_SYNC_ALL)
                                   (unsigned long long)iloc.bh->b_blocknr);
                        err = -EIO;
                }
+               brelse(iloc.bh);
        }
        return err;
  }
diff --combined fs/ext4/mballoc.c
index bde9d0b170c2a09dfec9f8d81b6ffe9406c9f384,e5ab41b559c06549003dc8ccf4b400af8fa754c0..b423a364dca3c16cf8268861f3107f275c32474e
@@@ -23,7 -23,6 +23,7 @@@
  
  #include "mballoc.h"
  #include <linux/debugfs.h>
 +#include <linux/slab.h>
  #include <trace/events/ext4.h>
  
  /*
@@@ -2535,6 -2534,17 +2535,17 @@@ static void release_blocks_on_commit(jo
                mb_debug(1, "gonna free %u blocks in group %u (0x%p):",
                         entry->count, entry->group, entry);
  
+               if (test_opt(sb, DISCARD)) {
+                       ext4_fsblk_t discard_block;
+                       discard_block = entry->start_blk +
+                               ext4_group_first_block_no(sb, entry->group);
+                       trace_ext4_discard_blocks(sb,
+                                       (unsigned long long)discard_block,
+                                       entry->count);
+                       sb_issue_discard(sb, discard_block, entry->count);
+               }
                err = ext4_mb_load_buddy(sb, entry->group, &e4b);
                /* we expect to find existing buddy because it's pinned */
                BUG_ON(err != 0);
                        page_cache_release(e4b.bd_bitmap_page);
                }
                ext4_unlock_group(sb, entry->group);
-               if (test_opt(sb, DISCARD)) {
-                       ext4_fsblk_t discard_block;
-                       discard_block = entry->start_blk +
-                               ext4_group_first_block_no(sb, entry->group);
-                       trace_ext4_discard_blocks(sb,
-                                       (unsigned long long)discard_block,
-                                       entry->count);
-                       sb_issue_discard(sb, discard_block, entry->count);
-               }
                kmem_cache_free(ext4_free_ext_cachep, entry);
                ext4_mb_release_desc(&e4b);
        }