Add negative_dentry_timeout mount option to virtiofs to caching negative dentry on the guest side. When the host virito-fs device has an exclusive access to the file system and the machine has enough memory, one can specify a long time as the timeout. This option saves ~1 second per 10,000 stat request for non-existing paths. Signed-off-by: Keiichi Watanabe <keiichiw@xxxxxxxxxxxx> --- Documentation/filesystems/virtiofs.rst | 4 ++++ fs/fuse/virtio_fs.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/Documentation/filesystems/virtiofs.rst b/Documentation/filesystems/virtiofs.rst index fdec5a7840f7..b045ef2223de 100644 --- a/Documentation/filesystems/virtiofs.rst +++ b/Documentation/filesystems/virtiofs.rst @@ -48,6 +48,10 @@ ro, rw, context, etc. Also, virtiofs has its own options. dax[=always,never,inode] Enable direct access for files. See :ref:`virtiofs-dax`. +negative_dentry_timeout=N + Set the time in seconds to keep negative dentry cache. Same as the FUSE's + mount option. + atime behavior ^^^^^^^^^^^^^^ diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c index 4d8d4f16c727..bbbd840510f9 100644 --- a/fs/fuse/virtio_fs.c +++ b/fs/fuse/virtio_fs.c @@ -99,11 +99,13 @@ static const struct constant_table dax_param_enums[] = { enum { OPT_DAX, OPT_DAX_ENUM, + OPT_NEGATIVE_DENTRY_TIMEOUT, }; static const struct fs_parameter_spec virtio_fs_parameters[] = { fsparam_flag("dax", OPT_DAX), fsparam_enum("dax", OPT_DAX_ENUM, dax_param_enums), + fsparam_u32 ("negative_dentry_timeout", OPT_NEGATIVE_DENTRY_TIMEOUT), {} }; @@ -125,6 +127,9 @@ static int virtio_fs_parse_param(struct fs_context *fsc, case OPT_DAX_ENUM: ctx->dax_mode = result.uint_32; break; + case OPT_NEGATIVE_DENTRY_TIMEOUT: + ctx->negative_dentry_timeout = result.uint_32; + break; default: return -EINVAL; } @@ -1416,6 +1421,7 @@ static int virtio_fs_get_tree(struct fs_context *fsc) struct super_block *sb; struct fuse_conn *fc = NULL; struct fuse_mount *fm; + struct fuse_fs_context *ffc; unsigned int virtqueue_size; int err = -EIO; @@ -1468,6 +1474,8 @@ static int virtio_fs_get_tree(struct fs_context *fsc) sb->s_flags |= SB_ACTIVE; } + ffc = fsc->fs_private; + fm->negative_dentry_timeout = ffc->negative_dentry_timeout; WARN_ON(fsc->root); fsc->root = dget(sb->s_root); -- 2.41.0.185.g7c58973941-goog