diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index f1e1927ccd48..719c2e943ea1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1355,6 +1355,49 @@ static const struct file_operations proc_fault_inject_operations = {  	.write		= proc_fault_inject_write,  	.llseek		= generic_file_llseek,  }; + +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; +	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); + +	return count; +} + +static ssize_t proc_fail_nth_read(struct file *file, char __user *buf, +				  size_t count, loff_t *ppos) +{ +	struct task_struct *task; +	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); + +	return len; +} + +static const struct file_operations proc_fail_nth_operations = { +	.read		= proc_fail_nth_read, +	.write		= proc_fail_nth_write, +};  #endif @@ -2919,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), @@ -3311,6 +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), +	REG("fail-nth", 0644, proc_fail_nth_operations),  #endif  #ifdef CONFIG_TASK_IO_ACCOUNTING  	ONE("io",	S_IRUSR, proc_tid_io_accounting),  | 
