On Mon, Aug 16, 2021 at 8:39 PM Miklos Szeredi <miklos@xxxxxxxxxx> wrote: > > On Fri, Aug 13, 2021 at 05:31:55PM +0800, Xie Yongji wrote: > > The invalidate_inode_pages2() might be called with FUSE_NOWRITE > > set in fuse_finish_open(), which can lead to deadlock in > > fuse_launder_page(). > > > > To fix it, this tries to delay calling invalidate_inode_pages2() > > until FUSE_NOWRITE is removed. > > Thanks for the report and the patch. I think it doesn't make sense to delay the > invalidate_inode_pages2() call since the inode has been truncated in this case, > there's no data worth writing out. > Right. > This patch replaces the invalidate_inode_pages2() with a truncate_pagecache() > call. This makes sense regardless of FOPEN_KEEP_CACHE or fc->writeback cache, > so do it unconditionally. > > Can you please check out the following patch? > > Thanks, > Miklos > > --- > fs/fuse/file.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -198,12 +198,11 @@ void fuse_finish_open(struct inode *inod > struct fuse_file *ff = file->private_data; > struct fuse_conn *fc = get_fuse_conn(inode); > > - if (!(ff->open_flags & FOPEN_KEEP_CACHE)) > - invalidate_inode_pages2(inode->i_mapping); > if (ff->open_flags & FOPEN_STREAM) > stream_open(inode, file); > else if (ff->open_flags & FOPEN_NONSEEKABLE) > nonseekable_open(inode, file); > + > if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) { > struct fuse_inode *fi = get_fuse_inode(inode); > > @@ -211,10 +210,14 @@ void fuse_finish_open(struct inode *inod > fi->attr_version = atomic64_inc_return(&fc->attr_version); > i_size_write(inode, 0); > spin_unlock(&fi->lock); > + truncate_pagecache(inode, 0); > fuse_invalidate_attr(inode); > if (fc->writeback_cache) > file_update_time(file); > + } else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) { > + invalidate_inode_pages2(inode->i_mapping); > } > + > if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache) > fuse_link_write_file(file); > } It looks good to me! Thanks, Yongji