ext4: Don't reuse released data blocks until transaction commits
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Sat, 11 Oct 2008 00:13:31 +0000 (20:13 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 11 Oct 2008 00:13:31 +0000 (20:13 -0400)
We need to make sure we don't reuse the data blocks released
during the transaction untill the transaction commits. We force
this mode only for ordered and journalled mode. Writeback mode
already don't provided data consistency.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/balloc.c

index bd2ece22882755b02599563a1bee89c5b10d2b87..b9821be709bddb000077b9a4b15efe34e9392bd0 100644 (file)
@@ -568,8 +568,16 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
 
        /* this isn't the right place to decide whether block is metadata
         * inode.c/extents.c knows better, but for safety ... */
-       if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode) ||
-                       ext4_should_journal_data(inode))
+       if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
+               metadata = 1;
+
+       /* We need to make sure we don't reuse
+        * block released untill the transaction commit.
+        * writeback mode have weak data consistency so
+        * don't force data as metadata when freeing block
+        * for writeback mode.
+        */
+       if (metadata == 0 && !ext4_should_writeback_data(inode))
                metadata = 1;
 
        sb = inode->i_sb;