Make do_proc_douintvec static and export proc_douintvec_conv wrapper
function for external use. This is to keep with the design in sysctl.c.
Update fs/pipe.c to use the new public API.
Signed-off-by: Joel Granados <joel.granados@kernel.org>
---
fs/pipe.c | 4 ++--
include/linux/sysctl.h | 13 +++++++------
kernel/sysctl.c | 18 ++++++++++++++----
3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/fs/pipe.c b/fs/pipe.c
index 974faf06a3136fff7a382e575514d84fcf86183c..59b60a9374e671f7e129f5ebfde066c1756c00b3 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -1487,8 +1487,8 @@ static SYSCTL_UINT_CONV_CUSTOM(_pipe_maxsz,
static int proc_dopipe_max_size(const struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
- return do_proc_douintvec(table, write, buffer, lenp, ppos,
- do_proc_uint_conv_pipe_maxsz);
+ return proc_douintvec_conv(table, write, buffer, lenp, ppos,
+ do_proc_uint_conv_pipe_maxsz);
}
static const struct ctl_table fs_pipe_sysctls[] = {
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
index ee5e2b3f47db834b084ac0fc4108bf28177b6949..727dfc7771de1b7a562e9b930f6851873574b532 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -183,14 +183,20 @@ int proc_dostring(const struct ctl_table *, int, void *, size_t *, loff_t *);
int proc_dobool(const struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
int proc_dointvec(const struct ctl_table *, int, void *, size_t *, loff_t *);
+int proc_dointvec_minmax(const struct ctl_table *table, int dir, void *buffer,
+ size_t *lenp, loff_t *ppos);
int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffer,
size_t *lenp, loff_t *ppos,
int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr,
int dir, const struct ctl_table *table));
int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t *);
-int proc_dointvec_minmax(const struct ctl_table *, int, void *, size_t *, loff_t *);
int proc_douintvec_minmax(const struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
+int proc_douintvec_conv(const struct ctl_table *table, int write, void *buffer,
+ size_t *lenp, loff_t *ppos,
+ int (*conv)(unsigned long *lvalp, unsigned int *valp,
+ int write, const struct ctl_table *table));
+
int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *buffer,
size_t *lenp, loff_t *ppos);
int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *, loff_t *);
@@ -349,11 +355,6 @@ extern struct ctl_table_header *register_sysctl_mount_point(const char *path);
void do_sysctl_args(void);
bool sysctl_is_alias(char *param);
-int do_proc_douintvec(const struct ctl_table *table, int write,
- void *buffer, size_t *lenp, loff_t *ppos,
- int (*conv)(unsigned long *lvalp,
- unsigned int *valp, int write,
- const struct ctl_table *table));
extern int unaligned_enabled;
extern int no_unaligned_warning;
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index d2e756ee3717b07fd848871267656ee0ed7d9268..b7c0c78417020d9c7525d4e542be79e8e61bb88a 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -534,10 +534,11 @@ static int do_proc_douintvec_r(const struct ctl_table *table, void *buffer,
return err;
}
-int do_proc_douintvec(const struct ctl_table *table, int dir, void *buffer,
- size_t *lenp, loff_t *ppos,
- int (*conv)(unsigned long *u_ptr, unsigned int *k_ptr,
- int dir, const struct ctl_table *table))
+static int do_proc_douintvec(const struct ctl_table *table, int dir,
+ void *buffer, size_t *lenp, loff_t *ppos,
+ int (*conv)(unsigned long *u_ptr,
+ unsigned int *k_ptr, int dir,
+ const struct ctl_table *table))
{
unsigned int vleft;
@@ -566,6 +567,15 @@ int do_proc_douintvec(const struct ctl_table *table, int dir, void *buffer,
return do_proc_douintvec_r(table, buffer, lenp, ppos, conv);
}
+int proc_douintvec_conv(const struct ctl_table *table, int dir, void *buffer,
+ size_t *lenp, loff_t *ppos,
+ int (*conv)(unsigned long *u_ptr, unsigned int *k_ptr,
+ int dir, const struct ctl_table *table))
+{
+ return do_proc_douintvec(table, dir, buffer, lenp, ppos, conv);
+}
+
+
/**
* proc_dobool - read/write a bool
* @table: the sysctl table
--
2.50.1
Hi Joel,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 130e5390ba572bffa687f32ed212dac1105b654a]
url: https://github.com/intel-lab-lkp/linux/commits/Joel-Granados/sysctl-Allow-custom-converters-from-outside-sysctl/20251017-163832
base: 130e5390ba572bffa687f32ed212dac1105b654a
patch link: https://lore.kernel.org/r/20251017-jag-sysctl_jiffies-v1-7-175d81dfdf82%40kernel.org
patch subject: [PATCH 7/7] sysctl: Wrap do_proc_douintvec with the public function proc_douintvec_conv
config: i386-randconfig-063-20251022 (https://download.01.org/0day-ci/archive/20251022/202510221719.3ggn070M-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251022/202510221719.3ggn070M-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510221719.3ggn070M-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> kernel/kstack_erase.c:34:56: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buffer @@ got void [noderef] __user *buffer @@
kernel/kstack_erase.c:34:56: sparse: expected void *buffer
kernel/kstack_erase.c:34:56: sparse: got void [noderef] __user *buffer
kernel/kstack_erase.c:54:35: sparse: sparse: incorrect type in initializer (incompatible argument 3 (different address spaces)) @@ expected int ( [usertype] *proc_handler )( ... ) @@ got int ( * )( ... ) @@
kernel/kstack_erase.c:54:35: sparse: expected int ( [usertype] *proc_handler )( ... )
kernel/kstack_erase.c:54:35: sparse: got int ( * )( ... )
vim +34 kernel/kstack_erase.c
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 23
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 24 #ifdef CONFIG_SYSCTL
78eb4ea25cd5fd kernel/stackleak.c Joel Granados 2024-07-24 25 static int stack_erasing_sysctl(const struct ctl_table *table, int write,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 26 void __user *buffer, size_t *lenp, loff_t *ppos)
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 27 {
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 28 int ret = 0;
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 29 int state = !static_branch_unlikely(&stack_erasing_bypass);
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 30 int prev_state = state;
0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 31 struct ctl_table table_copy = *table;
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 32
0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 33 table_copy.data = &state;
0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 @34 ret = proc_dointvec_minmax(&table_copy, write, buffer, lenp, ppos);
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 35 state = !!state;
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 36 if (ret || !write || state == prev_state)
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 37 return ret;
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 38
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 39 if (state)
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 40 static_branch_disable(&stack_erasing_bypass);
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 41 else
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 42 static_branch_enable(&stack_erasing_bypass);
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 43
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 44 pr_warn("stackleak: kernel stack erasing is %s\n",
62e9c1e8ecee87 kernel/stackleak.c Thorsten Blum 2024-12-22 45 str_enabled_disabled(state));
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 46 return ret;
964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 47 }
1751f872cc97f9 kernel/stackleak.c Joel Granados 2025-01-28 48 static const struct ctl_table stackleak_sysctls[] = {
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 49 {
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 50 .procname = "stack_erasing",
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 51 .data = NULL,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 52 .maxlen = sizeof(int),
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 53 .mode = 0600,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 54 .proc_handler = stack_erasing_sysctl,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 55 .extra1 = SYSCTL_ZERO,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 56 .extra2 = SYSCTL_ONE,
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 57 },
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 58 };
0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 59
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Wed, Oct 22, 2025 at 05:18:51PM +0800, kernel test robot wrote:
> Hi Joel,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on 130e5390ba572bffa687f32ed212dac1105b654a]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Joel-Granados/sysctl-Allow-custom-converters-from-outside-sysctl/20251017-163832
> base: 130e5390ba572bffa687f32ed212dac1105b654a
> patch link: https://lore.kernel.org/r/20251017-jag-sysctl_jiffies-v1-7-175d81dfdf82%40kernel.org
> patch subject: [PATCH 7/7] sysctl: Wrap do_proc_douintvec with the public function proc_douintvec_conv
> config: i386-randconfig-063-20251022 (https://download.01.org/0day-ci/archive/20251022/202510221719.3ggn070M-lkp@intel.com/config)
> compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251022/202510221719.3ggn070M-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202510221719.3ggn070M-lkp@intel.com/
>
> sparse warnings: (new ones prefixed by >>)
> >> kernel/kstack_erase.c:34:56: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buffer @@ got void [noderef] __user *buffer @@
> kernel/kstack_erase.c:34:56: sparse: expected void *buffer
> kernel/kstack_erase.c:34:56: sparse: got void [noderef] __user *buffer
This is probably a false positive where the warning was already there
but it moved up in the output (probably due to the function moving up in
the header?)
This made me look a bit more into the issue and I believe that it does
show an issue. Not with the current series, but with commit 0df8bdd5e3b3
("stackleak: move stack_erasing sysctl to stackleak.c"). In this commit
the buffer argument was changed frim void* to void __user*
but in 32927393dc1c ("sysctl: pass kernel pointers to ->proc_handler")
the "__user" was removed. I'll post another patch to fix this up.
Best
> kernel/kstack_erase.c:54:35: sparse: sparse: incorrect type in initializer (incompatible argument 3 (different address spaces)) @@ expected int ( [usertype] *proc_handler )( ... ) @@ got int ( * )( ... ) @@
> kernel/kstack_erase.c:54:35: sparse: expected int ( [usertype] *proc_handler )( ... )
> kernel/kstack_erase.c:54:35: sparse: got int ( * )( ... )
>
> vim +34 kernel/kstack_erase.c
>
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 23
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 24 #ifdef CONFIG_SYSCTL
> 78eb4ea25cd5fd kernel/stackleak.c Joel Granados 2024-07-24 25 static int stack_erasing_sysctl(const struct ctl_table *table, int write,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 26 void __user *buffer, size_t *lenp, loff_t *ppos)
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 27 {
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 28 int ret = 0;
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 29 int state = !static_branch_unlikely(&stack_erasing_bypass);
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 30 int prev_state = state;
> 0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 31 struct ctl_table table_copy = *table;
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 32
> 0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 33 table_copy.data = &state;
> 0e148d3cca0dc1 kernel/stackleak.c Thomas Weißschuh 2024-05-03 @34 ret = proc_dointvec_minmax(&table_copy, write, buffer, lenp, ppos);
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 35 state = !!state;
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 36 if (ret || !write || state == prev_state)
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 37 return ret;
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 38
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 39 if (state)
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 40 static_branch_disable(&stack_erasing_bypass);
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 41 else
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 42 static_branch_enable(&stack_erasing_bypass);
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 43
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 44 pr_warn("stackleak: kernel stack erasing is %s\n",
> 62e9c1e8ecee87 kernel/stackleak.c Thorsten Blum 2024-12-22 45 str_enabled_disabled(state));
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 46 return ret;
> 964c9dff009189 kernel/stackleak.c Alexander Popov 2018-08-17 47 }
> 1751f872cc97f9 kernel/stackleak.c Joel Granados 2025-01-28 48 static const struct ctl_table stackleak_sysctls[] = {
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 49 {
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 50 .procname = "stack_erasing",
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 51 .data = NULL,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 52 .maxlen = sizeof(int),
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 53 .mode = 0600,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 54 .proc_handler = stack_erasing_sysctl,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 55 .extra1 = SYSCTL_ZERO,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 56 .extra2 = SYSCTL_ONE,
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 57 },
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 58 };
> 0df8bdd5e3b3e5 kernel/stackleak.c Xiaoming Ni 2022-01-21 59
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
--
Joel Granados
© 2016 - 2026 Red Hat, Inc.