diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-10-13 05:05:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-13 05:05:51 -0400 |
commit | accba5f3965d6a9d1bf7c1e1a7995d17e9d521b6 (patch) | |
tree | 8fb40782e79472ed882ff2098d4dd295557278ee /fs/jbd2/commit.c | |
parent | 6852fd9b86d05063c6ef49d2e12e061cc7f6a105 (diff) | |
parent | 4480f15b3306f43bbb0310d461142b4e897ca45b (diff) |
Merge branch 'linus' into oprofile-v2
Conflicts:
arch/x86/kernel/apic_32.c
arch/x86/oprofile/nmi_int.c
include/linux/pci_ids.h
Diffstat (limited to 'fs/jbd2/commit.c')
-rw-r--r-- | fs/jbd2/commit.c | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index f8b3be873226..0abe02c4242a 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> |
@@ -67,7 +68,7 @@ static void release_buffer_page(struct buffer_head *bh) | |||
67 | goto nope; | 68 | goto nope; |
68 | 69 | ||
69 | /* OK, it's a truncated page */ | 70 | /* OK, it's a truncated page */ |
70 | if (TestSetPageLocked(page)) | 71 | if (!trylock_page(page)) |
71 | goto nope; | 72 | goto nope; |
72 | 73 | ||
73 | page_cache_get(page); | 74 | page_cache_get(page); |
@@ -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; |
@@ -262,8 +259,18 @@ static int journal_finish_inode_data_buffers(journal_t *journal, | |||
262 | jinode->i_flags |= JI_COMMIT_RUNNING; | 259 | jinode->i_flags |= JI_COMMIT_RUNNING; |
263 | spin_unlock(&journal->j_list_lock); | 260 | spin_unlock(&journal->j_list_lock); |
264 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); | 261 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); |
265 | if (!ret) | 262 | if (err) { |
266 | ret = err; | 263 | /* |
264 | * Because AS_EIO is cleared by | ||
265 | * wait_on_page_writeback_range(), set it again so | ||
266 | * that user process can get -EIO from fsync(). | ||
267 | */ | ||
268 | set_bit(AS_EIO, | ||
269 | &jinode->i_vfs_inode->i_mapping->flags); | ||
270 | |||
271 | if (!ret) | ||
272 | ret = err; | ||
273 | } | ||
267 | spin_lock(&journal->j_list_lock); | 274 | spin_lock(&journal->j_list_lock); |
268 | jinode->i_flags &= ~JI_COMMIT_RUNNING; | 275 | jinode->i_flags &= ~JI_COMMIT_RUNNING; |
269 | wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); | 276 | wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); |
@@ -361,6 +368,8 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
361 | commit_transaction = journal->j_running_transaction; | 368 | commit_transaction = journal->j_running_transaction; |
362 | J_ASSERT(commit_transaction->t_state == T_RUNNING); | 369 | J_ASSERT(commit_transaction->t_state == T_RUNNING); |
363 | 370 | ||
371 | trace_mark(jbd2_start_commit, "dev %s transaction %d", | ||
372 | journal->j_devname, commit_transaction->t_tid); | ||
364 | jbd_debug(1, "JBD: starting commit of transaction %d\n", | 373 | jbd_debug(1, "JBD: starting commit of transaction %d\n", |
365 | commit_transaction->t_tid); | 374 | commit_transaction->t_tid); |
366 | 375 | ||
@@ -495,9 +504,10 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
495 | jh = commit_transaction->t_buffers; | 504 | jh = commit_transaction->t_buffers; |
496 | 505 | ||
497 | /* 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 |
498 | release it for background writing. */ | 507 | release it. */ |
499 | 508 | ||
500 | if (is_journal_aborted(journal)) { | 509 | if (is_journal_aborted(journal)) { |
510 | clear_buffer_jbddirty(jh2bh(jh)); | ||
501 | JBUFFER_TRACE(jh, "journal is aborting: refile"); | 511 | JBUFFER_TRACE(jh, "journal is aborting: refile"); |
502 | jbd2_journal_refile_buffer(journal, jh); | 512 | jbd2_journal_refile_buffer(journal, jh); |
503 | /* If that was the last one, we need to clean up | 513 | /* If that was the last one, we need to clean up |
@@ -670,8 +680,14 @@ start_journal_io: | |||
670 | * commit block, which happens below in such setting. | 680 | * commit block, which happens below in such setting. |
671 | */ | 681 | */ |
672 | err = journal_finish_inode_data_buffers(journal, commit_transaction); | 682 | err = journal_finish_inode_data_buffers(journal, commit_transaction); |
673 | if (err) | 683 | if (err) { |
674 | jbd2_journal_abort(journal, err); | 684 | printk(KERN_WARNING |
685 | "JBD2: Detected IO errors while flushing file data " | ||
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; | ||
690 | } | ||
675 | 691 | ||
676 | /* Lo and behold: we have just managed to send a transaction to | 692 | /* Lo and behold: we have just managed to send a transaction to |
677 | the log. Before we can commit it, wait for the IO so far to | 693 | the log. Before we can commit it, wait for the IO so far to |
@@ -770,6 +786,9 @@ wait_for_iobuf: | |||
770 | /* AKPM: bforget here */ | 786 | /* AKPM: bforget here */ |
771 | } | 787 | } |
772 | 788 | ||
789 | if (err) | ||
790 | jbd2_journal_abort(journal, err); | ||
791 | |||
773 | jbd_debug(3, "JBD: commit phase 5\n"); | 792 | jbd_debug(3, "JBD: commit phase 5\n"); |
774 | 793 | ||
775 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, | 794 | if (!JBD2_HAS_INCOMPAT_FEATURE(journal, |
@@ -868,6 +887,8 @@ restart_loop: | |||
868 | if (buffer_jbddirty(bh)) { | 887 | if (buffer_jbddirty(bh)) { |
869 | JBUFFER_TRACE(jh, "add to new checkpointing trans"); | 888 | JBUFFER_TRACE(jh, "add to new checkpointing trans"); |
870 | __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); | ||
871 | JBUFFER_TRACE(jh, "refile for checkpoint writeback"); | 892 | JBUFFER_TRACE(jh, "refile for checkpoint writeback"); |
872 | __jbd2_journal_refile_buffer(jh); | 893 | __jbd2_journal_refile_buffer(jh); |
873 | jbd_unlock_bh_state(bh); | 894 | jbd_unlock_bh_state(bh); |
@@ -974,6 +995,9 @@ restart_loop: | |||
974 | } | 995 | } |
975 | spin_unlock(&journal->j_list_lock); | 996 | spin_unlock(&journal->j_list_lock); |
976 | 997 | ||
998 | trace_mark(jbd2_end_commit, "dev %s transaction %d head %d", | ||
999 | journal->j_devname, commit_transaction->t_tid, | ||
1000 | journal->j_tail_sequence); | ||
977 | jbd_debug(1, "JBD: commit %d complete, head %d\n", | 1001 | jbd_debug(1, "JBD: commit %d complete, head %d\n", |
978 | journal->j_commit_sequence, journal->j_tail_sequence); | 1002 | journal->j_commit_sequence, journal->j_tail_sequence); |
979 | 1003 | ||