From: Akinobu Mita <akinobu.mita@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: ak@suse.de, akpm@osdl.org, Don Mullis <dwm@meer.net>
Subject: [patch 6/7] process filtering for fault-injection capabilities
Date: Thu, 12 Oct 2006 16:43:11 +0900 [thread overview]
Message-ID: <452df238.04819267.55ff.ffffd8a2@mx.google.com> (raw)
In-Reply-To: 20061012074305.047696736@gmail.com
[-- Attachment #1: process-filter.patch --]
[-- Type: text/plain, Size: 5821 bytes --]
From: Akinobu Mita <akinobu.mita@gmail.com>
This patch provides process filtering feature.
The process filter allows failing only permitted processes
by /proc/<pid>/make-it-fail
Please see the example that demostrates how to inject slab allocation
failures into module init/cleanup code
in Documentation/fault-injection/fault-injection.txt
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
fs/proc/base.c | 65 +++++++++++++++++++++++++++++++++++++++++++
include/linux/fault-inject.h | 2 +
include/linux/sched.h | 3 +
lib/fault-inject.c | 19 ++++++++++++
4 files changed, 89 insertions(+)
Index: work-fault-inject/fs/proc/base.c
===================================================================
--- work-fault-inject.orig/fs/proc/base.c
+++ work-fault-inject/fs/proc/base.c
@@ -776,6 +776,65 @@ static struct file_operations proc_login
};
#endif
+#ifdef CONFIG_FAULT_INJECTION
+static ssize_t proc_fault_inject_read(struct file * file, char __user * buf,
+ size_t count, loff_t *ppos)
+{
+ struct task_struct *task = get_proc_task(file->f_dentry->d_inode);
+ char buffer[PROC_NUMBUF];
+ size_t len;
+ int make_it_fail;
+ loff_t __ppos = *ppos;
+
+ if (!task)
+ return -ESRCH;
+ make_it_fail = task->make_it_fail;
+ put_task_struct(task);
+
+ len = snprintf(buffer, sizeof(buffer), "%i\n", make_it_fail);
+ if (__ppos >= len)
+ return 0;
+ if (count > len-__ppos)
+ count = len-__ppos;
+ if (copy_to_user(buf, buffer + __ppos, count))
+ return -EFAULT;
+ *ppos = __ppos + count;
+ return count;
+}
+
+static ssize_t proc_fault_inject_write(struct file * file,
+ const char __user * buf, size_t count, loff_t *ppos)
+{
+ struct task_struct *task;
+ char buffer[PROC_NUMBUF], *end;
+ int make_it_fail;
+
+ if (!capable(CAP_SYS_RESOURCE))
+ return -EPERM;
+ memset(buffer, 0, sizeof(buffer));
+ if (count > sizeof(buffer) - 1)
+ count = sizeof(buffer) - 1;
+ if (copy_from_user(buffer, buf, count))
+ return -EFAULT;
+ make_it_fail = simple_strtol(buffer, &end, 0);
+ if (*end == '\n')
+ end++;
+ task = get_proc_task(file->f_dentry->d_inode);
+ if (!task)
+ return -ESRCH;
+ task->make_it_fail = make_it_fail;
+ put_task_struct(task);
+ if (end - buffer == 0)
+ return -EIO;
+ return end - buffer;
+}
+
+static struct file_operations proc_fault_inject_operations = {
+ .read = proc_fault_inject_read,
+ .write = proc_fault_inject_write,
+};
+#endif
+
#ifdef CONFIG_SECCOMP
static ssize_t seccomp_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
@@ -1788,6 +1847,9 @@ static struct pid_entry tgid_base_stuff[
#ifdef CONFIG_AUDITSYSCALL
REG("loginuid", S_IWUSR|S_IRUGO, loginuid),
#endif
+#ifdef CONFIG_FAULT_INJECTION
+ REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+#endif
};
static int proc_tgid_base_readdir(struct file * filp,
@@ -2062,6 +2124,9 @@ static struct pid_entry tid_base_stuff[]
#ifdef CONFIG_AUDITSYSCALL
REG("loginuid", S_IWUSR|S_IRUGO, loginuid),
#endif
+#ifdef CONFIG_FAULT_INJECTION
+ REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+#endif
};
static int proc_tid_base_readdir(struct file * filp,
Index: work-fault-inject/include/linux/sched.h
===================================================================
--- work-fault-inject.orig/include/linux/sched.h
+++ work-fault-inject/include/linux/sched.h
@@ -1051,6 +1051,9 @@ struct task_struct {
#ifdef CONFIG_TASK_DELAY_ACCT
struct task_delay_info *delays;
#endif
+#ifdef CONFIG_FAULT_INJECTION
+ int make_it_fail;
+#endif
};
static inline pid_t process_group(struct task_struct *tsk)
Index: work-fault-inject/include/linux/fault-inject.h
===================================================================
--- work-fault-inject.orig/include/linux/fault-inject.h
+++ work-fault-inject/include/linux/fault-inject.h
@@ -17,6 +17,7 @@ struct fault_attr {
atomic_t times;
atomic_t space;
unsigned long verbose;
+ u32 task_filter;
unsigned long count;
@@ -30,6 +31,7 @@ struct fault_attr {
struct dentry *times_file;
struct dentry *space_file;
struct dentry *verbose_file;
+ struct dentry *task_filter_file;
} entries;
#endif
Index: work-fault-inject/lib/fault-inject.c
===================================================================
--- work-fault-inject.orig/lib/fault-inject.c
+++ work-fault-inject/lib/fault-inject.c
@@ -5,6 +5,7 @@
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/module.h>
+#include <linux/interrupt.h>
#include <linux/fault-inject.h>
int setup_fault_attr(struct fault_attr *attr, char *str)
@@ -58,6 +59,11 @@ static void fail_dump(struct fault_attr
dump_stack();
}
+static int fail_task(struct fault_attr *attr, struct task_struct *task)
+{
+ return !in_interrupt() && task->make_it_fail;
+}
+
/*
* This code is stolen from failmalloc-1.0
* http://www.nongnu.org/failmalloc/
@@ -65,6 +71,9 @@ static void fail_dump(struct fault_attr
int should_fail(struct fault_attr *attr, ssize_t size)
{
+ if (attr->task_filter && !fail_task(attr, current))
+ return 0;
+
if (atomic_read(&max_failures(attr)) == 0)
return 0;
@@ -155,6 +164,10 @@ void cleanup_fault_attr_entries(struct f
debugfs_remove(attr->entries.verbose_file);
attr->entries.verbose_file = NULL;
}
+ if (attr->entries.task_filter_file) {
+ debugfs_remove(attr->entries.task_filter_file);
+ attr->entries.task_filter_file = NULL;
+ }
debugfs_remove(attr->entries.dir);
attr->entries.dir = NULL;
}
@@ -198,6 +211,12 @@ int init_fault_attr_entries(struct fault
goto fail;
attr->entries.verbose_file = file;
+ file = debugfs_create_bool("task-filter", mode, dir,
+ &attr->task_filter);
+ if (!file)
+ goto fail;
+ attr->entries.task_filter_file = file;
+
return 0;
fail:
cleanup_fault_attr_entries(attr);
--
next prev parent reply other threads:[~2006-10-12 7:44 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20061012074305.047696736@gmail.com>
2006-10-12 7:43 ` [patch 1/7] documentation and scripts Akinobu Mita
2006-10-12 21:37 ` Andrew Morton
2006-10-13 17:47 ` Akinobu Mita
2006-10-13 19:01 ` Andrew Morton
2006-10-12 7:43 ` [patch 2/7] fault-injection capabilities infrastructure Akinobu Mita
2006-10-12 21:03 ` Andrew Morton
2006-10-12 7:43 ` [patch 3/7] fault-injection capability for kmalloc Akinobu Mita
2006-10-12 8:08 ` Pekka Enberg
2006-10-12 7:43 ` [patch 4/7] fault-injection capability for alloc_pages() Akinobu Mita
2006-10-12 21:40 ` Andrew Morton
2006-10-13 17:51 ` Akinobu Mita
2006-10-12 7:43 ` [patch 5/7] fault-injection capability for disk IO Akinobu Mita
2006-10-12 21:08 ` Andrew Morton
2006-10-13 7:03 ` Jens Axboe
2006-10-12 7:43 ` Akinobu Mita [this message]
2006-10-13 17:28 ` [patch 6/7] process filtering for fault-injection capabilities Don Mullis
2006-10-13 18:52 ` Andrew Morton
2006-10-12 7:43 ` [patch 7/7] stacktrace " Akinobu Mita
2006-10-12 21:20 ` Andrew Morton
2006-10-13 18:00 ` Akinobu Mita
2006-10-13 18:12 ` Akinobu Mita
2006-10-13 19:06 ` Andrew Morton
2006-10-13 19:03 ` Andrew Morton
[not found] <20061108174540.976625689@gmail.com>
2006-11-08 17:45 ` [patch 6/7] process " Akinobu Mita
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=452df238.04819267.55ff.ffffd8a2@mx.google.com \
--to=akinobu.mita@gmail.com \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=dwm@meer.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox