mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
vfs: Add a sysctl for automated deletion of dentry
Commit681ce86235
("vfs: Delete the associated dentry when deleting a file") introduced an unconditional deletion of the associated dentry when a file is removed. However, this led to performance regressions in specific benchmarks, such as ilebench.sum_operations/s [0], prompting a revert in commit4a4be1ad3a
("Revert "vfs: Delete the associated dentry when deleting a file""). This patch seeks to reintroduce the concept conditionally, where the associated dentry is deleted only when the user explicitly opts for it during file removal. A new sysctl fs.automated_deletion_of_dentry is added for this purpose. Its default value is set to 0. There are practical use cases for this proactive dentry reclamation. Besides the Elasticsearch use case mentioned in commit681ce86235
, additional examples have surfaced in our production environment. For instance, in video rendering services that continuously generate temporary files, upload them to persistent storage servers, and then delete them, a large number of negative dentries—serving no useful purpose—accumulate. Users in such cases would benefit from proactively reclaiming these negative dentries. Link: https://lore.kernel.org/linux-fsdevel/202405291318.4dfbb352-oliver.sang@intel.com [0] Link: https://lore.kernel.org/all/20240912-programm-umgibt-a1145fa73bb6@brauner/ Suggested-by: Christian Brauner <brauner@kernel.org> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Yafang Shao <laoar.shao@gmail.com> Link: https://lore.kernel.org/r/20240929122831.92515-1-laoar.shao@gmail.com Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christian Brauner <brauner@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Mateusz Guzik <mjguzik@gmail.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
6474353a5e
commit
e6957c99dc
@ -38,6 +38,11 @@ requests. ``aio-max-nr`` allows you to change the maximum value
|
|||||||
``aio-max-nr`` does not result in the
|
``aio-max-nr`` does not result in the
|
||||||
pre-allocation or re-sizing of any kernel data structures.
|
pre-allocation or re-sizing of any kernel data structures.
|
||||||
|
|
||||||
|
dentry-negative
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Policy for negative dentries. Set to 1 to to always delete the dentry when a
|
||||||
|
file is removed, and 0 to disable it. By default, this behavior is disabled.
|
||||||
|
|
||||||
dentry-state
|
dentry-state
|
||||||
------------
|
------------
|
||||||
|
12
fs/dcache.c
12
fs/dcache.c
@ -135,6 +135,7 @@ struct dentry_stat_t {
|
|||||||
static DEFINE_PER_CPU(long, nr_dentry);
|
static DEFINE_PER_CPU(long, nr_dentry);
|
||||||
static DEFINE_PER_CPU(long, nr_dentry_unused);
|
static DEFINE_PER_CPU(long, nr_dentry_unused);
|
||||||
static DEFINE_PER_CPU(long, nr_dentry_negative);
|
static DEFINE_PER_CPU(long, nr_dentry_negative);
|
||||||
|
static int dentry_negative_policy;
|
||||||
|
|
||||||
#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
|
#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
|
||||||
/* Statistics gathering. */
|
/* Statistics gathering. */
|
||||||
@ -199,6 +200,15 @@ static struct ctl_table fs_dcache_sysctls[] = {
|
|||||||
.mode = 0444,
|
.mode = 0444,
|
||||||
.proc_handler = proc_nr_dentry,
|
.proc_handler = proc_nr_dentry,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.procname = "dentry-negative",
|
||||||
|
.data = &dentry_negative_policy,
|
||||||
|
.maxlen = sizeof(dentry_negative_policy),
|
||||||
|
.mode = 0644,
|
||||||
|
.proc_handler = proc_dointvec_minmax,
|
||||||
|
.extra1 = SYSCTL_ZERO,
|
||||||
|
.extra2 = SYSCTL_ONE,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init init_fs_dcache_sysctls(void)
|
static int __init init_fs_dcache_sysctls(void)
|
||||||
@ -2401,6 +2411,8 @@ void d_delete(struct dentry * dentry)
|
|||||||
* Are we the only user?
|
* Are we the only user?
|
||||||
*/
|
*/
|
||||||
if (dentry->d_lockref.count == 1) {
|
if (dentry->d_lockref.count == 1) {
|
||||||
|
if (dentry_negative_policy)
|
||||||
|
__d_drop(dentry);
|
||||||
dentry->d_flags &= ~DCACHE_CANT_MOUNT;
|
dentry->d_flags &= ~DCACHE_CANT_MOUNT;
|
||||||
dentry_unlink_inode(dentry);
|
dentry_unlink_inode(dentry);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user