From: Dave Young Add a proc_dointvec_unsigned() sysctl handler for positive value cases. V2 changes: As to Alexey Dobriyan: do not ignore max in proc_dointvec_unsigned param setup. Signed-off-by: Dave Young Signed-off-by: Andrew Morton --- include/linux/sysctl.h | 2 ++ kernel/sysctl.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) --- linux-2.6.orig/include/linux/sysctl.h 2011-04-27 13:58:51.343332511 +0800 +++ linux-2.6/include/linux/sysctl.h 2011-06-01 16:28:07.679536892 +0800 @@ -971,6 +971,8 @@ extern int proc_dointvec(struct ctl_tabl void __user *, size_t *, loff_t *); extern int proc_dointvec_minmax(struct ctl_table *, int, void __user *, size_t *, loff_t *); +extern int proc_dointvec_unsigned(struct ctl_table *, int, + void __user *, size_t *, loff_t *); extern int proc_dointvec_jiffies(struct ctl_table *, int, void __user *, size_t *, loff_t *); extern int proc_dointvec_userhz_jiffies(struct ctl_table *, int, --- linux-2.6.orig/kernel/sysctl.c 2011-06-01 16:08:51.682872883 +0800 +++ linux-2.6/kernel/sysctl.c 2011-06-01 16:29:48.389536662 +0800 @@ -2476,6 +2476,33 @@ int proc_dointvec_minmax(struct ctl_tabl do_proc_dointvec_minmax_conv, ¶m); } +/** + * proc_dointvec_unsigned - read a vector of integers with positive values + * @table: the sysctl table + * @write: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: file position + * + * Reads/writes up to table->maxlen/sizeof(unsigned int) integer + * values from/to the user buffer, treated as an ASCII string. + * + * This routine will ensure the values are positive. + * + * Returns 0 on success. + */ +int proc_dointvec_unsigned(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + struct do_proc_dointvec_minmax_conv_param param = { + .min = &zero, + .max = (int *) table->extra2, + }; + return do_proc_dointvec(table, write, buffer, lenp, ppos, + do_proc_dointvec_minmax_conv, ¶m); +} +EXPORT_SYMBOL(proc_dointvec_unsigned); + static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos,