|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/*
|