Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sysctl: Allow custom converters from outside sysctl

The new non-static proc_dointvec_conv forwards a custom converter
function to do_proc_dointvec from outside the sysctl scope. Rename the
do_proc_dointvec call points so any future changes to proc_dointvec_conv
are propagated in sysctl.c This is a preparation commit that allows the
integer jiffie converter functions to move out of kernel/sysctl.c.

Signed-off-by: Joel Granados <joel.granados@kernel.org>

+28 -8
+4
include/linux/sysctl.h
··· 68 68 int proc_dobool(const struct ctl_table *table, int write, void *buffer, 69 69 size_t *lenp, loff_t *ppos); 70 70 int proc_dointvec(const struct ctl_table *, int, void *, size_t *, loff_t *); 71 + int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffer, 72 + size_t *lenp, loff_t *ppos, 73 + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, 74 + int dir, const struct ctl_table *table)); 71 75 int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t *); 72 76 int proc_dointvec_minmax(const struct ctl_table *, int, void *, size_t *, loff_t *); 73 77 int proc_douintvec_minmax(const struct ctl_table *table, int write, void *buffer,
+24 -8
kernel/sysctl.c
··· 1005 1005 lenp, ppos, HZ, 1000l); 1006 1006 } 1007 1007 1008 + int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffer, 1009 + size_t *lenp, loff_t *ppos, 1010 + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, 1011 + int dir, const struct ctl_table *table)) 1012 + { 1013 + return do_proc_dointvec(table, dir, buffer, lenp, ppos, conv); 1014 + } 1015 + 1008 1016 /** 1009 1017 * proc_dointvec_jiffies - read a vector of integers as seconds 1010 1018 * @table: the sysctl table ··· 1031 1023 int proc_dointvec_jiffies(const struct ctl_table *table, int dir, 1032 1024 void *buffer, size_t *lenp, loff_t *ppos) 1033 1025 { 1034 - return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1035 - do_proc_int_conv_jiffies); 1026 + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, 1027 + do_proc_int_conv_jiffies); 1036 1028 } 1037 1029 1038 1030 int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, 1039 1031 void *buffer, size_t *lenp, loff_t *ppos) 1040 1032 { 1041 - return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1042 - do_proc_int_conv_ms_jiffies_minmax); 1033 + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, 1034 + do_proc_int_conv_ms_jiffies_minmax); 1043 1035 } 1044 1036 1045 1037 /** ··· 1062 1054 { 1063 1055 if (SYSCTL_USER_TO_KERN(dir) && USER_HZ < HZ) 1064 1056 return -EINVAL; 1065 - return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1066 - do_proc_int_conv_userhz_jiffies); 1057 + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, 1058 + do_proc_int_conv_userhz_jiffies); 1067 1059 } 1068 1060 1069 1061 /** ··· 1084 1076 int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void *buffer, 1085 1077 size_t *lenp, loff_t *ppos) 1086 1078 { 1087 - return do_proc_dointvec(table, dir, buffer, lenp, ppos, 1088 - do_proc_int_conv_ms_jiffies); 1079 + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, 1080 + do_proc_int_conv_ms_jiffies); 1089 1081 } 1090 1082 1091 1083 /** ··· 1311 1303 1312 1304 int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, 1313 1305 void *buffer, size_t *lenp, loff_t *ppos) 1306 + { 1307 + return -ENOSYS; 1308 + } 1309 + 1310 + int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffer, 1311 + size_t *lenp, loff_t *ppos, 1312 + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, 1313 + int dir, const struct ctl_table *table)) 1314 1314 { 1315 1315 return -ENOSYS; 1316 1316 }