diff options
author | Linus Torvalds | 2017-07-14 21:57:25 -0700 |
---|---|---|
committer | Linus Torvalds | 2017-07-14 21:57:25 -0700 |
commit | 867eacd7fb975273703766f52f485f08471a1ae9 (patch) | |
tree | be3c024c940d34331d5329a61a8e2be64f21da17 /fs | |
parent | 077d2ba519b2e8bf1abd80cbade699b1de42cafe (diff) | |
parent | 6d7964a722afc8e4f880b947f174009063028c99 (diff) |
Merge branch 'akpm' (patches from Andrew)
Merge even more updates from Andrew Morton:
- a few leftovers
- fault-injector rework
- add a module loader test driver
* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
kmod: throttle kmod thread limit
kmod: add test driver to stress test the module loader
MAINTAINERS: give kmod some maintainer love
xtensa: use generic fb.h
fault-inject: add /proc/<pid>/fail-nth
fault-inject: simplify access check for fail-nth
fault-inject: make fail-nth read/write interface symmetric
fault-inject: parse as natural 1-based value for fail-nth write interface
fault-inject: automatically detect the number base for fail-nth write interface
kernel/watchdog.c: use better pr_fmt prefix
MAINTAINERS: move the befs tree to kernel.org
lib/atomic64_test.c: add a test that atomic64_inc_not_zero() returns an int
mm: fix overflow check in expand_upwards()
Diffstat (limited to 'fs')
-rw-r--r-- | fs/proc/base.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 88b773f318cd..719c2e943ea1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1360,20 +1360,19 @@ static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct task_struct *task; - int err, n; + int err; + unsigned int n; + + err = kstrtouint_from_user(buf, count, 0, &n); + if (err) + return err; task = get_proc_task(file_inode(file)); if (!task) return -ESRCH; + WRITE_ONCE(task->fail_nth, n); put_task_struct(task); - if (task != current) - return -EPERM; - err = kstrtoint_from_user(buf, count, 10, &n); - if (err) - return err; - if (n < 0 || n == INT_MAX) - return -EINVAL; - current->fail_nth = n + 1; + return count; } @@ -1381,21 +1380,18 @@ static ssize_t proc_fail_nth_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct task_struct *task; - int err; + char numbuf[PROC_NUMBUF]; + ssize_t len; task = get_proc_task(file_inode(file)); if (!task) return -ESRCH; + len = snprintf(numbuf, sizeof(numbuf), "%u\n", + READ_ONCE(task->fail_nth)); + len = simple_read_from_buffer(buf, count, ppos, numbuf, len); put_task_struct(task); - if (task != current) - return -EPERM; - if (count < 1) - return -EINVAL; - err = put_user((char)(current->fail_nth ? 'N' : 'Y'), buf); - if (err) - return err; - current->fail_nth = 0; - return 1; + + return len; } static const struct file_operations proc_fail_nth_operations = { @@ -2966,6 +2962,7 @@ static const struct pid_entry tgid_base_stuff[] = { #endif #ifdef CONFIG_FAULT_INJECTION REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations), + REG("fail-nth", 0644, proc_fail_nth_operations), #endif #ifdef CONFIG_ELF_CORE REG("coredump_filter", S_IRUGO|S_IWUSR, proc_coredump_filter_operations), @@ -3358,11 +3355,7 @@ static const struct pid_entry tid_base_stuff[] = { #endif #ifdef CONFIG_FAULT_INJECTION REG("make-it-fail", S_IRUGO|S_IWUSR, proc_fault_inject_operations), - /* - * Operations on the file check that the task is current, - * so we create it with 0666 to support testing under unprivileged user. - */ - REG("fail-nth", 0666, proc_fail_nth_operations), + REG("fail-nth", 0644, proc_fail_nth_operations), #endif #ifdef CONFIG_TASK_IO_ACCOUNTING ONE("io", S_IRUSR, proc_tid_io_accounting), |