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

Reply via email to