On 1/1/25 14:00, Amir Goldstein wrote: > The re-factoring of fuse_dir_open() missed the need to invalidate > directory inode page cache with open flag FOPEN_KEEP_CACHE. > > Fixes: 7de64d521bf92 ("fuse: break up fuse_open_common()") > Reported-by: Prince Kumar <princer@xxxxxxxxxx> > Closes: https://lore.kernel.org/linux-fsdevel/CAEW=TRr7CYb4LtsvQPLj-zx5Y+EYBmGfM24SuzwyDoGVNoKm7w@xxxxxxxxxxxxxx/ > Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > > Miklos, > > I verified the fix using: > passthrough_ll -d -o source=/src,cache=always /mnt > > and watching debug prints from repeating 'ls /mnt' invocations. > > With current upstream, dir cache is kept even though passthrough_ll > never sets keep_cache in opendir. > > passthrough_hp always set keep_cache together with cache_readdir, > so it could not have noticed this regression. > > I've modified passthrough_ll as follows to test the keep_cache flag: > > fi->fh = (uintptr_t) d; > < if (lo->cache == CACHE_ALWAYS) >> if (lo->cache != CACHE_NEVER) > fi->cache_readdir = 1; >> if (lo->cache == CACHE_ALWAYS) >> fi->keep_cache = 1; > fuse_reply_open(req, fi); > return; > > Thanks, > Amir. > > diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c > index 494ac372ace07..e540d05549fff 100644 > --- a/fs/fuse/dir.c > +++ b/fs/fuse/dir.c > @@ -1681,6 +1681,8 @@ static int fuse_dir_open(struct inode *inode, struct file *file) > */ > if (ff->open_flags & (FOPEN_STREAM | FOPEN_NONSEEKABLE)) > nonseekable_open(inode, file); > + if (!(ff->open_flags & FOPEN_KEEP_CACHE)) > + invalidate_inode_pages2(inode->i_mapping); > } > > return err; LGTM. Thanks for the quick fix Amir, especially during holidays! Reviewed-by: Bernd Schubert <bernd.schubert@xxxxxxxxxxx>