It can be useful to make negative dentry limit enformcement a runtime tuning parameter instead of just a boot time option. This allows system administrator to disable limit enforcement in normal use, but turn it on under certain circumstances. A new /proc/sys/fs/enforce-neg-dentry-limit sysctl parameter is now added. This is a boolean flag that accept a value of either 0 or 1 for disabling and enabling enforcement of negative dentry limit respectively. Signed-off-by: Waiman Long <longman@xxxxxxxxxx> --- Documentation/sysctl/fs.txt | 11 +++++++++++ fs/dcache.c | 4 +++- include/linux/dcache.h | 4 ++++ kernel/sysctl.c | 11 +++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Documentation/sysctl/fs.txt b/Documentation/sysctl/fs.txt index a8e3f1f..ef8fd32 100644 --- a/Documentation/sysctl/fs.txt +++ b/Documentation/sysctl/fs.txt @@ -24,6 +24,7 @@ Currently, these files are in /proc/sys/fs: - dentry-state - dquot-max - dquot-nr +- enforce-neg-dentry-limit - file-max - file-nr - inode-max @@ -97,6 +98,16 @@ you might want to raise the limit. ============================================================== +enforce-neg-dentry-limit: + +The file enforce-neg-dentry-limit, if present, contains a boolean +flag (0 or 1) indicating if the negative dentries limit set by +the "neg_dentry_pc" kernel parameter should be enforced or not. +If enforced, excess negative dentries over the limit will be killed +immediately after use. + +============================================================== + file-max & file-nr: The value in file-max denotes the maximum number of file- diff --git a/fs/dcache.c b/fs/dcache.c index 77910c9..f50886e 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -146,7 +146,9 @@ struct dentry_stat_t dentry_stat = { unlikely(!(sb)->s_root || !((sb)->s_flags & MS_ACTIVE)) #ifdef CONFIG_DCACHE_TRACK_NEG_ENTRY -static int enforce_neg_dentry_limit __read_mostly; +int enforce_neg_dentry_limit __read_mostly; +EXPORT_SYMBOL_GPL(enforce_neg_dentry_limit); + static int neg_dentry_pc __read_mostly = NEG_DENTRY_PC_DEFAULT; static long neg_dentry_percpu_limit __read_mostly; static long neg_dentry_nfree_init __read_mostly; /* Free pool initial value */ diff --git a/include/linux/dcache.h b/include/linux/dcache.h index 69b8cb3..bd7238a0 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -610,4 +610,8 @@ struct name_snapshot { void take_dentry_name_snapshot(struct name_snapshot *, struct dentry *); void release_dentry_name_snapshot(struct name_snapshot *); +#ifdef CONFIG_DCACHE_TRACK_NEG_ENTRY +extern int enforce_neg_dentry_limit; +#endif + #endif /* __LINUX_DCACHE_H */ diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 2d9837c..94f6f6c 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1849,6 +1849,17 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, .proc_handler = proc_dointvec_minmax, .extra1 = &one, }, +#ifdef CONFIG_DCACHE_TRACK_NEG_ENTRY + { + .procname = "enforce-neg-dentry-limit", + .data = &enforce_neg_dentry_limit, + .maxlen = sizeof(enforce_neg_dentry_limit), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &zero, + .extra2 = &one, + }, +#endif { } }; -- 1.8.3.1