|
@@ -40,10 +40,16 @@ EXPORT_SYMBOL_GPL(setup_fault_attr);
|
|
|
|
|
|
static void fail_dump(struct fault_attr *attr)
|
|
|
{
|
|
|
- if (attr->verbose > 0)
|
|
|
- printk(KERN_NOTICE "FAULT_INJECTION: forcing a failure\n");
|
|
|
- if (attr->verbose > 1)
|
|
|
- dump_stack();
|
|
|
+ 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->probability, attr->interval,
|
|
|
+ atomic_read(&attr->space),
|
|
|
+ atomic_read(&attr->times));
|
|
|
+ if (attr->verbose > 1)
|
|
|
+ dump_stack();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#define atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
|
|
@@ -202,6 +208,12 @@ struct dentry *fault_create_debugfs_attr(const char *name,
|
|
|
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;
|
|
|
|
|
@@ -222,6 +234,7 @@ struct dentry *fault_create_debugfs_attr(const char *name,
|
|
|
|
|
|
#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
|
|
|
|
|
|
+ attr->dname = dget(dir);
|
|
|
return dir;
|
|
|
fail:
|
|
|
debugfs_remove_recursive(dir);
|