cregit-Linux how code gets into the kernel

Release 4.7 lib/fault-inject.c

Directory: lib
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/random.h>
#include <linux/sched.h>
#include <linux/stat.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/export.h>
#include <linux/interrupt.h>
#include <linux/stacktrace.h>
#include <linux/fault-inject.h>

/*
 * setup_fault_attr() is a helper function for various __setup handlers, so it
 * returns 0 on error, because that is what __setup handlers do.
 */

int setup_fault_attr(struct fault_attr *attr, char *str) { unsigned long probability; unsigned long interval; int times; int space; /* "<interval>,<probability>,<space>,<times>" */ if (sscanf(str, "%lu,%lu,%d,%d", &interval, &probability, &space, &times) < 4) { printk(KERN_WARNING "FAULT_INJECTION: failed to parse arguments\n"); return 0; } attr->probability = probability; attr->interval = interval; atomic_set(&attr->times, times); atomic_set(&attr->space, space); return 1; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita98100.00%1100.00%
Total98100.00%1100.00%

EXPORT_SYMBOL_GPL(setup_fault_attr);
static void fail_dump(struct fault_attr *attr) { if (attr->verbose > 0 && __ratelimit(&attr->ratelimit_state)) { printk(KERN_NOTICE "FAULT_INJECTION: forcing a failure.\n" "name %pd, interval %lu, probability %lu, " "space %d, times %d\n", attr->dname, attr->interval, attr->probability, atomic_read(&attr->space), atomic_read(&attr->times)); if (attr->verbose > 1) dump_stack(); } }

Contributors

PersonTokensPropCommitsCommitProp
dmitriy monakhovdmitriy monakhov3951.32%133.33%
akinobu mitaakinobu mita3546.05%133.33%
florian westphalflorian westphal22.63%133.33%
Total76100.00%3100.00%

#define atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
static bool fail_task(struct fault_attr *attr, struct task_struct *task) { return !in_interrupt() && task->make_it_fail; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita2496.00%150.00%
don mullisdon mullis14.00%150.00%
Total25100.00%2100.00%

#define MAX_STACK_TRACE_DEPTH 32 #ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
static bool fail_stacktrace(struct fault_attr *attr) { struct stack_trace trace; int depth = attr->stacktrace_depth; unsigned long entries[MAX_STACK_TRACE_DEPTH]; int n; bool found = (attr->require_start == 0 && attr->require_end == ULONG_MAX); if (depth == 0) return found; trace.nr_entries = 0; trace.entries = entries; trace.max_entries = depth; trace.skip = 1; save_stack_trace(&trace); for (n = 0; n < trace.nr_entries; n++) { if (attr->reject_start <= entries[n] && entries[n] < attr->reject_end) return false; if (attr->require_start <= entries[n] && entries[n] < attr->require_end) found = true; } return found; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita15298.06%150.00%
don mullisdon mullis31.94%150.00%
Total155100.00%2100.00%

#else
static inline bool fail_stacktrace(struct fault_attr *attr) { return true; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita1493.33%266.67%
don mullisdon mullis16.67%133.33%
Total15100.00%3100.00%

#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */ /* * This code is stolen from failmalloc-1.0 * http://www.nongnu.org/failmalloc/ */
bool should_fail(struct fault_attr *attr, ssize_t size) { /* No need to check any other properties if the probability is 0 */ if (attr->probability == 0) return false; if (attr->task_filter && !fail_task(attr, current)) return false; if (atomic_read(&attr->times) == 0) return false; if (atomic_read(&attr->space) > size) { atomic_sub(size, &attr->space); return false; } if (attr->interval > 1) { attr->count++; if (attr->count % attr->interval) return false; } if (attr->probability <= prandom_u32() % 100) return false; if (!fail_stacktrace(attr)) return false; fail_dump(attr); if (atomic_read(&attr->times) != -1) atomic_dec_not_zero(&attr->times); return true; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita13581.33%350.00%
don mullisdon mullis1911.45%233.33%
anton blanchardanton blanchard127.23%116.67%
Total166100.00%6100.00%

EXPORT_SYMBOL_GPL(should_fail); #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
static int debugfs_ul_set(void *data, u64 val) { *(unsigned long *)data = val; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita2284.62%150.00%
christoph hellwigchristoph hellwig415.38%150.00%
Total26100.00%2100.00%


static int debugfs_ul_get(void *data, u64 *val) { *val = *(unsigned long *)data; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita1760.71%150.00%
christoph hellwigchristoph hellwig1139.29%150.00%
Total28100.00%2100.00%

DEFINE_SIMPLE_ATTRIBUTE(fops_ul, debugfs_ul_get, debugfs_ul_set, "%llu\n");
static struct dentry *debugfs_create_ul(const char *name, umode_t mode, struct dentry *parent, unsigned long *value) { return debugfs_create_file(name, mode, parent, value, &fops_ul); }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita4097.56%150.00%
al viroal viro12.44%150.00%
Total41100.00%2100.00%

#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
static int debugfs_stacktrace_depth_set(void *data, u64 val) { *(unsigned long *)data = min_t(unsigned long, val, MAX_STACK_TRACE_DEPTH); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita33100.00%1100.00%
Total33100.00%1100.00%

DEFINE_SIMPLE_ATTRIBUTE(fops_stacktrace_depth, debugfs_ul_get, debugfs_stacktrace_depth_set, "%llu\n");
static struct dentry *debugfs_create_stacktrace_depth( const char *name, umode_t mode, struct dentry *parent, unsigned long *value) { return debugfs_create_file(name, mode, parent, value, &fops_stacktrace_depth); }

Contributors

PersonTokensPropCommitsCommitProp
don mullisdon mullis3892.68%133.33%
akinobu mitaakinobu mita24.88%133.33%
al viroal viro12.44%133.33%
Total41100.00%3100.00%

#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
struct dentry *fault_create_debugfs_attr(const char *name, struct dentry *parent, struct fault_attr *attr) { umode_t mode = S_IFREG | S_IRUSR | S_IWUSR; struct dentry *dir; dir = debugfs_create_dir(name, parent); if (!dir) return ERR_PTR(-ENOMEM); if (!debugfs_create_ul("probability", mode, dir, &attr->probability)) goto fail; if (!debugfs_create_ul("interval", mode, dir, &attr->interval)) goto fail; if (!debugfs_create_atomic_t("times", mode, dir, &attr->times)) goto fail; if (!debugfs_create_atomic_t("space", mode, dir, &attr->space)) goto fail; if (!debugfs_create_ul("verbose", mode, dir, &attr->verbose)) goto fail; if (!debugfs_create_u32("verbose_ratelimit_interval_ms", mode, dir, &attr->ratelimit_state.interval)) goto fail; if (!debugfs_create_u32("verbose_ratelimit_burst", mode, dir, &attr->ratelimit_state.burst)) goto fail; if (!debugfs_create_bool("task-filter", mode, dir, &attr->task_filter)) goto fail; #ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER if (!debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir, &attr->stacktrace_depth)) goto fail; if (!debugfs_create_ul("require-start", mode, dir, &attr->require_start)) goto fail; if (!debugfs_create_ul("require-end", mode, dir, &attr->require_end)) goto fail; if (!debugfs_create_ul("reject-start", mode, dir, &attr->reject_start)) goto fail; if (!debugfs_create_ul("reject-end", mode, dir, &attr->reject_end)) goto fail; #endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */ attr->dname = dget(dir); return dir; fail: debugfs_remove_recursive(dir); return ERR_PTR(-ENOMEM); }

Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita29984.70%777.78%
dmitriy monakhovdmitriy monakhov5315.01%111.11%
al viroal viro10.28%111.11%
Total353100.00%9100.00%

EXPORT_SYMBOL_GPL(fault_create_debugfs_attr); #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */

Overall Contributors

PersonTokensPropCommitsCommitProp
akinobu mitaakinobu mita93680.69%838.10%
dmitriy monakhovdmitriy monakhov927.93%14.76%
don mullisdon mullis756.47%314.29%
per forlinper forlin151.29%29.52%
christoph hellwigchristoph hellwig151.29%14.76%
anton blanchardanton blanchard121.03%14.76%
stephen rothwellstephen rothwell60.52%14.76%
al viroal viro30.26%14.76%
alexey dobriyanalexey dobriyan30.26%14.76%
florian westphalflorian westphal20.17%14.76%
paul gortmakerpaul gortmaker10.09%14.76%
Total1160100.00%21100.00%
Directory: lib
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}