Re: [PATCH 1/3] fuse: invalidate page cache pages before direct write

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 2023年8月1日 16:06,Hao Xu <hao.xu@xxxxxxxxx> 写道:
> 
> From: Hao Xu <howeyxu@xxxxxxxxxxx>
> 
> In FOPEN_DIRECT_IO, page cache may still be there for a file since
> private mmap is allowed. Direct write should respect that and invalidate
> the corresponding pages so that page cache readers don't get stale data.

Do other filesystems also invalidate page cache in this case?

> 
> Signed-off-by: Hao Xu <howeyxu@xxxxxxxxxxx>
> ---
> fs/fuse/file.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index bc4115288eec..3d320fc99859 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -1465,7 +1465,8 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
> int write = flags & FUSE_DIO_WRITE;
> int cuse = flags & FUSE_DIO_CUSE;
> struct file *file = io->iocb->ki_filp;
> - struct inode *inode = file->f_mapping->host;
> + struct address_space *mapping = file->f_mapping;
> + struct inode *inode = mapping->host;
> struct fuse_file *ff = file->private_data;
> struct fuse_conn *fc = ff->fm->fc;
> size_t nmax = write ? fc->max_write : fc->max_read;
> @@ -1477,6 +1478,7 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
> int err = 0;
> struct fuse_io_args *ia;
> unsigned int max_pages;
> + bool fopen_direct_io = ff->open_flags & FOPEN_DIRECT_IO;
> 
> max_pages = iov_iter_npages(iter, fc->max_pages);
> ia = fuse_io_alloc(io, max_pages);
> @@ -1491,6 +1493,14 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, struct iov_iter *iter,
> inode_unlock(inode);
> }
> 
> + if (fopen_direct_io && write) {
> + res = invalidate_inode_pages2_range(mapping, idx_from, idx_to);
> + if (res) {
> + fuse_io_free(ia);
> + return res;
> + }
> + }
> +
> io->should_dirty = !write && user_backed_iter(iter);
> while (count) {
> ssize_t nres;
> -- 
> 2.25.1
> 





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux