|
@@ -208,12 +208,10 @@ static int max_extfrag_threshold = 1000;
|
|
|
#ifdef CONFIG_PROC_SYSCTL
|
|
|
|
|
|
static int _proc_do_string(char *data, int maxlen, int write,
|
|
|
- char __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos)
|
|
|
+ char *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
size_t len;
|
|
|
- char __user *p;
|
|
|
- char c;
|
|
|
+ char c, *p;
|
|
|
|
|
|
if (!data || !maxlen || !*lenp) {
|
|
|
*lenp = 0;
|
|
@@ -238,8 +236,7 @@ static int _proc_do_string(char *data, int maxlen, int write,
|
|
|
*ppos += *lenp;
|
|
|
p = buffer;
|
|
|
while ((p - buffer) < *lenp && len < maxlen - 1) {
|
|
|
- if (get_user(c, p++))
|
|
|
- return -EFAULT;
|
|
|
+ c = *(p++);
|
|
|
if (c == 0 || c == '\n')
|
|
|
break;
|
|
|
data[len++] = c;
|
|
@@ -261,11 +258,9 @@ static int _proc_do_string(char *data, int maxlen, int write,
|
|
|
if (len > *lenp)
|
|
|
len = *lenp;
|
|
|
if (len)
|
|
|
- if (copy_to_user(buffer, data, len))
|
|
|
- return -EFAULT;
|
|
|
+ memcpy(buffer, data, len);
|
|
|
if (len < *lenp) {
|
|
|
- if (put_user('\n', buffer + len))
|
|
|
- return -EFAULT;
|
|
|
+ buffer[len] = '\n';
|
|
|
len++;
|
|
|
}
|
|
|
*lenp = len;
|
|
@@ -326,13 +321,13 @@ static bool proc_first_pos_non_zero_ignore(loff_t *ppos,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_dostring(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
if (write)
|
|
|
proc_first_pos_non_zero_ignore(ppos, table);
|
|
|
|
|
|
- return _proc_do_string((char *)(table->data), table->maxlen, write,
|
|
|
- (char __user *)buffer, lenp, ppos);
|
|
|
+ return _proc_do_string(table->data, table->maxlen, write, buffer, lenp,
|
|
|
+ ppos);
|
|
|
}
|
|
|
|
|
|
static size_t proc_skip_spaces(char **buf)
|
|
@@ -463,11 +458,10 @@ static int proc_get_long(char **buf, size_t *size,
|
|
|
* @val: the integer to be converted
|
|
|
* @neg: sign of the number, %TRUE for negative
|
|
|
*
|
|
|
- * In case of success %0 is returned and @buf and @size are updated with
|
|
|
- * the amount of bytes written.
|
|
|
+ * In case of success @buf and @size are updated with the amount of bytes
|
|
|
+ * written.
|
|
|
*/
|
|
|
-static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
|
|
|
- bool neg)
|
|
|
+static void proc_put_long(void **buf, size_t *size, unsigned long val, bool neg)
|
|
|
{
|
|
|
int len;
|
|
|
char tmp[TMPBUFLEN], *p = tmp;
|
|
@@ -476,24 +470,22 @@ static int proc_put_long(void __user **buf, size_t *size, unsigned long val,
|
|
|
len = strlen(tmp);
|
|
|
if (len > *size)
|
|
|
len = *size;
|
|
|
- if (copy_to_user(*buf, tmp, len))
|
|
|
- return -EFAULT;
|
|
|
+ memcpy(*buf, tmp, len);
|
|
|
*size -= len;
|
|
|
*buf += len;
|
|
|
- return 0;
|
|
|
}
|
|
|
#undef TMPBUFLEN
|
|
|
|
|
|
-static int proc_put_char(void __user **buf, size_t *size, char c)
|
|
|
+static void proc_put_char(void **buf, size_t *size, char c)
|
|
|
{
|
|
|
if (*size) {
|
|
|
- char __user **buffer = (char __user **)buf;
|
|
|
- if (put_user(c, *buffer))
|
|
|
- return -EFAULT;
|
|
|
- (*size)--, (*buffer)++;
|
|
|
+ char **buffer = (char **)buf;
|
|
|
+ **buffer = c;
|
|
|
+
|
|
|
+ (*size)--;
|
|
|
+ (*buffer)++;
|
|
|
*buf = *buffer;
|
|
|
}
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp,
|
|
@@ -541,7 +533,7 @@ static int do_proc_douintvec_conv(unsigned long *lvalp,
|
|
|
static const char proc_wspace_sep[] = { ' ', '\t', '\n' };
|
|
|
|
|
|
static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
|
- int write, void __user *buffer,
|
|
|
+ int write, void *buffer,
|
|
|
size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
|
|
|
int write, void *data),
|
|
@@ -549,7 +541,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
|
{
|
|
|
int *i, vleft, first = 1, err = 0;
|
|
|
size_t left;
|
|
|
- char *kbuf = NULL, *p;
|
|
|
+ char *p;
|
|
|
|
|
|
if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) {
|
|
|
*lenp = 0;
|
|
@@ -569,9 +561,7 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
|
|
|
|
if (left > PAGE_SIZE - 1)
|
|
|
left = PAGE_SIZE - 1;
|
|
|
- p = kbuf = memdup_user_nul(buffer, left);
|
|
|
- if (IS_ERR(kbuf))
|
|
|
- return PTR_ERR(kbuf);
|
|
|
+ p = buffer;
|
|
|
}
|
|
|
|
|
|
for (; left && vleft--; i++, first=0) {
|
|
@@ -598,24 +588,17 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table,
|
|
|
break;
|
|
|
}
|
|
|
if (!first)
|
|
|
- err = proc_put_char(&buffer, &left, '\t');
|
|
|
- if (err)
|
|
|
- break;
|
|
|
- err = proc_put_long(&buffer, &left, lval, neg);
|
|
|
- if (err)
|
|
|
- break;
|
|
|
+ proc_put_char(&buffer, &left, '\t');
|
|
|
+ proc_put_long(&buffer, &left, lval, neg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!write && !first && left && !err)
|
|
|
- err = proc_put_char(&buffer, &left, '\n');
|
|
|
+ proc_put_char(&buffer, &left, '\n');
|
|
|
if (write && !err && left)
|
|
|
left -= proc_skip_spaces(&p);
|
|
|
- if (write) {
|
|
|
- kfree(kbuf);
|
|
|
- if (first)
|
|
|
- return err ? : -EINVAL;
|
|
|
- }
|
|
|
+ if (write && first)
|
|
|
+ return err ? : -EINVAL;
|
|
|
*lenp -= left;
|
|
|
out:
|
|
|
*ppos += *lenp;
|
|
@@ -623,7 +606,7 @@ out:
|
|
|
}
|
|
|
|
|
|
static int do_proc_dointvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos,
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(bool *negp, unsigned long *lvalp, int *valp,
|
|
|
int write, void *data),
|
|
|
void *data)
|
|
@@ -634,7 +617,7 @@ static int do_proc_dointvec(struct ctl_table *table, int write,
|
|
|
|
|
|
static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|
|
struct ctl_table *table,
|
|
|
- void __user *buffer,
|
|
|
+ void *buffer,
|
|
|
size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(unsigned long *lvalp,
|
|
|
unsigned int *valp,
|
|
@@ -645,7 +628,7 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|
|
int err = 0;
|
|
|
size_t left;
|
|
|
bool neg;
|
|
|
- char *kbuf = NULL, *p;
|
|
|
+ char *p = buffer;
|
|
|
|
|
|
left = *lenp;
|
|
|
|
|
@@ -655,10 +638,6 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|
|
if (left > PAGE_SIZE - 1)
|
|
|
left = PAGE_SIZE - 1;
|
|
|
|
|
|
- p = kbuf = memdup_user_nul(buffer, left);
|
|
|
- if (IS_ERR(kbuf))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
left -= proc_skip_spaces(&p);
|
|
|
if (!left) {
|
|
|
err = -EINVAL;
|
|
@@ -682,7 +661,6 @@ static int do_proc_douintvec_w(unsigned int *tbl_data,
|
|
|
left -= proc_skip_spaces(&p);
|
|
|
|
|
|
out_free:
|
|
|
- kfree(kbuf);
|
|
|
if (err)
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -694,7 +672,7 @@ bail_early:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int do_proc_douintvec_r(unsigned int *tbl_data, void __user *buffer,
|
|
|
+static int do_proc_douintvec_r(unsigned int *tbl_data, void *buffer,
|
|
|
size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(unsigned long *lvalp,
|
|
|
unsigned int *valp,
|
|
@@ -712,11 +690,11 @@ static int do_proc_douintvec_r(unsigned int *tbl_data, void __user *buffer,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- err = proc_put_long(&buffer, &left, lval, false);
|
|
|
- if (err || !left)
|
|
|
+ proc_put_long(&buffer, &left, lval, false);
|
|
|
+ if (!left)
|
|
|
goto out;
|
|
|
|
|
|
- err = proc_put_char(&buffer, &left, '\n');
|
|
|
+ proc_put_char(&buffer, &left, '\n');
|
|
|
|
|
|
out:
|
|
|
*lenp -= left;
|
|
@@ -726,7 +704,7 @@ out:
|
|
|
}
|
|
|
|
|
|
static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table,
|
|
|
- int write, void __user *buffer,
|
|
|
+ int write, void *buffer,
|
|
|
size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(unsigned long *lvalp,
|
|
|
unsigned int *valp,
|
|
@@ -762,7 +740,7 @@ static int __do_proc_douintvec(void *tbl_data, struct ctl_table *table,
|
|
|
}
|
|
|
|
|
|
static int do_proc_douintvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos,
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos,
|
|
|
int (*conv)(unsigned long *lvalp,
|
|
|
unsigned int *valp,
|
|
|
int write, void *data),
|
|
@@ -785,16 +763,15 @@ static int do_proc_douintvec(struct ctl_table *table, int write,
|
|
|
*
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
-int proc_dointvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+int proc_dointvec(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);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_COMPACTION
|
|
|
static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
|
|
|
- int write, void __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos)
|
|
|
+ int write, void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
int ret, old;
|
|
|
|
|
@@ -826,8 +803,8 @@ static int proc_dointvec_minmax_warn_RT_change(struct ctl_table *table,
|
|
|
*
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
-int proc_douintvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+int proc_douintvec(struct ctl_table *table, int write, void *buffer,
|
|
|
+ size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_douintvec(table, write, buffer, lenp, ppos,
|
|
|
do_proc_douintvec_conv, NULL);
|
|
@@ -838,7 +815,7 @@ int proc_douintvec(struct ctl_table *table, int write,
|
|
|
* This means we can safely use a temporary.
|
|
|
*/
|
|
|
static int proc_taint(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
struct ctl_table t;
|
|
|
unsigned long tmptaint = get_taint();
|
|
@@ -870,7 +847,7 @@ static int proc_taint(struct ctl_table *table, int write,
|
|
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
|
static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
if (write && !capable(CAP_SYS_ADMIN))
|
|
|
return -EPERM;
|
|
@@ -936,7 +913,7 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp,
|
|
|
* Returns 0 on success or -EINVAL on write when the range check fails.
|
|
|
*/
|
|
|
int proc_dointvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
struct do_proc_dointvec_minmax_conv_param param = {
|
|
|
.min = (int *) table->extra1,
|
|
@@ -1005,7 +982,7 @@ static int do_proc_douintvec_minmax_conv(unsigned long *lvalp,
|
|
|
* Returns 0 on success or -ERANGE on write when the range check fails.
|
|
|
*/
|
|
|
int proc_douintvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
struct do_proc_douintvec_minmax_conv_param param = {
|
|
|
.min = (unsigned int *) table->extra1,
|
|
@@ -1036,7 +1013,7 @@ static int do_proc_dopipe_max_size_conv(unsigned long *lvalp,
|
|
|
}
|
|
|
|
|
|
static int proc_dopipe_max_size(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_douintvec(table, write, buffer, lenp, ppos,
|
|
|
do_proc_dopipe_max_size_conv, NULL);
|
|
@@ -1057,7 +1034,7 @@ static void validate_coredump_safety(void)
|
|
|
}
|
|
|
|
|
|
static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
int error = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
|
|
if (!error)
|
|
@@ -1067,7 +1044,7 @@ static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write,
|
|
|
|
|
|
#ifdef CONFIG_COREDUMP
|
|
|
static int proc_dostring_coredump(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
int error = proc_dostring(table, write, buffer, lenp, ppos);
|
|
|
if (!error)
|
|
@@ -1078,7 +1055,7 @@ static int proc_dostring_coredump(struct ctl_table *table, int write,
|
|
|
|
|
|
#ifdef CONFIG_MAGIC_SYSRQ
|
|
|
static int sysrq_sysctl_handler(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
int tmp, ret;
|
|
|
|
|
@@ -1096,16 +1073,14 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write,
|
|
|
- void __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos,
|
|
|
- unsigned long convmul,
|
|
|
- unsigned long convdiv)
|
|
|
+static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table,
|
|
|
+ int write, void *buffer, size_t *lenp, loff_t *ppos,
|
|
|
+ unsigned long convmul, unsigned long convdiv)
|
|
|
{
|
|
|
unsigned long *i, *min, *max;
|
|
|
int vleft, first = 1, err = 0;
|
|
|
size_t left;
|
|
|
- char *kbuf = NULL, *p;
|
|
|
+ char *p;
|
|
|
|
|
|
if (!data || !table->maxlen || !*lenp || (*ppos && !write)) {
|
|
|
*lenp = 0;
|
|
@@ -1124,9 +1099,7 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
|
|
|
|
|
|
if (left > PAGE_SIZE - 1)
|
|
|
left = PAGE_SIZE - 1;
|
|
|
- p = kbuf = memdup_user_nul(buffer, left);
|
|
|
- if (IS_ERR(kbuf))
|
|
|
- return PTR_ERR(kbuf);
|
|
|
+ p = buffer;
|
|
|
}
|
|
|
|
|
|
for (; left && vleft--; i++, first = 0) {
|
|
@@ -1154,26 +1127,18 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int
|
|
|
*i = val;
|
|
|
} else {
|
|
|
val = convdiv * (*i) / convmul;
|
|
|
- if (!first) {
|
|
|
- err = proc_put_char(&buffer, &left, '\t');
|
|
|
- if (err)
|
|
|
- break;
|
|
|
- }
|
|
|
- err = proc_put_long(&buffer, &left, val, false);
|
|
|
- if (err)
|
|
|
- break;
|
|
|
+ if (!first)
|
|
|
+ proc_put_char(&buffer, &left, '\t');
|
|
|
+ proc_put_long(&buffer, &left, val, false);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!write && !first && left && !err)
|
|
|
- err = proc_put_char(&buffer, &left, '\n');
|
|
|
+ proc_put_char(&buffer, &left, '\n');
|
|
|
if (write && !err)
|
|
|
left -= proc_skip_spaces(&p);
|
|
|
- if (write) {
|
|
|
- kfree(kbuf);
|
|
|
- if (first)
|
|
|
- return err ? : -EINVAL;
|
|
|
- }
|
|
|
+ if (write && first)
|
|
|
+ return err ? : -EINVAL;
|
|
|
*lenp -= left;
|
|
|
out:
|
|
|
*ppos += *lenp;
|
|
@@ -1181,10 +1146,8 @@ out:
|
|
|
}
|
|
|
|
|
|
static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos,
|
|
|
- unsigned long convmul,
|
|
|
- unsigned long convdiv)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos, unsigned long convmul,
|
|
|
+ unsigned long convdiv)
|
|
|
{
|
|
|
return __do_proc_doulongvec_minmax(table->data, table, write,
|
|
|
buffer, lenp, ppos, convmul, convdiv);
|
|
@@ -1207,7 +1170,7 @@ static int do_proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_doulongvec_minmax(table, write, buffer, lenp, ppos, 1l, 1l);
|
|
|
}
|
|
@@ -1230,8 +1193,7 @@ int proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_doulongvec_minmax(table, write, buffer,
|
|
|
lenp, ppos, HZ, 1000l);
|
|
@@ -1325,7 +1287,7 @@ static int do_proc_dointvec_ms_jiffies_conv(bool *negp, unsigned long *lvalp,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_dointvec(table,write,buffer,lenp,ppos,
|
|
|
do_proc_dointvec_jiffies_conv,NULL);
|
|
@@ -1347,7 +1309,7 @@ int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_dointvec(table,write,buffer,lenp,ppos,
|
|
|
do_proc_dointvec_userhz_jiffies_conv,NULL);
|
|
@@ -1369,15 +1331,15 @@ int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
|
|
|
*
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
-int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+int proc_dointvec_ms_jiffies(struct ctl_table *table, int write, void *buffer,
|
|
|
+ size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return do_proc_dointvec(table, write, buffer, lenp, ppos,
|
|
|
do_proc_dointvec_ms_jiffies_conv, NULL);
|
|
|
}
|
|
|
|
|
|
-static int proc_do_cad_pid(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+static int proc_do_cad_pid(struct ctl_table *table, int write, void *buffer,
|
|
|
+ size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
struct pid *new_pid;
|
|
|
pid_t tmp;
|
|
@@ -1416,7 +1378,7 @@ static int proc_do_cad_pid(struct ctl_table *table, int write,
|
|
|
* Returns 0 on success.
|
|
|
*/
|
|
|
int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
int err = 0;
|
|
|
bool first = 1;
|
|
@@ -1432,7 +1394,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
}
|
|
|
|
|
|
if (write) {
|
|
|
- char *kbuf, *p;
|
|
|
+ char *p = buffer;
|
|
|
size_t skipped = 0;
|
|
|
|
|
|
if (left > PAGE_SIZE - 1) {
|
|
@@ -1441,15 +1403,9 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
skipped = *lenp - left;
|
|
|
}
|
|
|
|
|
|
- p = kbuf = memdup_user_nul(buffer, left);
|
|
|
- if (IS_ERR(kbuf))
|
|
|
- return PTR_ERR(kbuf);
|
|
|
-
|
|
|
tmp_bitmap = bitmap_zalloc(bitmap_len, GFP_KERNEL);
|
|
|
- if (!tmp_bitmap) {
|
|
|
- kfree(kbuf);
|
|
|
+ if (!tmp_bitmap)
|
|
|
return -ENOMEM;
|
|
|
- }
|
|
|
proc_skip_char(&p, &left, '\n');
|
|
|
while (!err && left) {
|
|
|
unsigned long val_a, val_b;
|
|
@@ -1513,7 +1469,6 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
first = 0;
|
|
|
proc_skip_char(&p, &left, '\n');
|
|
|
}
|
|
|
- kfree(kbuf);
|
|
|
left += skipped;
|
|
|
} else {
|
|
|
unsigned long bit_a, bit_b = 0;
|
|
@@ -1525,27 +1480,17 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
bit_b = find_next_zero_bit(bitmap, bitmap_len,
|
|
|
bit_a + 1) - 1;
|
|
|
|
|
|
- if (!first) {
|
|
|
- err = proc_put_char(&buffer, &left, ',');
|
|
|
- if (err)
|
|
|
- break;
|
|
|
- }
|
|
|
- err = proc_put_long(&buffer, &left, bit_a, false);
|
|
|
- if (err)
|
|
|
- break;
|
|
|
+ if (!first)
|
|
|
+ proc_put_char(&buffer, &left, ',');
|
|
|
+ proc_put_long(&buffer, &left, bit_a, false);
|
|
|
if (bit_a != bit_b) {
|
|
|
- err = proc_put_char(&buffer, &left, '-');
|
|
|
- if (err)
|
|
|
- break;
|
|
|
- err = proc_put_long(&buffer, &left, bit_b, false);
|
|
|
- if (err)
|
|
|
- break;
|
|
|
+ proc_put_char(&buffer, &left, '-');
|
|
|
+ proc_put_long(&buffer, &left, bit_b, false);
|
|
|
}
|
|
|
|
|
|
first = 0; bit_b++;
|
|
|
}
|
|
|
- if (!err)
|
|
|
- err = proc_put_char(&buffer, &left, '\n');
|
|
|
+ proc_put_char(&buffer, &left, '\n');
|
|
|
}
|
|
|
|
|
|
if (!err) {
|
|
@@ -1566,68 +1511,67 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
#else /* CONFIG_PROC_SYSCTL */
|
|
|
|
|
|
int proc_dostring(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_dointvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_douintvec(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *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)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_douintvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_dointvec_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_dointvec_userhz_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_dointvec_ms_jiffies(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_doulongvec_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int write,
|
|
|
- void __user *buffer,
|
|
|
- size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
- return -ENOSYS;
|
|
|
+ return -ENOSYS;
|
|
|
}
|
|
|
|
|
|
int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
return -ENOSYS;
|
|
|
}
|
|
@@ -1636,8 +1580,7 @@ int proc_do_large_bitmap(struct ctl_table *table, int write,
|
|
|
|
|
|
#if defined(CONFIG_SYSCTL)
|
|
|
int proc_do_static_key(struct ctl_table *table, int write,
|
|
|
- void __user *buffer, size_t *lenp,
|
|
|
- loff_t *ppos)
|
|
|
+ void *buffer, size_t *lenp, loff_t *ppos)
|
|
|
{
|
|
|
struct static_key *key = (struct static_key *)table->data;
|
|
|
static DEFINE_MUTEX(static_key_mutex);
|