summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorYongqiang Yang <xiaoqiangnk@gmail.com>2011-12-13 22:29:12 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-21 12:57:44 -0800
commit5da4b53abb4424f4b502a37425ffe4e46a7df5b5 (patch)
treeecf73db8f5d03b80b8c01fe02df468f990543372 /fs
parent8fe5e8ff93473129957c6d4a7df80046186b9c7b (diff)
ext4: handle EOF correctly in ext4_bio_write_page()
commit 5a0dc7365c240795bf190766eba7a27600be3b3e upstream. We need to zero out part of a page which beyond EOF before setting uptodate, otherwise, mapread or write will see non-zero data beyond EOF. Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/page-io.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index bd6a85e33c97..d99d74aca8a7 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -405,6 +405,18 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
block_end = block_start + blocksize;
if (block_start >= len) {
+ /*
+ * Comments copied from block_write_full_page_endio:
+ *
+ * The page straddles i_size. It must be zeroed out on
+ * each and every writepage invocation because it may
+ * be mmapped. "A file is mapped in multiples of the
+ * page size. For a file that is not a multiple of
+ * the page size, the remaining memory is zeroed when
+ * mapped, and writes to that region are not written
+ * out to the file."
+ */
+ zero_user_segment(page, block_start, block_end);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
continue;