diff options
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index b43d0b27c1fe..a13bbdaab47d 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -2140,6 +2140,21 @@ static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, | |||
2140 | return 0; | 2140 | return 0; |
2141 | } | 2141 | } |
2142 | 2142 | ||
2143 | static int do_proc_douintvec_conv(bool *negp, unsigned long *lvalp, | ||
2144 | int *valp, | ||
2145 | int write, void *data) | ||
2146 | { | ||
2147 | if (write) { | ||
2148 | if (*negp) | ||
2149 | return -EINVAL; | ||
2150 | *valp = *lvalp; | ||
2151 | } else { | ||
2152 | unsigned int val = *valp; | ||
2153 | *lvalp = (unsigned long)val; | ||
2154 | } | ||
2155 | return 0; | ||
2156 | } | ||
2157 | |||
2143 | static const char proc_wspace_sep[] = { ' ', '\t', '\n' }; | 2158 | static const char proc_wspace_sep[] = { ' ', '\t', '\n' }; |
2144 | 2159 | ||
2145 | static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, | 2160 | static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, |
@@ -2259,8 +2274,27 @@ static int do_proc_dointvec(struct ctl_table *table, int write, | |||
2259 | int proc_dointvec(struct ctl_table *table, int write, | 2274 | int proc_dointvec(struct ctl_table *table, int write, |
2260 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2275 | void __user *buffer, size_t *lenp, loff_t *ppos) |
2261 | { | 2276 | { |
2262 | return do_proc_dointvec(table,write,buffer,lenp,ppos, | 2277 | return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL); |
2263 | NULL,NULL); | 2278 | } |
2279 | |||
2280 | /** | ||
2281 | * proc_douintvec - read a vector of unsigned integers | ||
2282 | * @table: the sysctl table | ||
2283 | * @write: %TRUE if this is a write to the sysctl file | ||
2284 | * @buffer: the user buffer | ||
2285 | * @lenp: the size of the user buffer | ||
2286 | * @ppos: file position | ||
2287 | * | ||
2288 | * Reads/writes up to table->maxlen/sizeof(unsigned int) unsigned integer | ||
2289 | * values from/to the user buffer, treated as an ASCII string. | ||
2290 | * | ||
2291 | * Returns 0 on success. | ||
2292 | */ | ||
2293 | int proc_douintvec(struct ctl_table *table, int write, | ||
2294 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
2295 | { | ||
2296 | return do_proc_dointvec(table, write, buffer, lenp, ppos, | ||
2297 | do_proc_douintvec_conv, NULL); | ||
2264 | } | 2298 | } |
2265 | 2299 | ||
2266 | /* | 2300 | /* |
@@ -2858,6 +2892,12 @@ int proc_dointvec(struct ctl_table *table, int write, | |||
2858 | return -ENOSYS; | 2892 | return -ENOSYS; |
2859 | } | 2893 | } |
2860 | 2894 | ||
2895 | int proc_douintvec(struct ctl_table *table, int write, | ||
2896 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
2897 | { | ||
2898 | return -ENOSYS; | ||
2899 | } | ||
2900 | |||
2861 | int proc_dointvec_minmax(struct ctl_table *table, int write, | 2901 | int proc_dointvec_minmax(struct ctl_table *table, int write, |
2862 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2902 | void __user *buffer, size_t *lenp, loff_t *ppos) |
2863 | { | 2903 | { |
@@ -2903,6 +2943,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write, | |||
2903 | * exception granted :-) | 2943 | * exception granted :-) |
2904 | */ | 2944 | */ |
2905 | EXPORT_SYMBOL(proc_dointvec); | 2945 | EXPORT_SYMBOL(proc_dointvec); |
2946 | EXPORT_SYMBOL(proc_douintvec); | ||
2906 | EXPORT_SYMBOL(proc_dointvec_jiffies); | 2947 | EXPORT_SYMBOL(proc_dointvec_jiffies); |
2907 | EXPORT_SYMBOL(proc_dointvec_minmax); | 2948 | EXPORT_SYMBOL(proc_dointvec_minmax); |
2908 | EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); | 2949 | EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); |