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