blob: 4a25c5eb6f07266a21afe5124628e0a763e1e7b7 [file] [log] [blame]
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -03001===========================================
Akinobu Mitade1ba092006-12-08 02:39:42 -08002Fault injection capabilities infrastructure
3===========================================
4
Masanari Iida1892ce42017-12-23 01:41:21 +09005See also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug.
Akinobu Mitade1ba092006-12-08 02:39:42 -08006
7
8Available fault injection capabilities
9--------------------------------------
10
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030011- failslab
Akinobu Mitade1ba092006-12-08 02:39:42 -080012
13 injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...)
14
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030015- fail_page_alloc
Akinobu Mitade1ba092006-12-08 02:39:42 -080016
17 injects page allocation failures. (alloc_pages(), get_free_pages(), ...)
18
Albert van der Linde2c739ce2020-10-15 20:13:46 -070019- fail_usercopy
20
21 injects failures in user memory access functions. (copy_from_user(), get_user(), ...)
22
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030023- fail_futex
Davidlohr Buesoab51fba2015-06-29 23:26:02 -070024
25 injects futex deadlock and uaddr fault errors.
26
Chuck Lever400edd82021-08-09 14:01:50 -040027- fail_sunrpc
28
29 injects kernel RPC client and server failures.
30
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030031- fail_make_request
Akinobu Mitade1ba092006-12-08 02:39:42 -080032
Don Mullis5d0ffa22006-12-08 02:39:50 -080033 injects disk IO errors on devices permitted by setting
Akinobu Mitade1ba092006-12-08 02:39:42 -080034 /sys/block/<device>/make-it-fail or
Christoph Hellwiged00aab2020-07-01 10:59:44 +020035 /sys/block/<device>/<partition>/make-it-fail. (submit_bio_noacct())
Akinobu Mitade1ba092006-12-08 02:39:42 -080036
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030037- fail_mmc_request
Per Forlin1e4cb222011-08-19 14:52:38 +020038
39 injects MMC data errors on devices permitted by setting
40 debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request
41
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030042- fail_function
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +090043
44 injects error return on specific functions, which are marked by
45 ALLOW_ERROR_INJECTION() macro, by setting debugfs entries
46 under /sys/kernel/debug/fail_function. No boot option supported.
47
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030048- NVMe fault injection
Thomas Taicf4182f2018-02-08 13:38:30 -050049
50 inject NVMe status code and retry flag on devices permitted by setting
51 debugfs entries under /sys/kernel/debug/nvme*/fault_inject. The default
52 status code is NVME_SC_INVALID_OPCODE with no retry. The status code and
53 retry flag can be set via the debugfs.
54
55
Akinobu Mitade1ba092006-12-08 02:39:42 -080056Configure fault-injection capabilities behavior
57-----------------------------------------------
58
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030059debugfs entries
60^^^^^^^^^^^^^^^
Akinobu Mitade1ba092006-12-08 02:39:42 -080061
62fault-inject-debugfs kernel module provides some debugfs entries for runtime
63configuration of fault-injection capabilities.
64
GeunSik Lim156f5a72009-06-02 15:01:37 +090065- /sys/kernel/debug/fail*/probability:
Akinobu Mitade1ba092006-12-08 02:39:42 -080066
67 likelihood of failure injection, in percent.
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030068
Akinobu Mitade1ba092006-12-08 02:39:42 -080069 Format: <percent>
70
Don Mullis5d0ffa22006-12-08 02:39:50 -080071 Note that one-failure-per-hundred is a very high error rate
72 for some testcases. Consider setting probability=100 and configure
GeunSik Lim156f5a72009-06-02 15:01:37 +090073 /sys/kernel/debug/fail*/interval for such testcases.
Akinobu Mitade1ba092006-12-08 02:39:42 -080074
GeunSik Lim156f5a72009-06-02 15:01:37 +090075- /sys/kernel/debug/fail*/interval:
Akinobu Mitade1ba092006-12-08 02:39:42 -080076
77 specifies the interval between failures, for calls to
78 should_fail() that pass all the other tests.
79
80 Note that if you enable this, by setting interval>1, you will
81 probably want to set probability=100.
82
GeunSik Lim156f5a72009-06-02 15:01:37 +090083- /sys/kernel/debug/fail*/times:
Akinobu Mitade1ba092006-12-08 02:39:42 -080084
Wolfram Sang005747522021-06-03 14:58:41 +020085 specifies how many times failures may happen at most. A value of -1
86 means "no limit". Note, though, that this file only accepts unsigned
87 values. So, if you want to specify -1, you better use 'printf' instead
88 of 'echo', e.g.: $ printf %#x -1 > times
Akinobu Mitade1ba092006-12-08 02:39:42 -080089
GeunSik Lim156f5a72009-06-02 15:01:37 +090090- /sys/kernel/debug/fail*/space:
Akinobu Mitade1ba092006-12-08 02:39:42 -080091
92 specifies an initial resource "budget", decremented by "size"
93 on each call to should_fail(,size). Failure injection is
94 suppressed until "space" reaches zero.
95
GeunSik Lim156f5a72009-06-02 15:01:37 +090096- /sys/kernel/debug/fail*/verbose
Akinobu Mitade1ba092006-12-08 02:39:42 -080097
98 Format: { 0 | 1 | 2 }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -030099
Don Mullis5d0ffa22006-12-08 02:39:50 -0800100 specifies the verbosity of the messages when failure is
101 injected. '0' means no messages; '1' will print only a single
102 log line per failure; '2' will print a call trace too -- useful
103 to debug the problems revealed by fault injection.
Akinobu Mitade1ba092006-12-08 02:39:42 -0800104
GeunSik Lim156f5a72009-06-02 15:01:37 +0900105- /sys/kernel/debug/fail*/task-filter:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800106
Don Mullis5d0ffa22006-12-08 02:39:50 -0800107 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300108
Don Mullis5d0ffa22006-12-08 02:39:50 -0800109 A value of 'N' disables filtering by process (default).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800110 Any positive value limits failures to only processes indicated by
111 /proc/<pid>/make-it-fail==1.
112
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300113- /sys/kernel/debug/fail*/require-start,
114 /sys/kernel/debug/fail*/require-end,
115 /sys/kernel/debug/fail*/reject-start,
116 /sys/kernel/debug/fail*/reject-end:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800117
118 specifies the range of virtual addresses tested during
119 stacktrace walking. Failure is injected only if some caller
Akinobu Mita329409a2006-12-08 02:39:48 -0800120 in the walked stacktrace lies within the required range, and
121 none lies within the rejected range.
122 Default required range is [0,ULONG_MAX) (whole of virtual address space).
123 Default rejected range is [0,0).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800124
GeunSik Lim156f5a72009-06-02 15:01:37 +0900125- /sys/kernel/debug/fail*/stacktrace-depth:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800126
127 specifies the maximum stacktrace depth walked during search
Don Mullis5d0ffa22006-12-08 02:39:50 -0800128 for a caller within [require-start,require-end) OR
129 [reject-start,reject-end).
Akinobu Mitade1ba092006-12-08 02:39:42 -0800130
GeunSik Lim156f5a72009-06-02 15:01:37 +0900131- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800132
Don Mullis5d0ffa22006-12-08 02:39:50 -0800133 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300134
Don Mullis5d0ffa22006-12-08 02:39:50 -0800135 default is 'N', setting it to 'Y' won't inject failures into
Akinobu Mitade1ba092006-12-08 02:39:42 -0800136 highmem/user allocations.
137
GeunSik Lim156f5a72009-06-02 15:01:37 +0900138- /sys/kernel/debug/failslab/ignore-gfp-wait:
139- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800140
Don Mullis5d0ffa22006-12-08 02:39:50 -0800141 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300142
Don Mullis5d0ffa22006-12-08 02:39:50 -0800143 default is 'N', setting it to 'Y' will inject failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800144 only into non-sleep allocations (GFP_ATOMIC allocations).
145
GeunSik Lim156f5a72009-06-02 15:01:37 +0900146- /sys/kernel/debug/fail_page_alloc/min-order:
Akinobu Mita54114992007-07-15 23:40:23 -0700147
148 specifies the minimum page allocation order to be injected
149 failures.
150
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700151- /sys/kernel/debug/fail_futex/ignore-private:
152
153 Format: { 'Y' | 'N' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300154
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700155 default is 'N', setting it to 'Y' will disable failure injections
156 when dealing with private (address space) futexes.
157
Chuck Lever400edd82021-08-09 14:01:50 -0400158- /sys/kernel/debug/fail_sunrpc/ignore-client-disconnect:
159
160 Format: { 'Y' | 'N' }
161
162 default is 'N', setting it to 'Y' will disable disconnect
163 injection on the RPC client.
164
165- /sys/kernel/debug/fail_sunrpc/ignore-server-disconnect:
166
167 Format: { 'Y' | 'N' }
168
169 default is 'N', setting it to 'Y' will disable disconnect
170 injection on the RPC server.
171
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900172- /sys/kernel/debug/fail_function/inject:
173
174 Format: { 'function-name' | '!function-name' | '' }
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300175
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900176 specifies the target function of error injection by name.
177 If the function name leads '!' prefix, given function is
178 removed from injection list. If nothing specified ('')
179 injection list is cleared.
180
181- /sys/kernel/debug/fail_function/injectable:
182
183 (read only) shows error injectable functions and what type of
184 error values can be specified. The error type will be one of
185 below;
186 - NULL: retval must be 0.
187 - ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
188 - ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
189
Wolfram Sang005747522021-06-03 14:58:41 +0200190- /sys/kernel/debug/fail_function/<function-name>/retval:
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900191
Wolfram Sang005747522021-06-03 14:58:41 +0200192 specifies the "error" return value to inject to the given function.
193 This will be created when the user specifies a new injection entry.
194 Note that this file only accepts unsigned values. So, if you want to
195 use a negative errno, you better use 'printf' instead of 'echo', e.g.:
196 $ printf %#x -12 > retval
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900197
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300198Boot option
199^^^^^^^^^^^
Akinobu Mitade1ba092006-12-08 02:39:42 -0800200
201In order to inject faults while debugfs is not available (early boot time),
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300202use the boot option::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800203
204 failslab=
205 fail_page_alloc=
Albert van der Linde2c739ce2020-10-15 20:13:46 -0700206 fail_usercopy=
Per Forlin1e4cb222011-08-19 14:52:38 +0200207 fail_make_request=
Davidlohr Buesoab51fba2015-06-29 23:26:02 -0700208 fail_futex=
Per Forlin199e3f42011-09-13 23:03:30 +0200209 mmc_core.fail_request=<interval>,<probability>,<space>,<times>
Akinobu Mitade1ba092006-12-08 02:39:42 -0800210
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300211proc entries
212^^^^^^^^^^^^
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700213
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300214- /proc/<pid>/fail-nth,
215 /proc/self/task/<tid>/fail-nth:
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700216
Akinobu Mita9049f2f2017-07-14 14:49:52 -0700217 Write to this file of integer N makes N-th call in the task fail.
Akinobu Mitabfc74092017-07-14 14:49:54 -0700218 Read from this file returns a integer value. A value of '0' indicates
219 that the fault setup with a previous write to this file was injected.
220 A positive integer N indicates that the fault wasn't yet injected.
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700221 Note that this file enables all types of faults (slab, futex, etc).
222 This setting takes precedence over all other generic debugfs settings
223 like probability, interval, times, etc. But per-capability settings
224 (e.g. fail_futex/ignore-private) take precedence over it.
225
226 This feature is intended for systematic testing of faults in a single
227 system call. See an example below.
228
Akinobu Mitade1ba092006-12-08 02:39:42 -0800229How to add new fault injection capability
230-----------------------------------------
231
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300232- #include <linux/fault-inject.h>
Akinobu Mitade1ba092006-12-08 02:39:42 -0800233
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300234- define the fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800235
Laurent Gauthier2d879482019-01-05 00:08:34 +0100236 DECLARE_FAULT_ATTR(name);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800237
238 Please see the definition of struct fault_attr in fault-inject.h
239 for details.
240
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300241- provide a way to configure fault attributes
Akinobu Mitade1ba092006-12-08 02:39:42 -0800242
243- boot option
244
245 If you need to enable the fault injection capability from boot time, you can
Don Mullis5d0ffa22006-12-08 02:39:50 -0800246 provide boot option to configure it. There is a helper function for it:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800247
Don Mullis5d0ffa22006-12-08 02:39:50 -0800248 setup_fault_attr(attr, str);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800249
250- debugfs entries
251
Albert van der Linde2c739ce2020-10-15 20:13:46 -0700252 failslab, fail_page_alloc, fail_usercopy, and fail_make_request use this way.
Don Mullis5d0ffa22006-12-08 02:39:50 -0800253 Helper functions:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800254
Akinobu Mitadd48c082011-08-03 16:21:01 -0700255 fault_create_debugfs_attr(name, parent, attr);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800256
257- module parameters
258
259 If the scope of the fault injection capability is limited to a
260 single kernel module, it is better to provide module parameters to
261 configure the fault attributes.
262
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300263- add a hook to insert failures
Akinobu Mitade1ba092006-12-08 02:39:42 -0800264
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300265 Upon should_fail() returning true, client code should inject a failure:
Akinobu Mitade1ba092006-12-08 02:39:42 -0800266
Don Mullis5d0ffa22006-12-08 02:39:50 -0800267 should_fail(attr, size);
Akinobu Mitade1ba092006-12-08 02:39:42 -0800268
269Application Examples
270--------------------
271
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300272- Inject slab allocation failures into module init/exit code::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800273
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300274 #!/bin/bash
Akinobu Mitade1ba092006-12-08 02:39:42 -0800275
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300276 FAILTYPE=failslab
277 echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
278 echo 10 > /sys/kernel/debug/$FAILTYPE/probability
279 echo 100 > /sys/kernel/debug/$FAILTYPE/interval
Wolfram Sang005747522021-06-03 14:58:41 +0200280 printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300281 echo 0 > /sys/kernel/debug/$FAILTYPE/space
282 echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
283 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
Akinobu Mitade1ba092006-12-08 02:39:42 -0800284
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300285 faulty_system()
286 {
Akinobu Mita18584872007-07-15 23:40:24 -0700287 bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300288 }
Akinobu Mitade1ba092006-12-08 02:39:42 -0800289
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300290 if [ $# -eq 0 ]
291 then
Akinobu Mita18584872007-07-15 23:40:24 -0700292 echo "Usage: $0 modulename [ modulename ... ]"
293 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300294 fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800295
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300296 for m in $*
297 do
Akinobu Mita18584872007-07-15 23:40:24 -0700298 echo inserting $m...
299 faulty_system modprobe $m
Akinobu Mitade1ba092006-12-08 02:39:42 -0800300
Akinobu Mita18584872007-07-15 23:40:24 -0700301 echo removing $m...
302 faulty_system modprobe -r $m
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300303 done
Akinobu Mitade1ba092006-12-08 02:39:42 -0800304
305------------------------------------------------------------------------------
306
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300307- Inject page allocation failures only for a specific module::
Akinobu Mitade1ba092006-12-08 02:39:42 -0800308
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300309 #!/bin/bash
Akinobu Mitade1ba092006-12-08 02:39:42 -0800310
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300311 FAILTYPE=fail_page_alloc
312 module=$1
Akinobu Mitade1ba092006-12-08 02:39:42 -0800313
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300314 if [ -z $module ]
315 then
Akinobu Mita18584872007-07-15 23:40:24 -0700316 echo "Usage: $0 <modulename>"
317 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300318 fi
Akinobu Mitade1ba092006-12-08 02:39:42 -0800319
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300320 modprobe $module
Akinobu Mitade1ba092006-12-08 02:39:42 -0800321
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300322 if [ ! -d /sys/module/$module/sections ]
323 then
Akinobu Mita18584872007-07-15 23:40:24 -0700324 echo Module $module is not loaded
325 exit 1
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300326 fi
Akinobu Mita18584872007-07-15 23:40:24 -0700327
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300328 cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
329 cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
Akinobu Mita18584872007-07-15 23:40:24 -0700330
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300331 echo N > /sys/kernel/debug/$FAILTYPE/task-filter
332 echo 10 > /sys/kernel/debug/$FAILTYPE/probability
333 echo 100 > /sys/kernel/debug/$FAILTYPE/interval
Wolfram Sang005747522021-06-03 14:58:41 +0200334 printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300335 echo 0 > /sys/kernel/debug/$FAILTYPE/space
336 echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
337 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
338 echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
339 echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
Akinobu Mita18584872007-07-15 23:40:24 -0700340
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300341 trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
Akinobu Mita18584872007-07-15 23:40:24 -0700342
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300343 echo "Injecting errors into the module $module... (interrupt to stop)"
344 sleep 1000000
Akinobu Mitade1ba092006-12-08 02:39:42 -0800345
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900346------------------------------------------------------------------------------
347
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300348- Inject open_ctree error while btrfs mount::
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900349
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300350 #!/bin/bash
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900351
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300352 rm -f testfile.img
353 dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1
354 DEVICE=$(losetup --show -f testfile.img)
355 mkfs.btrfs -f $DEVICE
356 mkdir -p tmpmnt
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900357
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300358 FAILTYPE=fail_function
359 FAILFUNC=open_ctree
360 echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
Wolfram Sang005747522021-06-03 14:58:41 +0200361 printf %#x -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300362 echo N > /sys/kernel/debug/$FAILTYPE/task-filter
363 echo 100 > /sys/kernel/debug/$FAILTYPE/probability
364 echo 0 > /sys/kernel/debug/$FAILTYPE/interval
Wolfram Sang005747522021-06-03 14:58:41 +0200365 printf %#x -1 > /sys/kernel/debug/$FAILTYPE/times
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300366 echo 0 > /sys/kernel/debug/$FAILTYPE/space
367 echo 1 > /sys/kernel/debug/$FAILTYPE/verbose
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900368
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300369 mount -t btrfs $DEVICE tmpmnt
370 if [ $? -ne 0 ]
371 then
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900372 echo "SUCCESS!"
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300373 else
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900374 echo "FAILED!"
375 umount tmpmnt
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300376 fi
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900377
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300378 echo > /sys/kernel/debug/$FAILTYPE/inject
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900379
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300380 rmdir tmpmnt
381 losetup -d $DEVICE
382 rm testfile.img
Masami Hiramatsu4b1a29a2018-01-13 02:56:03 +0900383
384
Akinobu Mitac24aa642012-07-30 14:43:20 -0700385Tool to run command with failslab or fail_page_alloc
386----------------------------------------------------
387In order to make it easier to accomplish the tasks mentioned above, we can use
388tools/testing/fault-injection/failcmd.sh. Please run a command
389"./tools/testing/fault-injection/failcmd.sh --help" for more information and
390see the following examples.
391
392Examples:
393
394Run a command "make -C tools/testing/selftests/ run_tests" with injecting slab
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300395allocation failure::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700396
397 # ./tools/testing/fault-injection/failcmd.sh \
398 -- make -C tools/testing/selftests/ run_tests
399
400Same as above except to specify 100 times failures at most instead of one time
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300401at most by default::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700402
403 # ./tools/testing/fault-injection/failcmd.sh --times=100 \
404 -- make -C tools/testing/selftests/ run_tests
405
406Same as above except to inject page allocation failure instead of slab
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300407allocation failure::
Akinobu Mitac24aa642012-07-30 14:43:20 -0700408
409 # env FAILCMD_TYPE=fail_page_alloc \
410 ./tools/testing/fault-injection/failcmd.sh --times=100 \
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300411 -- make -C tools/testing/selftests/ run_tests
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700412
413Systematic faults using fail-nth
414---------------------------------
415
416The following code systematically faults 0-th, 1-st, 2-nd and so on
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300417capabilities in the socketpair() system call::
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700418
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300419 #include <sys/types.h>
420 #include <sys/stat.h>
421 #include <sys/socket.h>
422 #include <sys/syscall.h>
423 #include <fcntl.h>
424 #include <unistd.h>
425 #include <string.h>
426 #include <stdlib.h>
427 #include <stdio.h>
428 #include <errno.h>
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700429
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300430 int main()
431 {
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700432 int i, err, res, fail_nth, fds[2];
433 char buf[128];
434
435 system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait");
436 sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid));
437 fail_nth = open(buf, O_RDWR);
Akinobu Mita9049f2f2017-07-14 14:49:52 -0700438 for (i = 1;; i++) {
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700439 sprintf(buf, "%d", i);
440 write(fail_nth, buf, strlen(buf));
441 res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
442 err = errno;
Akinobu Mitabfc74092017-07-14 14:49:54 -0700443 pread(fail_nth, buf, sizeof(buf), 0);
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700444 if (res == 0) {
445 close(fds[0]);
446 close(fds[1]);
447 }
Akinobu Mitabfc74092017-07-14 14:49:54 -0700448 printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y',
449 res, err);
450 if (atoi(buf))
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700451 break;
452 }
453 return 0;
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300454 }
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700455
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300456An example output::
Dmitry Vyukove41d58182017-07-12 14:34:35 -0700457
Mauro Carvalho Chehab10ffebb2019-06-12 14:52:44 -0300458 1-th fault Y: res=-1/23
459 2-th fault Y: res=-1/23
460 3-th fault Y: res=-1/12
461 4-th fault Y: res=-1/12
462 5-th fault Y: res=-1/23
463 6-th fault Y: res=-1/23
464 7-th fault Y: res=-1/23
465 8-th fault Y: res=-1/12
466 9-th fault Y: res=-1/12
467 10-th fault Y: res=-1/12
468 11-th fault Y: res=-1/12
469 12-th fault Y: res=-1/12
470 13-th fault Y: res=-1/12
471 14-th fault Y: res=-1/12
472 15-th fault Y: res=-1/12
473 16-th fault N: res=0/12