]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/proc/base.c
fault-inject: add /proc/<pid>/fail-nth
[karo-tx-linux.git] / fs / proc / base.c
index f1e1927ccd484e7372fe2a38db7455468bbf06e8..719c2e943ea1028f22cd2e400b7b6f9289ca6791 100644 (file)
@@ -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),