aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Gladkov <legion@kernel.org>2022-10-25 18:57:55 +0200
committerAlexey Gladkov <legion@kernel.org>2022-10-25 18:57:55 +0200
commit4979ec6f1723fca45de0ed72d921f8ea197ca103 (patch)
tree9f5822a76f4e04f51760d8b21206e226f88f6ab9
parent9772ba957b86666e43717f3a78d4a61c501824f1 (diff)
downloadlinux-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.h4
-rw-r--r--kernel/sysctl.c45
-rw-r--r--net/core/sysctl_net_core.c2
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",