aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd/commit.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jbd/commit.c')
-rw-r--r--fs/jbd/commit.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c
index 4bd882548c45..28a9ddaa0c49 100644
--- a/fs/jbd/commit.c
+++ b/fs/jbd/commit.c
@@ -17,7 +17,6 @@
17#include <linux/fs.h> 17#include <linux/fs.h>
18#include <linux/jbd.h> 18#include <linux/jbd.h>
19#include <linux/errno.h> 19#include <linux/errno.h>
20#include <linux/slab.h>
21#include <linux/mm.h> 20#include <linux/mm.h>
22#include <linux/pagemap.h> 21#include <linux/pagemap.h>
23#include <linux/bio.h> 22#include <linux/bio.h>
@@ -787,6 +786,12 @@ wait_for_iobuf:
787 786
788 jbd_debug(3, "JBD: commit phase 6\n"); 787 jbd_debug(3, "JBD: commit phase 6\n");
789 788
789 /* All metadata is written, now write commit record and do cleanup */
790 spin_lock(&journal->j_state_lock);
791 J_ASSERT(commit_transaction->t_state == T_COMMIT);
792 commit_transaction->t_state = T_COMMIT_RECORD;
793 spin_unlock(&journal->j_state_lock);
794
790 if (journal_write_commit_record(journal, commit_transaction)) 795 if (journal_write_commit_record(journal, commit_transaction))
791 err = -EIO; 796 err = -EIO;
792 797
@@ -862,12 +867,12 @@ restart_loop:
862 /* A buffer which has been freed while still being 867 /* A buffer which has been freed while still being
863 * journaled by a previous transaction may end up still 868 * journaled by a previous transaction may end up still
864 * being dirty here, but we want to avoid writing back 869 * being dirty here, but we want to avoid writing back
865 * that buffer in the future now that the last use has 870 * that buffer in the future after the "add to orphan"
866 * been committed. That's not only a performance gain, 871 * operation been committed, That's not only a performance
867 * it also stops aliasing problems if the buffer is left 872 * gain, it also stops aliasing problems if the buffer is
868 * behind for writeback and gets reallocated for another 873 * left behind for writeback and gets reallocated for another
869 * use in a different page. */ 874 * use in a different page. */
870 if (buffer_freed(bh)) { 875 if (buffer_freed(bh) && !jh->b_next_transaction) {
871 clear_buffer_freed(bh); 876 clear_buffer_freed(bh);
872 clear_buffer_jbddirty(bh); 877 clear_buffer_jbddirty(bh);
873 } 878 }
@@ -924,7 +929,7 @@ restart_loop:
924 929
925 jbd_debug(3, "JBD: commit phase 8\n"); 930 jbd_debug(3, "JBD: commit phase 8\n");
926 931
927 J_ASSERT(commit_transaction->t_state == T_COMMIT); 932 J_ASSERT(commit_transaction->t_state == T_COMMIT_RECORD);
928 933
929 commit_transaction->t_state = T_FINISHED; 934 commit_transaction->t_state = T_FINISHED;
930 J_ASSERT(commit_transaction == journal->j_committing_transaction); 935 J_ASSERT(commit_transaction == journal->j_committing_transaction);