]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/proc/base.c
fault-inject: automatically detect the number base for fail-nth write interface
[karo-tx-linux.git] / fs / proc / base.c
index f1e1927ccd484e7372fe2a38db7455468bbf06e8..5d93512beea11878efe6cd2984e84ba23a728c51 100644 (file)
@@ -1355,6 +1355,53 @@ 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, n;
+
+       task = get_proc_task(file_inode(file));
+       if (!task)
+               return -ESRCH;
+       put_task_struct(task);
+       if (task != current)
+               return -EPERM;
+       err = kstrtoint_from_user(buf, count, 0, &n);
+       if (err)
+               return err;
+       if (n < 0 || n == INT_MAX)
+               return -EINVAL;
+       current->fail_nth = n + 1;
+       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;
+       int err;
+
+       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;
+}
+
+static const struct file_operations proc_fail_nth_operations = {
+       .read           = proc_fail_nth_read,
+       .write          = proc_fail_nth_write,
+};
 #endif
 
 
@@ -3311,6 +3358,11 @@ 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),
+       /*
+        * Operations on the file check that the task is current,
+        * so we create it with 0666 to support testing under unprivileged user.
+        */
+       REG("fail-nth", 0666, proc_fail_nth_operations),
 #endif
 #ifdef CONFIG_TASK_IO_ACCOUNTING
        ONE("io",       S_IRUSR, proc_tid_io_accounting),