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,  	return 0;  } +static int do_proc_douintvec_conv(bool *negp, unsigned long *lvalp, +				 int *valp, +				 int write, void *data) +{ +	if (write) { +		if (*negp) +			return -EINVAL; +		*valp = *lvalp; +	} else { +		unsigned int val = *valp; +		*lvalp = (unsigned long)val; +	} +	return 0; +} +  static const char proc_wspace_sep[] = { ' ', '\t', '\n' };  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,  int proc_dointvec(struct ctl_table *table, int write,  		     void __user *buffer, size_t *lenp, loff_t *ppos)  { -    return do_proc_dointvec(table,write,buffer,lenp,ppos, -		    	    NULL,NULL); +	return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL); +} + +/** + * proc_douintvec - read a vector of unsigned integers + * @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) unsigned integer + * values from/to the user buffer, treated as an ASCII string. + * + * Returns 0 on success. + */ +int proc_douintvec(struct ctl_table *table, int write, +		     void __user *buffer, size_t *lenp, loff_t *ppos) +{ +	return do_proc_dointvec(table, write, buffer, lenp, ppos, +				do_proc_douintvec_conv, NULL);  }  /* @@ -2858,6 +2892,12 @@ int proc_dointvec(struct ctl_table *table, int write,  	return -ENOSYS;  } +int proc_douintvec(struct ctl_table *table, int write, +		  void __user *buffer, size_t *lenp, loff_t *ppos) +{ +	return -ENOSYS; +} +  int proc_dointvec_minmax(struct ctl_table *table, int write,  		    void __user *buffer, size_t *lenp, loff_t *ppos)  { @@ -2903,6 +2943,7 @@ int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,   * exception granted :-)   */  EXPORT_SYMBOL(proc_dointvec); +EXPORT_SYMBOL(proc_douintvec);  EXPORT_SYMBOL(proc_dointvec_jiffies);  EXPORT_SYMBOL(proc_dointvec_minmax);  EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); |