Commit 9049f2f6 authored by Akinobu Mita's avatar Akinobu Mita Committed by Linus Torvalds
Browse files

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: default avatarAkinobu Mita <akinobu.mita@gmail.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ecaad81c
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -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
+4 −5
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -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