Skip to content

Commit dd48c08

Browse files
mitatorvalds
authored andcommitted
fault-injection: add ability to export fault_attr in arbitrary directory
init_fault_attr_dentries() is used to export fault_attr via debugfs. But it can only export it in debugfs root directory. Per Forlin is working on mmc_fail_request which adds support to inject data errors after a completed host transfer in MMC subsystem. The fault_attr for mmc_fail_request should be defined per mmc host and export it in debugfs directory per mmc host like /sys/kernel/debug/mmc0/mmc_fail_request. init_fault_attr_dentries() doesn't help for mmc_fail_request. So this introduces fault_create_debugfs_attr() which is able to create a directory in the arbitrary directory and replace init_fault_attr_dentries(). [[email protected]: extraneous semicolon, per Randy] Signed-off-by: Akinobu Mita <[email protected]> Tested-by: Per Forlin <[email protected]> Cc: Jens Axboe <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Pekka Enberg <[email protected]> Cc: Matt Mackall <[email protected]> Cc: Randy Dunlap <[email protected]> Cc: Stephen Rothwell <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent f48d191 commit dd48c08

File tree

7 files changed

+33
-46
lines changed

7 files changed

+33
-46
lines changed

Documentation/fault-injection/fault-injection.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ o provide a way to configure fault attributes
143143
failslab, fail_page_alloc, and fail_make_request use this way.
144144
Helper functions:
145145

146-
init_fault_attr_dentries(entries, attr, name);
147-
void cleanup_fault_attr_dentries(entries);
146+
fault_create_debugfs_attr(name, parent, attr);
148147

149148
- module parameters
150149

block/blk-core.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -1368,8 +1368,10 @@ static bool should_fail_request(struct hd_struct *part, unsigned int bytes)
13681368

13691369
static int __init fail_make_request_debugfs(void)
13701370
{
1371-
return init_fault_attr_dentries(&fail_make_request,
1372-
"fail_make_request");
1371+
struct dentry *dir = fault_create_debugfs_attr("fail_make_request",
1372+
NULL, &fail_make_request);
1373+
1374+
return IS_ERR(dir) ? PTR_ERR(dir) : 0;
13731375
}
13741376

13751377
late_initcall(fail_make_request_debugfs);

block/blk-timeout.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ int blk_should_fake_timeout(struct request_queue *q)
2828

2929
static int __init fail_io_timeout_debugfs(void)
3030
{
31-
return init_fault_attr_dentries(&fail_io_timeout, "fail_io_timeout");
31+
struct dentry *dir = fault_create_debugfs_attr("fail_io_timeout",
32+
NULL, &fail_io_timeout);
33+
34+
return IS_ERR(dir) ? PTR_ERR(dir) : 0;
3235
}
3336

3437
late_initcall(fail_io_timeout_debugfs);

include/linux/fault-inject.h

+5-13
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ struct fault_attr {
2525
unsigned long reject_end;
2626

2727
unsigned long count;
28-
29-
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
30-
struct dentry *dir;
31-
#endif
3228
};
3329

3430
#define FAULT_ATTR_INITIALIZER { \
@@ -45,19 +41,15 @@ bool should_fail(struct fault_attr *attr, ssize_t size);
4541

4642
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
4743

48-
int init_fault_attr_dentries(struct fault_attr *attr, const char *name);
49-
void cleanup_fault_attr_dentries(struct fault_attr *attr);
44+
struct dentry *fault_create_debugfs_attr(const char *name,
45+
struct dentry *parent, struct fault_attr *attr);
5046

5147
#else /* CONFIG_FAULT_INJECTION_DEBUG_FS */
5248

53-
static inline int init_fault_attr_dentries(struct fault_attr *attr,
54-
const char *name)
55-
{
56-
return -ENODEV;
57-
}
58-
59-
static inline void cleanup_fault_attr_dentries(struct fault_attr *attr)
49+
static inline struct dentry *fault_create_debugfs_attr(const char *name,
50+
struct dentry *parent, struct fault_attr *attr)
6051
{
52+
return ERR_PTR(-ENODEV);
6153
}
6254

6355
#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */

lib/fault-inject.c

+7-13
Original file line numberDiff line numberDiff line change
@@ -197,21 +197,15 @@ static struct dentry *debugfs_create_atomic_t(const char *name, mode_t mode,
197197
return debugfs_create_file(name, mode, parent, value, &fops_atomic_t);
198198
}
199199

200-
void cleanup_fault_attr_dentries(struct fault_attr *attr)
201-
{
202-
debugfs_remove_recursive(attr->dir);
203-
}
204-
205-
int init_fault_attr_dentries(struct fault_attr *attr, const char *name)
200+
struct dentry *fault_create_debugfs_attr(const char *name,
201+
struct dentry *parent, struct fault_attr *attr)
206202
{
207203
mode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
208204
struct dentry *dir;
209205

210-
dir = debugfs_create_dir(name, NULL);
206+
dir = debugfs_create_dir(name, parent);
211207
if (!dir)
212-
return -ENOMEM;
213-
214-
attr->dir = dir;
208+
return ERR_PTR(-ENOMEM);
215209

216210
if (!debugfs_create_ul("probability", mode, dir, &attr->probability))
217211
goto fail;
@@ -243,11 +237,11 @@ int init_fault_attr_dentries(struct fault_attr *attr, const char *name)
243237

244238
#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
245239

246-
return 0;
240+
return dir;
247241
fail:
248-
debugfs_remove_recursive(attr->dir);
242+
debugfs_remove_recursive(dir);
249243

250-
return -ENOMEM;
244+
return ERR_PTR(-ENOMEM);
251245
}
252246

253247
#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */

mm/failslab.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,23 @@ __setup("failslab=", setup_failslab);
3434
#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
3535
static int __init failslab_debugfs_init(void)
3636
{
37+
struct dentry *dir;
3738
mode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
38-
int err;
3939

40-
err = init_fault_attr_dentries(&failslab.attr, "failslab");
41-
if (err)
42-
return err;
40+
dir = fault_create_debugfs_attr("failslab", NULL, &failslab.attr);
41+
if (IS_ERR(dir))
42+
return PTR_ERR(dir);
4343

44-
if (!debugfs_create_bool("ignore-gfp-wait", mode, failslab.attr.dir,
44+
if (!debugfs_create_bool("ignore-gfp-wait", mode, dir,
4545
&failslab.ignore_gfp_wait))
4646
goto fail;
47-
if (!debugfs_create_bool("cache-filter", mode, failslab.attr.dir,
47+
if (!debugfs_create_bool("cache-filter", mode, dir,
4848
&failslab.cache_filter))
4949
goto fail;
5050

5151
return 0;
5252
fail:
53-
cleanup_fault_attr_dentries(&failslab.attr);
53+
debugfs_remove_recursive(dir);
5454

5555
return -ENOMEM;
5656
}

mm/page_alloc.c

+5-8
Original file line numberDiff line numberDiff line change
@@ -1409,14 +1409,11 @@ static int __init fail_page_alloc_debugfs(void)
14091409
{
14101410
mode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
14111411
struct dentry *dir;
1412-
int err;
14131412

1414-
err = init_fault_attr_dentries(&fail_page_alloc.attr,
1415-
"fail_page_alloc");
1416-
if (err)
1417-
return err;
1418-
1419-
dir = fail_page_alloc.attr.dir;
1413+
dir = fault_create_debugfs_attr("fail_page_alloc", NULL,
1414+
&fail_page_alloc.attr);
1415+
if (IS_ERR(dir))
1416+
return PTR_ERR(dir);
14201417

14211418
if (!debugfs_create_bool("ignore-gfp-wait", mode, dir,
14221419
&fail_page_alloc.ignore_gfp_wait))
@@ -1430,7 +1427,7 @@ static int __init fail_page_alloc_debugfs(void)
14301427

14311428
return 0;
14321429
fail:
1433-
cleanup_fault_attr_dentries(&fail_page_alloc.attr);
1430+
debugfs_remove_recursive(dir);
14341431

14351432
return -ENOMEM;
14361433
}

0 commit comments

Comments
 (0)