[PATCH] erofs: use the shared page cache for splice in inode_share mode
Zhan Xusheng <[email protected]>
| Newsgroups | org.ozlabs.lists.linux-erofs,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Zhan Xusheng <[email protected]> From: Zhan Xusheng <[email protected]> erofs_ishare_fops routes everything that touches the page cache to the backing file in ->private_data: read_iter clones the iocb onto it, mmap does vma_set_file(), fadvise calls vfs_fadvise() on it. splice_read was left as filemap_splice_read(), which works on the user file's own mapping. filemap_splice_read() does init_sync_kiocb(&iocb, in), and filemap_get_pages() then takes iocb->ki_filp->f_mapping, so splice() and sendfile() populate the per-file page cache from disk instead of using the shared one. The data is correct, since erofs_fill_inode() sets that mapping's a_ops either way, but the same content ends up cached twice, which is what inode_share is there to avoid. Pass the backing file, as read_iter already does. Fixes: 5ef3208e3be5 ("erofs: introduce the page cache share feature") Link: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Zhan Xusheng <[email protected]> --- fs/erofs/ishare.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/erofs/ishare.c b/fs/erofs/ishare.c index fa7d4112dec5..01dc53e9e3ad 100644 --- a/fs/erofs/ishare.c +++ b/fs/erofs/ishare.c @@ -148,6 +148,13 @@ static int erofs_ishare_mmap(struct file *file, struct vm_area_struct *vma) return generic_file_readonly_mmap(file, vma); } +static ssize_t erofs_ishare_splice_read(struct file *in, loff_t *ppos, + struct pipe_inode_info *pipe, + size_t len, unsigned int flags) +{ + return filemap_splice_read(in->private_data, ppos, pipe, len, flags); +} + static int erofs_ishare_fadvise(struct file *file, loff_t offset, loff_t len, int advice) { @@ -161,7 +168,7 @@ const struct file_operations erofs_ishare_fops = { .mmap = erofs_ishare_mmap, .release = erofs_ishare_file_release, .get_unmapped_area = thp_get_unmapped_area, - .splice_read = filemap_splice_read, + .splice_read = erofs_ishare_splice_read, .fadvise = erofs_ishare_fadvise, }; -- 2.43.0