From 1552b467fcd7751360299c5139382d78538e12b3 Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Sat, 6 Apr 2019 18:34:57 +0100 Subject: [PATCH] Add support for in-kernel readdir caching. Fixes: #394. --- ChangeLog.rst | 5 +++++ include/fuse_common.h | 18 +++++++++++++----- lib/fuse_lowlevel.c | 2 ++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ChangeLog.rst b/ChangeLog.rst index 7407cea..1abb66c 100644 --- a/ChangeLog.rst +++ b/ChangeLog.rst @@ -1,8 +1,13 @@ +Unreleased Changes +================== + * Changed ioctl commands to "unsigned int" in order to support commands which do not fit into a signed int. Commands issued by applications are still truncated to 32 bits. * Added SMB2 to whitelist (so users can now mount FUSE filesystems on mountpoints within SMB 2.0 filesystems). +* Added a new `cache_readdir` flag to `fuse_file_info` to enable + caching of readdir results. Supported by kernels 4.20 and newer. libfuse 3.4.2 (2019-03-09) ========================== diff --git a/include/fuse_common.h b/include/fuse_common.h index 5cf9fee..823a37d 100644 --- a/include/fuse_common.h +++ b/include/fuse_common.h @@ -55,9 +55,11 @@ struct fuse_file_info { /** Can be filled in by open, to use direct I/O on this file. */ unsigned int direct_io : 1; - /** Can be filled in by open, to indicate that currently - cached file data (that the filesystem provided the last - time the file was open) need not be invalidated. */ + /** Can be filled in by open. It signals the kernel that any + currently cached file data (ie., data that the filesystem + provided the last time the file was open) need not be + invalidated. Has no effect when set in other contexts (in + particular it does nothing when set by opendir()). */ unsigned int keep_cache : 1; /** Indicates a flush operation. Set in flush operation, also @@ -74,8 +76,14 @@ struct fuse_file_info { May only be set in ->release(). */ unsigned int flock_release : 1; - /** Padding. Do not use*/ - unsigned int padding : 27; + /** Can be filled in by opendir. It signals the kernel to + enable caching of entries returned by readdir(). Has no + effect when set in other contexts (in particular it does + nothing when set by open()). */ + unsigned int cache_readdir : 1; + + /** Padding. Reserved for future use*/ + unsigned int padding : 26; /** File handle id. May be filled in by filesystem in create, * open, and opendir(). Available in most other file operations on the diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 78ee63b..50fff4d 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -392,6 +392,8 @@ static void fill_open(struct fuse_open_out *arg, arg->open_flags |= FOPEN_DIRECT_IO; if (f->keep_cache) arg->open_flags |= FOPEN_KEEP_CACHE; + if (f->cache_readdir) + arg->open_flags |= FOPEN_CACHE_DIR; if (f->nonseekable) arg->open_flags |= FOPEN_NONSEEKABLE; } -- 2.30.2