summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2008-10-10 20:13:31 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-10-10 20:13:31 -0400
commita1aebc1e2da9a7bee4ff8cce510b08f469d1929e (patch)
treeb16ea9325a9a6edd0ce66ea20bc3e0b25236a897
parentc894058d66637c7720569fbe12957f4de64d9991 (diff)
downloadop-kernel-dev-a1aebc1e2da9a7bee4ff8cce510b08f469d1929e.zip
op-kernel-dev-a1aebc1e2da9a7bee4ff8cce510b08f469d1929e.tar.gz
ext4: Don't reuse released data blocks until transaction commits
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>
-rw-r--r--fs/ext4/balloc.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
index bd2ece2..b9821be 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -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;
OpenPOWER on IntegriCloud