Adds a readonly 'current_inotify_watches' entry to the user sysctl table. The handler for this entry is a custom function that ends calling proc_dointvec.
Signed-off-by: Albert Vaca Cintora <albertv...@gmail.com> --- kernel/ucount.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/kernel/ucount.c b/kernel/ucount.c index f48d1b6376a4..afa3b89e3373 100644 --- a/kernel/ucount.c +++ b/kernel/ucount.c @@ -57,6 +57,11 @@ static struct ctl_table_root set_root = { .permissions = set_permissions, }; +#ifdef CONFIG_INOTIFY_USER +int proc_read_inotify_watches(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos); +#endif + static int zero = 0; static int int_max = INT_MAX; #define UCOUNT_ENTRY(name) \ @@ -79,6 +84,12 @@ static struct ctl_table user_table[] = { #ifdef CONFIG_INOTIFY_USER UCOUNT_ENTRY("max_inotify_instances"), UCOUNT_ENTRY("max_inotify_watches"), + { + .procname = "current_inotify_watches", + .maxlen = sizeof(int), + .mode = 0444, + .proc_handler = proc_read_inotify_watches, + }, #endif { } }; @@ -226,6 +237,24 @@ void dec_ucount(struct ucounts *ucounts, enum ucount_type type) put_ucounts(ucounts); } +#ifdef CONFIG_INOTIFY_USER +int proc_read_inotify_watches(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + struct ucounts *ucounts; + struct ctl_table fake_table; + int count; + + ucounts = get_ucounts(current_user_ns(), current_euid()); + count = atomic_read(&ucounts->ucount[UCOUNT_INOTIFY_WATCHES]); + put_ucounts(ucounts); + + fake_table.data = &count; + fake_table.maxlen = sizeof(count); + return proc_dointvec(&fake_table, write, buffer, lenp, ppos); +} +#endif + static __init int user_namespace_sysctl_init(void) { #ifdef CONFIG_SYSCTL -- 2.20.1