aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd2/transaction.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2011-05-24 11:52:40 -0400
committerTheodore Ts'o <tytso@mit.edu>2011-05-24 11:52:40 -0400
commit81be12c8179c1c397d3f179cdd9b3f7146cf47f1 (patch)
treeb535687e88af17fc6b25329decf28563ed519395 /fs/jbd2/transaction.c
parentb221349fa8b45d13c3650089f0514df7d1eb36c3 (diff)
downloadkernel_samsung_smdk4412-81be12c8179c1c397d3f179cdd9b3f7146cf47f1.zip
kernel_samsung_smdk4412-81be12c8179c1c397d3f179cdd9b3f7146cf47f1.tar.gz
kernel_samsung_smdk4412-81be12c8179c1c397d3f179cdd9b3f7146cf47f1.tar.bz2
jbd2: fix sending of data flush on journal commit
In data=ordered mode, it's theoretically possible (however rare) that an inode is filed to transaction's t_inode_list and a flusher thread writes all the data and inode is reclaimed before the transaction starts to commit. In such a case, we could erroneously omit sending a flush to file system device when it is different from the journal device (because data can still be in disk cache only). Fix the problem by setting a flag in a transaction when some inode is added to it and then send disk flush in the commit code when the flag is set. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/jbd2/transaction.c')
-rw-r--r--fs/jbd2/transaction.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index 85a055e..20065c9 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -2147,6 +2147,13 @@ int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode)
jinode->i_next_transaction == transaction)
goto done;
+ /*
+ * We only ever set this variable to 1 so the test is safe. Since
+ * t_need_data_flush is likely to be set, we do the test to save some
+ * cacheline bouncing
+ */
+ if (!transaction->t_need_data_flush)
+ transaction->t_need_data_flush = 1;
/* On some different transaction's list - should be
* the committing one */
if (jinode->i_transaction) {