From ec558fb0ba24b2de14dd76484de6f1c7724a5a16 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 5 Aug 2010 14:41:42 -0400 Subject: [PATCH] --- yaml --- r: 206325 b: refs/heads/master c: 56d35a4cd13e7bc5eca5b2dba5a41794afb17e11 h: refs/heads/master i: 206323: f1c24585f765ccdbabc3a602cfde8f1f183d4ef5 v: v3 --- [refs] | 2 +- trunk/fs/ext4/inode.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 4fa841959c85..287b7e7dbcce 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0cfc9255a1efb0467de2162950197750570ecec0 +refs/heads/master: 56d35a4cd13e7bc5eca5b2dba5a41794afb17e11 diff --git a/trunk/fs/ext4/inode.c b/trunk/fs/ext4/inode.c index ab2247d642c6..a0ab3754d0d6 100644 --- a/trunk/fs/ext4/inode.c +++ b/trunk/fs/ext4/inode.c @@ -1527,9 +1527,25 @@ static int walk_page_buffers(handle_t *handle, static int do_journal_get_write_access(handle_t *handle, struct buffer_head *bh) { + int dirty = buffer_dirty(bh); + int ret; + if (!buffer_mapped(bh) || buffer_freed(bh)) return 0; - return ext4_journal_get_write_access(handle, bh); + /* + * __block_prepare_write() could have dirtied some buffers. Clean + * the dirty bit as jbd2_journal_get_write_access() could complain + * otherwise about fs integrity issues. Setting of the dirty bit + * by __block_prepare_write() isn't a real problem here as we clear + * the bit before releasing a page lock and thus writeback cannot + * ever write the buffer. + */ + if (dirty) + clear_buffer_dirty(bh); + ret = ext4_journal_get_write_access(handle, bh); + if (!ret && dirty) + ret = ext4_handle_dirty_metadata(handle, NULL, bh); + return ret; } /*