Change ext4_writepage() and underlying ext4_bio_write_page(). It basically removes assumption on page size, infer it from struct page instead.
Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com> --- fs/ext4/inode.c | 10 +++++----- fs/ext4/page-io.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3131747199e1..f585f9160a96 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2020,10 +2020,10 @@ static int ext4_writepage(struct page *page, trace_ext4_writepage(page); size = i_size_read(inode); - if (page->index == size >> PAGE_SHIFT) - len = size & ~PAGE_MASK; - else - len = PAGE_SIZE; + + len = hpage_size(page); + if (page->index + hpage_nr_pages(page) - 1 == size >> PAGE_SHIFT) + len = size & ~hpage_mask(page); page_bufs = page_buffers(page); /* @@ -2047,7 +2047,7 @@ static int ext4_writepage(struct page *page, ext4_bh_delay_or_unwritten)) { redirty_page_for_writepage(wbc, page); if ((current->flags & PF_MEMALLOC) || - (inode->i_sb->s_blocksize == PAGE_SIZE)) { + (inode->i_sb->s_blocksize == hpage_size(page))) { /* * For memory cleaning there's no point in writing only * some buffers. So just bail out. Warn if we came here diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index a6132a730967..952957ee48b7 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -415,6 +415,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, BUG_ON(!PageLocked(page)); BUG_ON(PageWriteback(page)); + BUG_ON(PageTail(page)); if (keep_towrite) set_page_writeback_keepwrite(page); @@ -431,8 +432,14 @@ int ext4_bio_write_page(struct ext4_io_submit *io, * the page size, the remaining memory is zeroed when mapped, and * writes to that region are not written out to the file." */ - if (len < PAGE_SIZE) - zero_user_segment(page, len, PAGE_SIZE); + if (len < hpage_size(page)) { + page += len / PAGE_SIZE; + if (len % PAGE_SIZE) + zero_user_segment(page, len % PAGE_SIZE, PAGE_SIZE); + while (page + 1 == compound_head(page)) + clear_highpage(++page); + page = compound_head(page); + } /* * In the first loop we prepare and mark buffers to submit. We have to * mark all buffers in the page before submitting so that -- 2.8.1