}
static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
- int *valp,
- int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
if (write) {
if (*negp) {
}
static int do_proc_douintvec_conv(unsigned long *lvalp,
- unsigned int *valp,
- int write, void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table)
{
if (write) {
if (*lvalp > UINT_MAX)
int write, void *buffer,
size_t *lenp, loff_t *ppos,
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
- int write, void *data),
- void *data)
+ int write, const struct ctl_table *table))
{
int *i, vleft, first = 1, err = 0;
size_t left;
sizeof(proc_wspace_sep), NULL);
if (err)
break;
- if (conv(&neg, &lval, i, 1, data)) {
+ if (conv(&neg, &lval, i, 1, table)) {
err = -EINVAL;
break;
}
} else {
- if (conv(&neg, &lval, i, 0, data)) {
+ if (conv(&neg, &lval, i, 0, table)) {
err = -EINVAL;
break;
}
static int do_proc_dointvec(const struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos,
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
- int write, void *data),
- void *data)
+ int write, const struct ctl_table *table))
{
return __do_proc_dointvec(table->data, table, write,
- buffer, lenp, ppos, conv, data);
+ buffer, lenp, ppos, conv);
}
static int do_proc_douintvec_w(unsigned int *tbl_data,
void *buffer,
size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp,
- unsigned int *valp,
- int write, void *data),
- void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table))
{
unsigned long lval;
int err = 0;
goto out_free;
}
- if (conv(&lval, tbl_data, 1, data)) {
+ if (conv(&lval, tbl_data, 1, table)) {
err = -EINVAL;
goto out_free;
}
return err;
}
-static int do_proc_douintvec_r(unsigned int *tbl_data, void *buffer,
+static int do_proc_douintvec_r(unsigned int *tbl_data,
+ const struct ctl_table *table, void *buffer,
size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp,
- unsigned int *valp,
- int write, void *data),
- void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table))
{
unsigned long lval;
int err = 0;
left = *lenp;
- if (conv(&lval, tbl_data, 0, data)) {
+ if (conv(&lval, tbl_data, 0, table)) {
err = -EINVAL;
goto out;
}
int write, void *buffer,
size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp,
- unsigned int *valp,
- int write, void *data),
- void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table))
{
unsigned int *i, vleft;
if (write)
return do_proc_douintvec_w(i, table, buffer, lenp, ppos,
- conv, data);
- return do_proc_douintvec_r(i, buffer, lenp, ppos, conv, data);
+ conv);
+ return do_proc_douintvec_r(i, table, buffer, lenp, ppos, conv);
}
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, void *data),
- void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table))
{
- return __do_proc_douintvec(table->data, table, write,
- buffer, lenp, ppos, conv, data);
+ return __do_proc_douintvec(table->data, table, write, buffer, lenp,
+ ppos, conv);
}
/**
int proc_dointvec(const struct ctl_table *table, int write, void *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);
}
/**
size_t *lenp, loff_t *ppos)
{
return do_proc_douintvec(table, write, buffer, lenp, ppos,
- do_proc_douintvec_conv, NULL);
+ do_proc_douintvec_conv);
}
-/**
- * struct do_proc_dointvec_minmax_conv_param - proc_dointvec_minmax() range checking structure
- * @min: pointer to minimum allowable value
- * @max: pointer to maximum allowable value
- *
- * The do_proc_dointvec_minmax_conv_param structure provides the
- * minimum and maximum values for doing range checking for those sysctl
- * parameters that use the proc_dointvec_minmax() handler.
- */
-struct do_proc_dointvec_minmax_conv_param {
- int *min;
- int *max;
-};
-
static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
- int *valp,
- int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
- int tmp, ret;
- struct do_proc_dointvec_minmax_conv_param *param = data;
+ int tmp, ret, *min, *max;
/*
* If writing, first do so via a temporary local int so we can
* bounds-check it before touching *valp.
*/
int *ip = write ? &tmp : valp;
- ret = do_proc_dointvec_conv(negp, lvalp, ip, write, data);
+ ret = do_proc_dointvec_conv(negp, lvalp, ip, write, table);
if (ret)
return ret;
if (write) {
- if ((param->min && *param->min > tmp) ||
- (param->max && *param->max < tmp))
+ min = (int *) table->extra1;
+ max = (int *) table->extra2;
+ if ((min && *min > tmp) || (max && *max < tmp))
return -EINVAL;
WRITE_ONCE(*valp, tmp);
}
int proc_dointvec_minmax(const struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
- struct do_proc_dointvec_minmax_conv_param param = {
- .min = (int *) table->extra1,
- .max = (int *) table->extra2,
- };
return do_proc_dointvec(table, write, buffer, lenp, ppos,
- do_proc_dointvec_minmax_conv, ¶m);
+ do_proc_dointvec_minmax_conv);
}
-/**
- * struct do_proc_douintvec_minmax_conv_param - proc_douintvec_minmax() range checking structure
- * @min: pointer to minimum allowable value
- * @max: pointer to maximum allowable value
- *
- * The do_proc_douintvec_minmax_conv_param structure provides the
- * minimum and maximum values for doing range checking for those sysctl
- * parameters that use the proc_douintvec_minmax() handler.
- */
-struct do_proc_douintvec_minmax_conv_param {
- unsigned int *min;
- unsigned int *max;
-};
-
static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
- unsigned int *valp,
- int write, void *data)
+ unsigned int *valp, int write,
+ const struct ctl_table *table)
{
int ret;
- unsigned int tmp;
- struct do_proc_douintvec_minmax_conv_param *param = data;
+ unsigned int tmp, *min, *max;
/* write via temporary local uint for bounds-checking */
unsigned int *up = write ? &tmp : valp;
- ret = do_proc_douintvec_conv(lvalp, up, write, data);
+ ret = do_proc_douintvec_conv(lvalp, up, write, table);
if (ret)
return ret;
if (write) {
- if ((param->min && *param->min > tmp) ||
- (param->max && *param->max < tmp))
+ min = (unsigned int *) table->extra1;
+ max = (unsigned int *) table->extra2;
+ if ((min && *min > tmp) || (max && *max < tmp))
return -ERANGE;
WRITE_ONCE(*valp, tmp);
int proc_douintvec_minmax(const struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
- struct do_proc_douintvec_minmax_conv_param param = {
- .min = (unsigned int *) table->extra1,
- .max = (unsigned int *) table->extra2,
- };
return do_proc_douintvec(table, write, buffer, lenp, ppos,
- do_proc_douintvec_minmax_conv, ¶m);
+ do_proc_douintvec_minmax_conv);
}
/**
struct ctl_table tmp;
unsigned int min = 0, max = 255U, val;
u8 *data = table->data;
- struct do_proc_douintvec_minmax_conv_param param = {
- .min = &min,
- .max = &max,
- };
int res;
/* Do not support arrays yet. */
if (table->maxlen != sizeof(u8))
return -EINVAL;
- if (table->extra1)
- min = *(unsigned int *) table->extra1;
- if (table->extra2)
- max = *(unsigned int *) table->extra2;
-
tmp = *table;
tmp.maxlen = sizeof(val);
tmp.data = &val;
+ if (!tmp.extra1)
+ tmp.extra1 = (unsigned int *) &min;
+ if (!tmp.extra2)
+ tmp.extra2 = (unsigned int *) &max;
+
val = READ_ONCE(*data);
res = do_proc_douintvec(&tmp, write, buffer, lenp, ppos,
- do_proc_douintvec_minmax_conv, ¶m);
+ do_proc_douintvec_minmax_conv);
if (res)
return res;
if (write)
static int do_proc_dointvec_jiffies_conv(bool *negp, unsigned long *lvalp,
- int *valp,
- int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
if (write) {
if (*lvalp > INT_MAX / HZ)
}
static int do_proc_dointvec_userhz_jiffies_conv(bool *negp, unsigned long *lvalp,
- int *valp,
- int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
if (write) {
if (USER_HZ < HZ && *lvalp > (LONG_MAX / HZ) * USER_HZ)
}
static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
- int *valp,
- int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
if (write) {
unsigned long jif = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
}
static int do_proc_dointvec_ms_jiffies_minmax_conv(bool *negp, unsigned long *lvalp,
- int *valp, int write, void *data)
+ int *valp, int write,
+ const struct ctl_table *table)
{
- int tmp, ret;
- struct do_proc_dointvec_minmax_conv_param *param = data;
+ int tmp, ret, *min, *max;
/*
* If writing, first do so via a temporary local int so we can
* bounds-check it before touching *valp.
*/
int *ip = write ? &tmp : valp;
- ret = do_proc_dointvec_ms_jiffies_conv(negp, lvalp, ip, write, data);
+ ret = do_proc_dointvec_ms_jiffies_conv(negp, lvalp, ip, write, table);
if (ret)
return ret;
if (write) {
- if ((param->min && *param->min > tmp) ||
- (param->max && *param->max < tmp))
+ min = (int *) table->extra1;
+ max = (int *) table->extra2;
+ if ((min && *min > tmp) || (max && *max < tmp))
return -EINVAL;
*valp = tmp;
}
void *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table,write,buffer,lenp,ppos,
- do_proc_dointvec_jiffies_conv,NULL);
+ do_proc_dointvec_jiffies_conv);
}
int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
- struct do_proc_dointvec_minmax_conv_param param = {
- .min = (int *) table->extra1,
- .max = (int *) table->extra2,
- };
return do_proc_dointvec(table, write, buffer, lenp, ppos,
- do_proc_dointvec_ms_jiffies_minmax_conv, ¶m);
+ do_proc_dointvec_ms_jiffies_minmax_conv);
}
/**
void *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos,
- do_proc_dointvec_userhz_jiffies_conv, NULL);
+ do_proc_dointvec_userhz_jiffies_conv);
}
/**
size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos,
- do_proc_dointvec_ms_jiffies_conv, NULL);
+ do_proc_dointvec_ms_jiffies_conv);
}
/**