Skip to content

Commit

Permalink
fault-inject: make fail-nth read/write interface symmetric
Browse files Browse the repository at this point in the history
The read interface for fail-nth looks a bit odd.  Read from this file
returns "NYYYY..." or "YYYYY..." (this makes me surprise when cat this
file).  Because there is no EOF condition.  The first character
indicates current->fail_nth is zero or not, and then current->fail_nth
is reset to zero.

Just returning task->fail_nth value is more natural to understand.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Akinobu Mita <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mita authored and torvalds committed Jul 14, 2017
1 parent 9049f2f commit bfc7409
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 14 deletions.
13 changes: 7 additions & 6 deletions Documentation/fault-injection/fault-injection.txt
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ o proc entries
- /proc/self/task/<current-tid>/fail-nth:

Write to this file of integer N makes N-th call in the task fail.
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
injected or not, and disables the fault if it wasn't yet injected.
Read from this file returns a integer value. A value of '0' indicates
that the fault setup with a previous write to this file was injected.
A positive integer N indicates that the fault wasn't yet injected.
Note that this file enables all types of faults (slab, futex, etc).
This setting takes precedence over all other generic debugfs settings
like probability, interval, times, etc. But per-capability settings
Expand Down Expand Up @@ -325,13 +325,14 @@ int main()
write(fail_nth, buf, strlen(buf));
res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
err = errno;
read(fail_nth, buf, 1);
pread(fail_nth, buf, sizeof(buf), 0);
if (res == 0) {
close(fds[0]);
close(fds[1]);
}
printf("%d-th fault %c: res=%d/%d\n", i, buf[0], res, err);
if (buf[0] != 'Y')
printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y',
res, err);
if (atoi(buf))
break;
}
return 0;
Expand Down
14 changes: 6 additions & 8 deletions fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -1380,21 +1380,19 @@ 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;
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;
len = snprintf(numbuf, sizeof(numbuf), "%u\n", task->fail_nth);
len = simple_read_from_buffer(buf, count, ppos, numbuf, len);

return len;
}

static const struct file_operations proc_fail_nth_operations = {
Expand Down

0 comments on commit bfc7409

Please sign in to comment.