aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-05-27 12:48:55 -0400
committerTheodore Ts'o <tytso@mit.edu>2014-05-27 12:48:55 -0400
commiteeece469dedadf3918bad50ad80f4616a0064e90 (patch)
treebe76156b8f8a52bddd90614989d2659cc7368024 /fs/ext4
parentaa13d5f67c6f5f7718bd9e9b51ce8255f0535d54 (diff)
ext4: fix zeroing of page during writeback
Tail of a page straddling inode size must be zeroed when being written out due to POSIX requirement that modifications of mmaped page beyond inode size must not be written to the file. ext4_bio_write_page() did this only for blocks fully beyond inode size but didn't properly zero blocks partially beyond inode size. Fix this. The problem has been uncovered by mmap_11-4 test in openposix test suite (part of LTP). Reported-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com> Fixes: 5a0dc7365c240 Fixes: bd2d0210cf22f CC: stable@vger.kernel.org Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/page-io.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index 4cb2743cb2e3..b6a3804a9855 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -422,6 +422,17 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
422 ClearPageError(page); 422 ClearPageError(page);
423 423
424 /* 424 /*
425 * Comments copied from block_write_full_page_endio:
426 *
427 * The page straddles i_size. It must be zeroed out on each and every
428 * writepage invocation because it may be mmapped. "A file is mapped
429 * in multiples of the page size. For a file that is not a multiple of
430 * the page size, the remaining memory is zeroed when mapped, and
431 * writes to that region are not written out to the file."
432 */
433 if (len < PAGE_CACHE_SIZE)
434 zero_user_segment(page, len, PAGE_CACHE_SIZE);
435 /*
425 * In the first loop we prepare and mark buffers to submit. We have to 436 * In the first loop we prepare and mark buffers to submit. We have to
426 * mark all buffers in the page before submitting so that 437 * mark all buffers in the page before submitting so that
427 * end_page_writeback() cannot be called from ext4_bio_end_io() when IO 438 * end_page_writeback() cannot be called from ext4_bio_end_io() when IO
@@ -432,19 +443,6 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
432 do { 443 do {
433 block_start = bh_offset(bh); 444 block_start = bh_offset(bh);
434 if (block_start >= len) { 445 if (block_start >= len) {
435 /*
436 * Comments copied from block_write_full_page_endio:
437 *
438 * The page straddles i_size. It must be zeroed out on
439 * each and every writepage invocation because it may
440 * be mmapped. "A file is mapped in multiples of the
441 * page size. For a file that is not a multiple of
442 * the page size, the remaining memory is zeroed when
443 * mapped, and writes to that region are not written
444 * out to the file."
445 */
446 zero_user_segment(page, block_start,
447 block_start + blocksize);
448 clear_buffer_dirty(bh); 446 clear_buffer_dirty(bh);
449 set_buffer_uptodate(bh); 447 set_buffer_uptodate(bh);
450 continue; 448 continue;