[PATCH] fuse: respect FOPEN_KEEP_CACHE on opendir

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux