diff options
Diffstat (limited to 'fs/jbd/commit.c')
-rw-r--r-- | fs/jbd/commit.c | 19 |
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); |