From: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx> If page straddles i_size and we write the whole page, the fuse user-space filesystem may extend file size, it will confuse users. Before this patch: xfs_io -t -f \ -c "truncate 5120" \ -c "pwrite -S 0x58 0 5120" \ -c "mmap -rw 0 5120" \ -c "mwrite -S 0x59 2048 3072" \ -c "close" \ testfile testfile's length will be 8192 bytes, with this patch, testfile's length will be 5120 bytes. Signed-off-by: Xiaoguang Wang <xiaoguang.wang@xxxxxxxxxxxxxxxxx> Signed-off-by: Liu Bo <bo.liu@xxxxxxxxxxxxxxxxx> --- fs/fuse/file.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 06096b60f1df..44e76b00e985 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1863,6 +1863,8 @@ static int fuse_writepages_fill(struct page *page, struct page *tmp_page; bool is_writeback; int err; + loff_t size; + unsigned int len; if (!data->ff) { err = -EIO; @@ -1940,7 +1942,12 @@ static int fuse_writepages_fill(struct page *page, copy_highpage(tmp_page, page); req->pages[req->num_pages] = tmp_page; req->page_descs[req->num_pages].offset = 0; - req->page_descs[req->num_pages].length = PAGE_SIZE; + size = i_size_read(inode); + if (page->index == size >> PAGE_SHIFT) + len = size & ~PAGE_MASK; + else + len = PAGE_SIZE; + req->page_descs[req->num_pages].length = len; inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP); -- 2.20.1.2.gb21ebb6