It simply matches changes to __block_write_begin_int().

Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
---
 fs/ext4/inode.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index a07c055d8e78..31560b52eff2 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1079,9 +1079,8 @@ int do_journal_get_write_access(handle_t *handle,
 static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len,
                                  get_block_t *get_block)
 {
-       unsigned from = pos & (PAGE_SIZE - 1);
-       unsigned to = from + len;
-       struct inode *inode = page->mapping->host;
+       unsigned from, to;
+       struct inode *inode = page_mapping(page)->host;
        unsigned block_start, block_end;
        sector_t block;
        int err = 0;
@@ -1090,9 +1089,12 @@ static int ext4_block_write_begin(struct page *page, 
loff_t pos, unsigned len,
        struct buffer_head *bh, *head, *wait[2], **wait_bh = wait;
        bool decrypt = false;
 
+       page = compound_head(page);
+       from = pos & ~hpage_mask(page);
+       to = from + len;
        BUG_ON(!PageLocked(page));
-       BUG_ON(from > PAGE_SIZE);
-       BUG_ON(to > PAGE_SIZE);
+       BUG_ON(from > hpage_size(page));
+       BUG_ON(to > hpage_size(page));
        BUG_ON(from > to);
 
        if (!page_has_buffers(page))
@@ -1127,9 +1129,15 @@ static int ext4_block_write_begin(struct page *page, 
loff_t pos, unsigned len,
                                        mark_buffer_dirty(bh);
                                        continue;
                                }
-                               if (block_end > to || block_start < from)
-                                       zero_user_segments(page, to, block_end,
-                                                          block_start, from);
+                               if (block_end > to || block_start < from) {
+                                       BUG_ON(to - from  > PAGE_SIZE);
+                                       zero_user_segments(page +
+                                                       block_start / PAGE_SIZE,
+                                                       to % PAGE_SIZE,
+                                                       (block_start % 
PAGE_SIZE) + blocksize,
+                                                       block_start % PAGE_SIZE,
+                                                       from % PAGE_SIZE);
+                               }
                                continue;
                        }
                }
-- 
2.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-block" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to