aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fault-inject.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fault-inject.c')
-rw-r--r--lib/fault-inject.c144
1 files changed, 41 insertions, 103 deletions
diff --git a/lib/fault-inject.c b/lib/fault-inject.c
index 7e65af70635e..2577b121c7c1 100644
--- a/lib/fault-inject.c
+++ b/lib/fault-inject.c
@@ -8,7 +8,6 @@
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/interrupt.h> 9#include <linux/interrupt.h>
10#include <linux/stacktrace.h> 10#include <linux/stacktrace.h>
11#include <linux/kallsyms.h>
12#include <linux/fault-inject.h> 11#include <linux/fault-inject.h>
13 12
14/* 13/*
@@ -140,16 +139,6 @@ static int debugfs_ul_set(void *data, u64 val)
140 return 0; 139 return 0;
141} 140}
142 141
143#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
144static int debugfs_ul_set_MAX_STACK_TRACE_DEPTH(void *data, u64 val)
145{
146 *(unsigned long *)data =
147 val < MAX_STACK_TRACE_DEPTH ?
148 val : MAX_STACK_TRACE_DEPTH;
149 return 0;
150}
151#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
152
153static int debugfs_ul_get(void *data, u64 *val) 142static int debugfs_ul_get(void *data, u64 *val)
154{ 143{
155 *val = *(unsigned long *)data; 144 *val = *(unsigned long *)data;
@@ -165,16 +154,26 @@ static struct dentry *debugfs_create_ul(const char *name, mode_t mode,
165} 154}
166 155
167#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER 156#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
168DEFINE_SIMPLE_ATTRIBUTE(fops_ul_MAX_STACK_TRACE_DEPTH, debugfs_ul_get,
169 debugfs_ul_set_MAX_STACK_TRACE_DEPTH, "%llu\n");
170 157
171static struct dentry *debugfs_create_ul_MAX_STACK_TRACE_DEPTH( 158static int debugfs_stacktrace_depth_set(void *data, u64 val)
159{
160 *(unsigned long *)data =
161 min_t(unsigned long, val, MAX_STACK_TRACE_DEPTH);
162
163 return 0;
164}
165
166DEFINE_SIMPLE_ATTRIBUTE(fops_stacktrace_depth, debugfs_ul_get,
167 debugfs_stacktrace_depth_set, "%llu\n");
168
169static struct dentry *debugfs_create_stacktrace_depth(
172 const char *name, mode_t mode, 170 const char *name, mode_t mode,
173 struct dentry *parent, unsigned long *value) 171 struct dentry *parent, unsigned long *value)
174{ 172{
175 return debugfs_create_file(name, mode, parent, value, 173 return debugfs_create_file(name, mode, parent, value,
176 &fops_ul_MAX_STACK_TRACE_DEPTH); 174 &fops_stacktrace_depth);
177} 175}
176
178#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */ 177#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
179 178
180static int debugfs_atomic_t_set(void *data, u64 val) 179static int debugfs_atomic_t_set(void *data, u64 val)
@@ -200,48 +199,7 @@ static struct dentry *debugfs_create_atomic_t(const char *name, mode_t mode,
200 199
201void cleanup_fault_attr_dentries(struct fault_attr *attr) 200void cleanup_fault_attr_dentries(struct fault_attr *attr)
202{ 201{
203 debugfs_remove(attr->dentries.probability_file); 202 debugfs_remove_recursive(attr->dir);
204 attr->dentries.probability_file = NULL;
205
206 debugfs_remove(attr->dentries.interval_file);
207 attr->dentries.interval_file = NULL;
208
209 debugfs_remove(attr->dentries.times_file);
210 attr->dentries.times_file = NULL;
211
212 debugfs_remove(attr->dentries.space_file);
213 attr->dentries.space_file = NULL;
214
215 debugfs_remove(attr->dentries.verbose_file);
216 attr->dentries.verbose_file = NULL;
217
218 debugfs_remove(attr->dentries.task_filter_file);
219 attr->dentries.task_filter_file = NULL;
220
221#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
222
223 debugfs_remove(attr->dentries.stacktrace_depth_file);
224 attr->dentries.stacktrace_depth_file = NULL;
225
226 debugfs_remove(attr->dentries.require_start_file);
227 attr->dentries.require_start_file = NULL;
228
229 debugfs_remove(attr->dentries.require_end_file);
230 attr->dentries.require_end_file = NULL;
231
232 debugfs_remove(attr->dentries.reject_start_file);
233 attr->dentries.reject_start_file = NULL;
234
235 debugfs_remove(attr->dentries.reject_end_file);
236 attr->dentries.reject_end_file = NULL;
237
238#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
239
240 if (attr->dentries.dir)
241 WARN_ON(!simple_empty(attr->dentries.dir));
242
243 debugfs_remove(attr->dentries.dir);
244 attr->dentries.dir = NULL;
245} 203}
246 204
247int init_fault_attr_dentries(struct fault_attr *attr, const char *name) 205int init_fault_attr_dentries(struct fault_attr *attr, const char *name)
@@ -249,66 +207,46 @@ int init_fault_attr_dentries(struct fault_attr *attr, const char *name)
249 mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; 207 mode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
250 struct dentry *dir; 208 struct dentry *dir;
251 209
252 memset(&attr->dentries, 0, sizeof(attr->dentries));
253
254 dir = debugfs_create_dir(name, NULL); 210 dir = debugfs_create_dir(name, NULL);
255 if (!dir) 211 if (!dir)
256 goto fail; 212 return -ENOMEM;
257 attr->dentries.dir = dir;
258
259 attr->dentries.probability_file =
260 debugfs_create_ul("probability", mode, dir, &attr->probability);
261 213
262 attr->dentries.interval_file = 214 attr->dir = dir;
263 debugfs_create_ul("interval", mode, dir, &attr->interval);
264 215
265 attr->dentries.times_file = 216 if (!debugfs_create_ul("probability", mode, dir, &attr->probability))
266 debugfs_create_atomic_t("times", mode, dir, &attr->times); 217 goto fail;
267 218 if (!debugfs_create_ul("interval", mode, dir, &attr->interval))
268 attr->dentries.space_file = 219 goto fail;
269 debugfs_create_atomic_t("space", mode, dir, &attr->space); 220 if (!debugfs_create_atomic_t("times", mode, dir, &attr->times))
270 221 goto fail;
271 attr->dentries.verbose_file = 222 if (!debugfs_create_atomic_t("space", mode, dir, &attr->space))
272 debugfs_create_ul("verbose", mode, dir, &attr->verbose); 223 goto fail;
273 224 if (!debugfs_create_ul("verbose", mode, dir, &attr->verbose))
274 attr->dentries.task_filter_file = debugfs_create_bool("task-filter", 225 goto fail;
275 mode, dir, &attr->task_filter); 226 if (!debugfs_create_bool("task-filter", mode, dir, &attr->task_filter))
276
277 if (!attr->dentries.probability_file || !attr->dentries.interval_file ||
278 !attr->dentries.times_file || !attr->dentries.space_file ||
279 !attr->dentries.verbose_file || !attr->dentries.task_filter_file)
280 goto fail; 227 goto fail;
281 228
282#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER 229#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
283 230
284 attr->dentries.stacktrace_depth_file = 231 if (!debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir,
285 debugfs_create_ul_MAX_STACK_TRACE_DEPTH( 232 &attr->stacktrace_depth))
286 "stacktrace-depth", mode, dir, &attr->stacktrace_depth); 233 goto fail;
287 234 if (!debugfs_create_ul("require-start", mode, dir,
288 attr->dentries.require_start_file = 235 &attr->require_start))
289 debugfs_create_ul("require-start", mode, dir, &attr->require_start); 236 goto fail;
290 237 if (!debugfs_create_ul("require-end", mode, dir, &attr->require_end))
291 attr->dentries.require_end_file = 238 goto fail;
292 debugfs_create_ul("require-end", mode, dir, &attr->require_end); 239 if (!debugfs_create_ul("reject-start", mode, dir, &attr->reject_start))
293 240 goto fail;
294 attr->dentries.reject_start_file = 241 if (!debugfs_create_ul("reject-end", mode, dir, &attr->reject_end))
295 debugfs_create_ul("reject-start", mode, dir, &attr->reject_start);
296
297 attr->dentries.reject_end_file =
298 debugfs_create_ul("reject-end", mode, dir, &attr->reject_end);
299
300 if (!attr->dentries.stacktrace_depth_file ||
301 !attr->dentries.require_start_file ||
302 !attr->dentries.require_end_file ||
303 !attr->dentries.reject_start_file ||
304 !attr->dentries.reject_end_file)
305 goto fail; 242 goto fail;
306 243
307#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */ 244#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
308 245
309 return 0; 246 return 0;
310fail: 247fail:
311 cleanup_fault_attr_dentries(attr); 248 debugfs_remove_recursive(attr->dir);
249
312 return -ENOMEM; 250 return -ENOMEM;
313} 251}
314 252