[Virtio-fs] [PATCH 5/9] fuse: do not write whole page while page straddles i_size

Vivek Goyal vgoyal at redhat.com
Tue Apr 16 20:16:21 UTC 2019


On Wed, Apr 17, 2019 at 02:03:18AM +0800, Liu Bo wrote:
> From: Xiaoguang Wang <xiaoguang.wang at linux.alibaba.com>
> 
> 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.
> 
> Reviewed-by: Joseph Qi <joseph.qi at linux.alibaba.com>
> Signed-off-by: Xiaoguang Wang <xiaoguang.wang at linux.alibaba.com>

[cc miklos]

This sounds like a generic fuse issue as well (and not virtio-fs specic)?
If yes, can you please send this fix separately to miklos and fuse
mailing list.

Vivek
> ---
>  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 bb45acc..c6090f5 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -2293,6 +2293,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;
> @@ -2364,7 +2366,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);
> -- 
> 1.8.3.1
> 
> _______________________________________________
> Virtio-fs mailing list
> Virtio-fs at redhat.com
> https://www.redhat.com/mailman/listinfo/virtio-fs




More information about the Virtio-fs mailing list