diff options
author | Alexey Gladkov <legion@kernel.org> | 2022-10-25 18:57:55 +0200 |
---|---|---|
committer | Alexey Gladkov <legion@kernel.org> | 2022-10-25 18:57:55 +0200 |
commit | 4979ec6f1723fca45de0ed72d921f8ea197ca103 (patch) | |
tree | 9f5822a76f4e04f51760d8b21206e226f88f6ab9 | |
parent | 9772ba957b86666e43717f3a78d4a61c501824f1 (diff) | |
download | linux-patchset/sysctl-next/v3.4.tar.gz |
sysctl: Replace proc_do_static_key by read and write functionspatchset/sysctl-next/v3.4
Signed-off-by: Alexey Gladkov <legion@kernel.org>
-rw-r--r-- | include/linux/sysctl.h | 4 | ||||
-rw-r--r-- | kernel/sysctl.c | 45 | ||||
-rw-r--r-- | net/core/sysctl_net_core.c | 2 |
3 files changed, 34 insertions, 17 deletions
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index bf8a9b8d9abd6c..b186df8ea674a1 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -65,9 +65,6 @@ extern const unsigned long sysctl_long_vals[]; typedef int proc_handler(struct ctl_table *ctl, int write, void *buffer, size_t *lenp, loff_t *ppos); -int proc_do_static_key(struct ctl_table *table, int write, void *buffer, - size_t *lenp, loff_t *ppos); - ssize_t sysctl_read_large_bitmap(struct ctl_context *ctx, struct file *file, char *buffer, size_t *lenp, loff_t *ppos); ssize_t sysctl_write_large_bitmap(struct ctl_context *ctx, struct file *file, @@ -143,6 +140,7 @@ ssize_t sysctl_write_ulongvec_ms_jiffies(struct ctl_context *, struct file *, ch ssize_t sysctl_read_u8vec(struct ctl_context *, struct file *, char *, size_t *, loff_t *); ssize_t sysctl_write_u8vec(struct ctl_context *, struct file *, char *, size_t *, loff_t *); +extern struct ctl_fops sysctl_static_key_fops; extern struct ctl_fops sysctl_string_fops; extern struct ctl_fops sysctl_bool_fops; extern struct ctl_fops sysctl_intvec_fops; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 72fb773893c474..3cdbda04247038 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1839,25 +1839,22 @@ struct ctl_fops sysctl_u8vec_fops = { }; #if defined(CONFIG_SYSCTL) -int proc_do_static_key(struct ctl_table *table, int write, - void *buffer, size_t *lenp, loff_t *ppos) +static DEFINE_MUTEX(static_key_mutex); + +static ssize_t sysctl_write_static_key(struct ctl_context *ctx, struct file *file, + char *buffer, size_t *lenp, loff_t *ppos) { - struct static_key *key = (struct static_key *)table->data; - static DEFINE_MUTEX(static_key_mutex); - int val, ret; + struct static_key *key = (struct static_key *)ctx->ctl_table->data; + int val; + ssize_t ret; - if (write && !capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN)) return -EPERM; mutex_lock(&static_key_mutex); val = static_key_enabled(key); - if (!write) { - ret = sysctl_read_intvec_data(&val, table, buffer, lenp, ppos, - sysctl_conv_intvec, NULL, NULL); - goto ret; - } - ret = sysctl_write_intvec_data(&val, table, buffer, lenp, ppos, + ret = sysctl_write_intvec_data(&val, ctx->ctl_table, buffer, lenp, ppos, sysctl_conv_intvec, SYSCTL_ZERO, SYSCTL_ONE); if (!ret) { if (val) @@ -1865,11 +1862,33 @@ int proc_do_static_key(struct ctl_table *table, int write, else static_key_disable(key); } -ret: + + mutex_unlock(&static_key_mutex); + return ret; +} + +static ssize_t sysctl_read_static_key(struct ctl_context *ctx, struct file *file, + char *buffer, size_t *lenp, loff_t *ppos) +{ + struct static_key *key = (struct static_key *)ctx->ctl_table->data; + int val; + ssize_t ret; + + mutex_lock(&static_key_mutex); + val = static_key_enabled(key); + + ret = sysctl_read_intvec_data(&val, ctx->ctl_table, buffer, lenp, ppos, + sysctl_conv_intvec, NULL, NULL); + mutex_unlock(&static_key_mutex); return ret; } +struct ctl_fops sysctl_static_key_fops = { + .read = sysctl_read_static_key, + .write = sysctl_write_static_key, +}; + static struct ctl_table kern_table[] = { #ifdef CONFIG_NUMA_BALANCING { diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index 1497a2a73fe8ca..2914f3dcb52e48 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c @@ -660,7 +660,7 @@ static struct ctl_table net_core_table[] = { .data = &net_high_order_alloc_disable_key.key, .maxlen = sizeof(net_high_order_alloc_disable_key), .mode = 0644, - .proc_handler = proc_do_static_key, + .ctl_fops = &sysctl_static_key_fops, }, { .procname = "gro_normal_batch", |