> 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 >