fault-inject: parse as natural 1-based value for fail-nth write interface

The value written to fail-nth file is parsed as 0-based.  Parsing as
one-based is more natural to understand and it enables to cancel the
previous setup by simply writing '0'.

This change also converts task->fail_nth from signed to unsigned int.

Link: http://lkml.kernel.org/r/1491490561-10485-3-git-send-email-akinobu.mita@gmail.com
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Akinobu Mita
2017-07-14 14:49:52 -07:00
committed by Linus Torvalds
parent ecaad81ca0
commit 9049f2f6e7
3 changed files with 8 additions and 10 deletions

View File

@@ -138,8 +138,8 @@ o proc entries
- /proc/self/task/<current-tid>/fail-nth: - /proc/self/task/<current-tid>/fail-nth:
Write to this file of integer N makes N-th call in the current task fail Write to this file of integer N makes N-th call in the task fail.
(N is 0-based). Read from this file returns a single char 'Y' or 'N' Read from this file returns a single char 'Y' or 'N'
that says if the fault setup with a previous write to this file was that says if the fault setup with a previous write to this file was
injected or not, and disables the fault if it wasn't yet injected. injected or not, and disables the fault if it wasn't yet injected.
Note that this file enables all types of faults (slab, futex, etc). Note that this file enables all types of faults (slab, futex, etc).
@@ -320,7 +320,7 @@ int main()
system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait"); system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait");
sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid)); sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid));
fail_nth = open(buf, O_RDWR); fail_nth = open(buf, O_RDWR);
for (i = 0;; i++) { for (i = 1;; i++) {
sprintf(buf, "%d", i); sprintf(buf, "%d", i);
write(fail_nth, buf, strlen(buf)); write(fail_nth, buf, strlen(buf));
res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds); res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
@@ -339,7 +339,6 @@ int main()
An example output: An example output:
0-th fault Y: res=-1/23
1-th fault Y: res=-1/23 1-th fault Y: res=-1/23
2-th fault Y: res=-1/23 2-th fault Y: res=-1/23
3-th fault Y: res=-1/12 3-th fault Y: res=-1/12

View File

@@ -1360,7 +1360,8 @@ static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct task_struct *task; struct task_struct *task;
int err, n; int err;
unsigned int n;
task = get_proc_task(file_inode(file)); task = get_proc_task(file_inode(file));
if (!task) if (!task)
@@ -1368,12 +1369,10 @@ static ssize_t proc_fail_nth_write(struct file *file, const char __user *buf,
put_task_struct(task); put_task_struct(task);
if (task != current) if (task != current)
return -EPERM; return -EPERM;
err = kstrtoint_from_user(buf, count, 0, &n); err = kstrtouint_from_user(buf, count, 0, &n);
if (err) if (err)
return err; return err;
if (n < 0 || n == INT_MAX) current->fail_nth = n;
return -EINVAL;
current->fail_nth = n + 1;
return count; return count;
} }

View File

@@ -974,7 +974,7 @@ struct task_struct {
#ifdef CONFIG_FAULT_INJECTION #ifdef CONFIG_FAULT_INJECTION
int make_it_fail; int make_it_fail;
int fail_nth; unsigned int fail_nth;
#endif #endif
/* /*
* When (nr_dirtied >= nr_dirtied_pause), it's time to call * When (nr_dirtied >= nr_dirtied_pause), it's time to call