From 353cf6e4f995e8c146ce7d8024c33244e0757f95 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 5 Aug 2010 12:38:26 +0200 Subject: [PATCH] --- yaml --- r: 206285 b: refs/heads/master c: 5f11e6a44059f728dddd8d0dbe5b4368ea93575b h: refs/heads/master i: 206283: b4c70818d440b25a83710288edeb177513c25283 v: v3 --- [refs] | 2 +- trunk/fs/ext3/inode.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index e1492950b6b3..11f126c13b9b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: aa32a796389bedbcf1c7714385b18714a0743810 +refs/heads/master: 5f11e6a44059f728dddd8d0dbe5b4368ea93575b diff --git a/trunk/fs/ext3/inode.c b/trunk/fs/ext3/inode.c index 436e5bbccbc2..001eb0e2d48e 100644 --- a/trunk/fs/ext3/inode.c +++ b/trunk/fs/ext3/inode.c @@ -1149,9 +1149,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 ext3_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 = ext3_journal_get_write_access(handle, bh); + if (!ret && dirty) + ret = ext3_journal_dirty_metadata(handle, bh); + return ret; } /*