diff options
Diffstat (limited to 'fs/jbd2/commit.c')
-rw-r--r-- | fs/jbd2/commit.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index f8b3be873226..f2ad061e95ec 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
@@ -67,7 +67,7 @@ static void release_buffer_page(struct buffer_head *bh) | |||
67 | goto nope; | 67 | goto nope; |
68 | 68 | ||
69 | /* OK, it's a truncated page */ | 69 | /* OK, it's a truncated page */ |
70 | if (TestSetPageLocked(page)) | 70 | if (!trylock_page(page)) |
71 | goto nope; | 71 | goto nope; |
72 | 72 | ||
73 | page_cache_get(page); | 73 | page_cache_get(page); |
@@ -262,8 +262,18 @@ static int journal_finish_inode_data_buffers(journal_t *journal, | |||
262 | jinode->i_flags |= JI_COMMIT_RUNNING; | 262 | jinode->i_flags |= JI_COMMIT_RUNNING; |
263 | spin_unlock(&journal->j_list_lock); | 263 | spin_unlock(&journal->j_list_lock); |
264 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); | 264 | err = filemap_fdatawait(jinode->i_vfs_inode->i_mapping); |
265 | if (!ret) | 265 | if (err) { |
266 | ret = err; | 266 | /* |
267 | * Because AS_EIO is cleared by | ||
268 | * wait_on_page_writeback_range(), set it again so | ||
269 | * that user process can get -EIO from fsync(). | ||
270 | */ | ||
271 | set_bit(AS_EIO, | ||
272 | &jinode->i_vfs_inode->i_mapping->flags); | ||
273 | |||
274 | if (!ret) | ||
275 | ret = err; | ||
276 | } | ||
267 | spin_lock(&journal->j_list_lock); | 277 | spin_lock(&journal->j_list_lock); |
268 | jinode->i_flags &= ~JI_COMMIT_RUNNING; | 278 | jinode->i_flags &= ~JI_COMMIT_RUNNING; |
269 | wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); | 279 | wake_up_bit(&jinode->i_flags, __JI_COMMIT_RUNNING); |
@@ -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 | char b[BDEVNAME_SIZE]; |
685 | |||
686 | printk(KERN_WARNING | ||
687 | "JBD2: Detected IO errors while flushing file data " | ||
688 | "on %s\n", bdevname(journal->j_fs_dev, b)); | ||
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 |