2008-11-07 13:12:53

by Aneesh Kumar K.V

[permalink] [raw]
Subject: [PATCH -V2] ext4: Mark the buffer_heads as dirty and uptodate after prepare_write

We need to make sure we mark the buffer_heads as dirty and uptodate
so that block_write_full_page write them correctly.

Signed-off-by: Aneesh Kumar K.V <[email protected]>
---
fs/ext4/inode.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 95d0d12..f9461d7 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2333,6 +2333,15 @@ static int ext4_da_writepage(struct page *page,
ret = block_prepare_write(page, 0, PAGE_CACHE_SIZE,
ext4_normal_get_block_write);
if (!ret) {
+ /*
+ * We mark the buffer_head dirty and uptodate even
+ * if we are not doing a block_write_full_page. This
+ * make sure when writeback see the page again with
+ * buffer_head present the buffer_head would have
+ * the right flags
+ */
+ block_commit_write(page, 0, PAGE_CACHE_SIZE);
+
page_bufs = page_buffers(page);
/* check whether all are mapped and non delay */
if (walk_page_buffers(NULL, page_bufs, 0, len, NULL,
--
1.6.0.3.640.g6331a



2008-11-07 13:33:22

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH -V2] ext4: Mark the buffer_heads as dirty and uptodate after prepare_write

Per discussion on IRC, we've Aneesh and I have concluded that the V1
patch is correct, and in fact calling block_commit_write() when we
will be redirtying the page (a) can cause problems if one or more
buffer heads on the page is marked for delayed allocation and so
bh->block_nr is 0, and (b) wastes disk bandwidth since the page
contents will be potentially written out twice.

So we'll be going with the V1 version of the patch, and pushing it to
Linus ASAP.

- Ted