diff options
Diffstat (limited to 'fs/jbd2/commit.c')
| -rw-r--r-- | fs/jbd2/commit.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index f2ad061e95e..8b119e16aa3 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/time.h> | 16 | #include <linux/time.h> |
| 17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
| 18 | #include <linux/jbd2.h> | 18 | #include <linux/jbd2.h> |
| 19 | #include <linux/marker.h> | ||
| 19 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
| 20 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| 21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
| @@ -126,8 +127,7 @@ static int journal_submit_commit_record(journal_t *journal, | |||
| 126 | 127 | ||
| 127 | JBUFFER_TRACE(descriptor, "submit commit block"); | 128 | JBUFFER_TRACE(descriptor, "submit commit block"); |
| 128 | lock_buffer(bh); | 129 | lock_buffer(bh); |
| 129 | get_bh(bh); | 130 | clear_buffer_dirty(bh); |
| 130 | set_buffer_dirty(bh); | ||
| 131 | set_buffer_uptodate(bh); | 131 | set_buffer_uptodate(bh); |
| 132 | bh->b_end_io = journal_end_buffer_io_sync; | 132 | bh->b_end_io = journal_end_buffer_io_sync; |
| 133 | 133 | ||
| @@ -147,12 +147,9 @@ static int journal_submit_commit_record(journal_t *journal, | |||
| 147 | * to remember if we sent a barrier request | 147 | * to remember if we sent a barrier request |
| 148 | */ | 148 | */ |
| 149 | if (ret == -EOPNOTSUPP && barrier_done) { | 149 | if (ret == -EOPNOTSUPP && barrier_done) { |
| 150 | char b[BDEVNAME_SIZE]; | ||
| 151 | |||
| 152 | printk(KERN_WARNING | 150 | printk(KERN_WARNING |
| 153 | "JBD: barrier-based sync failed on %s - " | 151 | "JBD: barrier-based sync failed on %s - " |
| 154 | "disabling barriers\n", | 152 | "disabling barriers\n", journal->j_devname); |
| 155 | bdevname(journal->j_dev, b)); | ||
| 156 | spin_lock(&journal->j_state_lock); | 153 | spin_lock(&journal->j_state_lock); |
| 157 | journal->j_flags &= ~JBD2_BARRIER; | 154 | journal->j_flags &= ~JBD2_BARRIER; |
| 158 | spin_unlock(&journal->j_state_lock); | 155 | spin_unlock(&journal->j_state_lock); |
| @@ -160,7 +157,7 @@ static int journal_submit_commit_record(journal_t *journal, | |||
| 160 | /* And try again, without the barrier */ | 157 | /* And try again, without the barrier */ |
| 161 | lock_buffer(bh); | 158 | lock_buffer(bh); |
| 162 | set_buffer_uptodate(bh); | 159 | set_buffer_uptodate(bh); |
| 163 | set_buffer_dirty(bh); | 160 | clear_buffer_dirty(bh); |
| 164 | ret = submit_bh(WRITE, bh); | 161 | ret = submit_bh(WRITE, bh); |
| 165 | } | 162 | } |
| 166 | *cbh = bh; | 163 | *cbh = bh; |
| @@ -371,6 +368,8 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
| 371 | commit_transaction = journal->j_running_transaction; | 368 | commit_transaction = journal->j_running_transaction; |
| 372 | J_ASSERT(commit_transaction->t_state == T_RUNNING); | 369 | J_ASSERT(commit_transaction->t_state == T_RUNNING); |
| 373 | 370 | ||
| 371 | trace_mark(jbd2_start_commit, "dev %s transaction %d", | ||
| 372 | journal->j_devname, commit_transaction->t_tid); | ||
| 374 | jbd_debug(1, "JBD: starting commit of transaction %d\n", | 373 | jbd_debug(1, "JBD: starting commit of transaction %d\n", |
| 375 | commit_transaction->t_tid); | 374 | commit_transaction->t_tid); |
| 376 | 375 | ||
| @@ -505,9 +504,10 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
| 505 | jh = commit_transaction->t_buffers; | 504 | jh = commit_transaction->t_buffers; |
| 506 | 505 | ||
| 507 | /* If we're in abort mode, we just un-journal the buffer and | 506 | /* If we're in abort mode, we just un-journal the buffer and |
| 508 | release it for background writing. */ | 507 | release it. */ |
| 509 | 508 | ||
| 510 | if (is_journal_aborted(journal)) { | 509 | if (is_journal_aborted(journal)) { |
| 510 | clear_buffer_jbddirty(jh2bh(jh)); | ||
| 511 | JBUFFER_TRACE(jh, "journal is aborting: refile"); | 511 | JBUFFER_TRACE(jh, "journal is aborting: refile"); |
| 512 | jbd2_journal_refile_buffer(journal, jh); | 512 | jbd2_journal_refile_buffer(journal, jh); |
| 513 | /* If that was the last one, we need to clean up | 513 | /* If that was the last one, we need to clean up |
| @@ -681,11 +681,11 @@ start_journal_io: | |||
| 681 | */ | 681 | */ |
| 682 | err = journal_finish_inode_data_buffers(journal, commit_transaction); | 682 | err = journal_finish_inode_data_buffers(journal, commit_transaction); |
| 683 | if (err) { | 683 | if (err) { |
| 684 | char b[BDEVNAME_SIZE]; | ||
| 685 | |||
| 686 | printk(KERN_WARNING | 684 | printk(KERN_WARNING |
| 687 | "JBD2: Detected IO errors while flushing file data " | 685 | "JBD2: Detected IO errors while flushing file data " |
| 688 | "on %s\n", bdevname(journal->j_fs_dev, b)); | 686 | "on %s\n", journal->j_devname); |
| 687 | if (journal->j_flags & JBD2_ABORT_ON_SYNCDATA_ERR) | ||
| 688 | jbd2_journal_abort(journal, err); | ||
| 689 | err = 0; | 689 | err = 0; |
| 690 | } | 690 | } |
| 691 | 691 | ||
| @@ -786,6 +786,9 @@ wait_for_iobuf: | |||
| 786 | /* AKPM: bforget here */ | 786 | /* AKPM: bforget here */ |
| 787 | } | 787 | } |
| 788 | 788 | ||
| 789 | if (err) | ||
| 790 | jbd2_journal_abort(journal, err); | ||
| 791 | |||
| 789 | jbd_debug(3, "JBD: commit phase 5\n"); | 792 | jbd_debug(3, "JBD: commit phase 5\n"); |
| 790 | 793 | ||
| 791 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, | 794 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, |
| @@ -884,6 +887,8 @@ restart_loop: | |||
| 884 | if (buffer_jbddirty(bh)) { | 887 | if (buffer_jbddirty(bh)) { |
| 885 | JBUFFER_TRACE(jh, "add to new checkpointing trans"); | 888 | JBUFFER_TRACE(jh, "add to new checkpointing trans"); |
| 886 | __jbd2_journal_insert_checkpoint(jh, commit_transaction); | 889 | __jbd2_journal_insert_checkpoint(jh, commit_transaction); |
| 890 | if (is_journal_aborted(journal)) | ||
| 891 | clear_buffer_jbddirty(bh); | ||
| 887 | JBUFFER_TRACE(jh, "refile for checkpoint writeback"); | 892 | JBUFFER_TRACE(jh, "refile for checkpoint writeback"); |
| 888 | __jbd2_journal_refile_buffer(jh); | 893 | __jbd2_journal_refile_buffer(jh); |
| 889 | jbd_unlock_bh_state(bh); | 894 | jbd_unlock_bh_state(bh); |
| @@ -990,6 +995,12 @@ restart_loop: | |||
| 990 | } | 995 | } |
| 991 | spin_unlock(&journal->j_list_lock); | 996 | spin_unlock(&journal->j_list_lock); |
| 992 | 997 | ||
| 998 | if (journal->j_commit_callback) | ||
| 999 | journal->j_commit_callback(journal, commit_transaction); | ||
| 1000 | |||
| 1001 | trace_mark(jbd2_end_commit, "dev %s transaction %d head %d", | ||
| 1002 | journal->j_devname, commit_transaction->t_tid, | ||
| 1003 | journal->j_tail_sequence); | ||
| 993 | jbd_debug(1, "JBD: commit %d complete, head %d\n", | 1004 | jbd_debug(1, "JBD: commit %d complete, head %d\n", |
| 994 | journal->j_commit_sequence, journal->j_tail_sequence); | 1005 | journal->j_commit_sequence, journal->j_tail_sequence); |
| 995 | 1006 | ||
