diff mbox series

fuse: respect FOPEN_KEEP_CACHE on opendir

Message ID 20250101130037.96680-1-amir73il@gmail.com (mailing list archive)
State New
Headers show
Series fuse: respect FOPEN_KEEP_CACHE on opendir | expand

Commit Message

Amir Goldstein Jan. 1, 2025, 1 p.m. UTC
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@google.com>
Closes: https://lore.kernel.org/linux-fsdevel/CAEW=TRr7CYb4LtsvQPLj-zx5Y+EYBmGfM24SuzwyDoGVNoKm7w@mail.gmail.com/
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---

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.

Comments

Bernd Schubert Jan. 1, 2025, 10:46 p.m. UTC | #1
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@google.com>
> Closes: https://lore.kernel.org/linux-fsdevel/CAEW=TRr7CYb4LtsvQPLj-zx5Y+EYBmGfM24SuzwyDoGVNoKm7w@mail.gmail.com/
> Signed-off-by: Amir Goldstein <amir73il@gmail.com>
> ---
> 
> 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@fastmail.fm>
Christian Brauner Jan. 4, 2025, 8:58 a.m. UTC | #2
On Wed, 01 Jan 2025 14:00:37 +0100, 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.
> 
> 

Applied to the vfs.fixes branch of the vfs/vfs.git tree.
Patches in the vfs.fixes branch should appear in linux-next soon.

Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.

It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.

Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs.fixes

[1/1] fuse: respect FOPEN_KEEP_CACHE on opendir
      https://git.kernel.org/vfs/vfs/c/03f275adb8fb
diff mbox series

Patch

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;