From: "Matthew Wilcox (Oracle)" This fixes handle_bounds_compressed_page() on highmem memory as page_address() does not work on memory which has been kmap_local(), only on kmap() memory. Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Hyunchul Lee Signed-off-by: Namjae Jeon Acked-by: Namjae Jeon --- fs/ntfs/compress.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index 8078041b8796..f03fae63c199 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c @@ -109,16 +109,16 @@ static inline void handle_bounds_compressed_page(struct page *page, if ((pos + PAGE_SIZE > initialized_size) && (initialized_size < i_size)) { - u8 *kp = page_address(page); - unsigned int kp_ofs; + size_t offset; ntfs_debug("Zeroing page region outside initialized size."); - if (pos >= initialized_size) { - clear_page(kp); - return; - } - kp_ofs = initialized_size & ~PAGE_MASK; - memset(kp + kp_ofs, 0, PAGE_SIZE - kp_ofs); + if (pos >= initialized_size) + offset = 0; + else + offset = offset_in_page(initialized_size); + zero_user_segment(page, offset, PAGE_SIZE); + } else { + flush_dcache_page(page); } } @@ -223,7 +223,6 @@ static int ntfs_decompress(struct page *dest_pages[], int completed_pages[], */ handle_bounds_compressed_page(dp, i_size, initialized_size); - flush_dcache_page(dp); kunmap_local(page_address(dp)); SetPageUptodate(dp); unlock_page(dp); @@ -759,7 +758,6 @@ int ntfs_read_compressed_block(struct folio *folio) */ handle_bounds_compressed_page(page, i_size, initialized_size); - flush_dcache_page(page); kunmap_local(page_address(page)); SetPageUptodate(page); unlock_page(page); -- 2.43.0