18c2ecf20Sopenharmony_ci===========================================
28c2ecf20Sopenharmony_ciFault injection capabilities infrastructure
38c2ecf20Sopenharmony_ci===========================================
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ciSee also drivers/md/md-faulty.c and "every_nth" module option for scsi_debug.
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ciAvailable fault injection capabilities
98c2ecf20Sopenharmony_ci--------------------------------------
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci- failslab
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci  injects slab allocation failures. (kmalloc(), kmem_cache_alloc(), ...)
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci- fail_page_alloc
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci  injects page allocation failures. (alloc_pages(), get_free_pages(), ...)
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci- fail_usercopy
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci  injects failures in user memory access functions. (copy_from_user(), get_user(), ...)
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci- fail_futex
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci  injects futex deadlock and uaddr fault errors.
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci- fail_make_request
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci  injects disk IO errors on devices permitted by setting
308c2ecf20Sopenharmony_ci  /sys/block/<device>/make-it-fail or
318c2ecf20Sopenharmony_ci  /sys/block/<device>/<partition>/make-it-fail. (submit_bio_noacct())
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci- fail_mmc_request
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci  injects MMC data errors on devices permitted by setting
368c2ecf20Sopenharmony_ci  debugfs entries under /sys/kernel/debug/mmc0/fail_mmc_request
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci- fail_function
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci  injects error return on specific functions, which are marked by
418c2ecf20Sopenharmony_ci  ALLOW_ERROR_INJECTION() macro, by setting debugfs entries
428c2ecf20Sopenharmony_ci  under /sys/kernel/debug/fail_function. No boot option supported.
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci- NVMe fault injection
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci  inject NVMe status code and retry flag on devices permitted by setting
478c2ecf20Sopenharmony_ci  debugfs entries under /sys/kernel/debug/nvme*/fault_inject. The default
488c2ecf20Sopenharmony_ci  status code is NVME_SC_INVALID_OPCODE with no retry. The status code and
498c2ecf20Sopenharmony_ci  retry flag can be set via the debugfs.
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciConfigure fault-injection capabilities behavior
538c2ecf20Sopenharmony_ci-----------------------------------------------
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cidebugfs entries
568c2ecf20Sopenharmony_ci^^^^^^^^^^^^^^^
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cifault-inject-debugfs kernel module provides some debugfs entries for runtime
598c2ecf20Sopenharmony_ciconfiguration of fault-injection capabilities.
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/probability:
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	likelihood of failure injection, in percent.
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	Format: <percent>
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	Note that one-failure-per-hundred is a very high error rate
688c2ecf20Sopenharmony_ci	for some testcases.  Consider setting probability=100 and configure
698c2ecf20Sopenharmony_ci	/sys/kernel/debug/fail*/interval for such testcases.
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/interval:
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ci	specifies the interval between failures, for calls to
748c2ecf20Sopenharmony_ci	should_fail() that pass all the other tests.
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	Note that if you enable this, by setting interval>1, you will
778c2ecf20Sopenharmony_ci	probably want to set probability=100.
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/times:
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	specifies how many times failures may happen at most. A value of -1
828c2ecf20Sopenharmony_ci	means "no limit".
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/space:
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	specifies an initial resource "budget", decremented by "size"
878c2ecf20Sopenharmony_ci	on each call to should_fail(,size).  Failure injection is
888c2ecf20Sopenharmony_ci	suppressed until "space" reaches zero.
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/verbose
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	Format: { 0 | 1 | 2 }
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	specifies the verbosity of the messages when failure is
958c2ecf20Sopenharmony_ci	injected.  '0' means no messages; '1' will print only a single
968c2ecf20Sopenharmony_ci	log line per failure; '2' will print a call trace too -- useful
978c2ecf20Sopenharmony_ci	to debug the problems revealed by fault injection.
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/task-filter:
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	Format: { 'Y' | 'N' }
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	A value of 'N' disables filtering by process (default).
1048c2ecf20Sopenharmony_ci	Any positive value limits failures to only processes indicated by
1058c2ecf20Sopenharmony_ci	/proc/<pid>/make-it-fail==1.
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/require-start,
1088c2ecf20Sopenharmony_ci  /sys/kernel/debug/fail*/require-end,
1098c2ecf20Sopenharmony_ci  /sys/kernel/debug/fail*/reject-start,
1108c2ecf20Sopenharmony_ci  /sys/kernel/debug/fail*/reject-end:
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	specifies the range of virtual addresses tested during
1138c2ecf20Sopenharmony_ci	stacktrace walking.  Failure is injected only if some caller
1148c2ecf20Sopenharmony_ci	in the walked stacktrace lies within the required range, and
1158c2ecf20Sopenharmony_ci	none lies within the rejected range.
1168c2ecf20Sopenharmony_ci	Default required range is [0,ULONG_MAX) (whole of virtual address space).
1178c2ecf20Sopenharmony_ci	Default rejected range is [0,0).
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail*/stacktrace-depth:
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	specifies the maximum stacktrace depth walked during search
1228c2ecf20Sopenharmony_ci	for a caller within [require-start,require-end) OR
1238c2ecf20Sopenharmony_ci	[reject-start,reject-end).
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem:
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	Format: { 'Y' | 'N' }
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	default is 'N', setting it to 'Y' won't inject failures into
1308c2ecf20Sopenharmony_ci	highmem/user allocations.
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci- /sys/kernel/debug/failslab/ignore-gfp-wait:
1338c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait:
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	Format: { 'Y' | 'N' }
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	default is 'N', setting it to 'Y' will inject failures
1388c2ecf20Sopenharmony_ci	only into non-sleep allocations (GFP_ATOMIC allocations).
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_page_alloc/min-order:
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	specifies the minimum page allocation order to be injected
1438c2ecf20Sopenharmony_ci	failures.
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_futex/ignore-private:
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	Format: { 'Y' | 'N' }
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	default is 'N', setting it to 'Y' will disable failure injections
1508c2ecf20Sopenharmony_ci	when dealing with private (address space) futexes.
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/inject:
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	Format: { 'function-name' | '!function-name' | '' }
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ci	specifies the target function of error injection by name.
1578c2ecf20Sopenharmony_ci	If the function name leads '!' prefix, given function is
1588c2ecf20Sopenharmony_ci	removed from injection list. If nothing specified ('')
1598c2ecf20Sopenharmony_ci	injection list is cleared.
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/injectable:
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	(read only) shows error injectable functions and what type of
1648c2ecf20Sopenharmony_ci	error values can be specified. The error type will be one of
1658c2ecf20Sopenharmony_ci	below;
1668c2ecf20Sopenharmony_ci	- NULL:	retval must be 0.
1678c2ecf20Sopenharmony_ci	- ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
1688c2ecf20Sopenharmony_ci	- ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci- /sys/kernel/debug/fail_function/<function-name>/retval:
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci	specifies the "error" return value to inject to the given function.
1738c2ecf20Sopenharmony_ci	This will be created when the user specifies a new injection entry.
1748c2ecf20Sopenharmony_ci	Note that this file only accepts unsigned values. So, if you want to
1758c2ecf20Sopenharmony_ci	use a negative errno, you better use 'printf' instead of 'echo', e.g.:
1768c2ecf20Sopenharmony_ci	$ printf %#x -12 > retval
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ciBoot option
1798c2ecf20Sopenharmony_ci^^^^^^^^^^^
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ciIn order to inject faults while debugfs is not available (early boot time),
1828c2ecf20Sopenharmony_ciuse the boot option::
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	failslab=
1858c2ecf20Sopenharmony_ci	fail_page_alloc=
1868c2ecf20Sopenharmony_ci	fail_usercopy=
1878c2ecf20Sopenharmony_ci	fail_make_request=
1888c2ecf20Sopenharmony_ci	fail_futex=
1898c2ecf20Sopenharmony_ci	mmc_core.fail_request=<interval>,<probability>,<space>,<times>
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ciproc entries
1928c2ecf20Sopenharmony_ci^^^^^^^^^^^^
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci- /proc/<pid>/fail-nth,
1958c2ecf20Sopenharmony_ci  /proc/self/task/<tid>/fail-nth:
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	Write to this file of integer N makes N-th call in the task fail.
1988c2ecf20Sopenharmony_ci	Read from this file returns a integer value. A value of '0' indicates
1998c2ecf20Sopenharmony_ci	that the fault setup with a previous write to this file was injected.
2008c2ecf20Sopenharmony_ci	A positive integer N indicates that the fault wasn't yet injected.
2018c2ecf20Sopenharmony_ci	Note that this file enables all types of faults (slab, futex, etc).
2028c2ecf20Sopenharmony_ci	This setting takes precedence over all other generic debugfs settings
2038c2ecf20Sopenharmony_ci	like probability, interval, times, etc. But per-capability settings
2048c2ecf20Sopenharmony_ci	(e.g. fail_futex/ignore-private) take precedence over it.
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	This feature is intended for systematic testing of faults in a single
2078c2ecf20Sopenharmony_ci	system call. See an example below.
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ciHow to add new fault injection capability
2108c2ecf20Sopenharmony_ci-----------------------------------------
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci- #include <linux/fault-inject.h>
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci- define the fault attributes
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci  DECLARE_FAULT_ATTR(name);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci  Please see the definition of struct fault_attr in fault-inject.h
2198c2ecf20Sopenharmony_ci  for details.
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci- provide a way to configure fault attributes
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci- boot option
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci  If you need to enable the fault injection capability from boot time, you can
2268c2ecf20Sopenharmony_ci  provide boot option to configure it. There is a helper function for it:
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	setup_fault_attr(attr, str);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci- debugfs entries
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci  failslab, fail_page_alloc, fail_usercopy, and fail_make_request use this way.
2338c2ecf20Sopenharmony_ci  Helper functions:
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	fault_create_debugfs_attr(name, parent, attr);
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci- module parameters
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci  If the scope of the fault injection capability is limited to a
2408c2ecf20Sopenharmony_ci  single kernel module, it is better to provide module parameters to
2418c2ecf20Sopenharmony_ci  configure the fault attributes.
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci- add a hook to insert failures
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci  Upon should_fail() returning true, client code should inject a failure:
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	should_fail(attr, size);
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ciApplication Examples
2508c2ecf20Sopenharmony_ci--------------------
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci- Inject slab allocation failures into module init/exit code::
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci    #!/bin/bash
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci    FAILTYPE=failslab
2578c2ecf20Sopenharmony_ci    echo Y > /sys/kernel/debug/$FAILTYPE/task-filter
2588c2ecf20Sopenharmony_ci    echo 10 > /sys/kernel/debug/$FAILTYPE/probability
2598c2ecf20Sopenharmony_ci    echo 100 > /sys/kernel/debug/$FAILTYPE/interval
2608c2ecf20Sopenharmony_ci    echo -1 > /sys/kernel/debug/$FAILTYPE/times
2618c2ecf20Sopenharmony_ci    echo 0 > /sys/kernel/debug/$FAILTYPE/space
2628c2ecf20Sopenharmony_ci    echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
2638c2ecf20Sopenharmony_ci    echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci    faulty_system()
2668c2ecf20Sopenharmony_ci    {
2678c2ecf20Sopenharmony_ci	bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
2688c2ecf20Sopenharmony_ci    }
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci    if [ $# -eq 0 ]
2718c2ecf20Sopenharmony_ci    then
2728c2ecf20Sopenharmony_ci	echo "Usage: $0 modulename [ modulename ... ]"
2738c2ecf20Sopenharmony_ci	exit 1
2748c2ecf20Sopenharmony_ci    fi
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci    for m in $*
2778c2ecf20Sopenharmony_ci    do
2788c2ecf20Sopenharmony_ci	echo inserting $m...
2798c2ecf20Sopenharmony_ci	faulty_system modprobe $m
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	echo removing $m...
2828c2ecf20Sopenharmony_ci	faulty_system modprobe -r $m
2838c2ecf20Sopenharmony_ci    done
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci------------------------------------------------------------------------------
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci- Inject page allocation failures only for a specific module::
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci    #!/bin/bash
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_ci    FAILTYPE=fail_page_alloc
2928c2ecf20Sopenharmony_ci    module=$1
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci    if [ -z $module ]
2958c2ecf20Sopenharmony_ci    then
2968c2ecf20Sopenharmony_ci	echo "Usage: $0 <modulename>"
2978c2ecf20Sopenharmony_ci	exit 1
2988c2ecf20Sopenharmony_ci    fi
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci    modprobe $module
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci    if [ ! -d /sys/module/$module/sections ]
3038c2ecf20Sopenharmony_ci    then
3048c2ecf20Sopenharmony_ci	echo Module $module is not loaded
3058c2ecf20Sopenharmony_ci	exit 1
3068c2ecf20Sopenharmony_ci    fi
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci    cat /sys/module/$module/sections/.text > /sys/kernel/debug/$FAILTYPE/require-start
3098c2ecf20Sopenharmony_ci    cat /sys/module/$module/sections/.data > /sys/kernel/debug/$FAILTYPE/require-end
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci    echo N > /sys/kernel/debug/$FAILTYPE/task-filter
3128c2ecf20Sopenharmony_ci    echo 10 > /sys/kernel/debug/$FAILTYPE/probability
3138c2ecf20Sopenharmony_ci    echo 100 > /sys/kernel/debug/$FAILTYPE/interval
3148c2ecf20Sopenharmony_ci    echo -1 > /sys/kernel/debug/$FAILTYPE/times
3158c2ecf20Sopenharmony_ci    echo 0 > /sys/kernel/debug/$FAILTYPE/space
3168c2ecf20Sopenharmony_ci    echo 2 > /sys/kernel/debug/$FAILTYPE/verbose
3178c2ecf20Sopenharmony_ci    echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-wait
3188c2ecf20Sopenharmony_ci    echo 1 > /sys/kernel/debug/$FAILTYPE/ignore-gfp-highmem
3198c2ecf20Sopenharmony_ci    echo 10 > /sys/kernel/debug/$FAILTYPE/stacktrace-depth
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_ci    trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci    echo "Injecting errors into the module $module... (interrupt to stop)"
3248c2ecf20Sopenharmony_ci    sleep 1000000
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci------------------------------------------------------------------------------
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci- Inject open_ctree error while btrfs mount::
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci    #!/bin/bash
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci    rm -f testfile.img
3338c2ecf20Sopenharmony_ci    dd if=/dev/zero of=testfile.img bs=1M seek=1000 count=1
3348c2ecf20Sopenharmony_ci    DEVICE=$(losetup --show -f testfile.img)
3358c2ecf20Sopenharmony_ci    mkfs.btrfs -f $DEVICE
3368c2ecf20Sopenharmony_ci    mkdir -p tmpmnt
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci    FAILTYPE=fail_function
3398c2ecf20Sopenharmony_ci    FAILFUNC=open_ctree
3408c2ecf20Sopenharmony_ci    echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
3418c2ecf20Sopenharmony_ci    printf %#x -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
3428c2ecf20Sopenharmony_ci    echo N > /sys/kernel/debug/$FAILTYPE/task-filter
3438c2ecf20Sopenharmony_ci    echo 100 > /sys/kernel/debug/$FAILTYPE/probability
3448c2ecf20Sopenharmony_ci    echo 0 > /sys/kernel/debug/$FAILTYPE/interval
3458c2ecf20Sopenharmony_ci    echo -1 > /sys/kernel/debug/$FAILTYPE/times
3468c2ecf20Sopenharmony_ci    echo 0 > /sys/kernel/debug/$FAILTYPE/space
3478c2ecf20Sopenharmony_ci    echo 1 > /sys/kernel/debug/$FAILTYPE/verbose
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ci    mount -t btrfs $DEVICE tmpmnt
3508c2ecf20Sopenharmony_ci    if [ $? -ne 0 ]
3518c2ecf20Sopenharmony_ci    then
3528c2ecf20Sopenharmony_ci	echo "SUCCESS!"
3538c2ecf20Sopenharmony_ci    else
3548c2ecf20Sopenharmony_ci	echo "FAILED!"
3558c2ecf20Sopenharmony_ci	umount tmpmnt
3568c2ecf20Sopenharmony_ci    fi
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_ci    echo > /sys/kernel/debug/$FAILTYPE/inject
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci    rmdir tmpmnt
3618c2ecf20Sopenharmony_ci    losetup -d $DEVICE
3628c2ecf20Sopenharmony_ci    rm testfile.img
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ciTool to run command with failslab or fail_page_alloc
3668c2ecf20Sopenharmony_ci----------------------------------------------------
3678c2ecf20Sopenharmony_ciIn order to make it easier to accomplish the tasks mentioned above, we can use
3688c2ecf20Sopenharmony_citools/testing/fault-injection/failcmd.sh.  Please run a command
3698c2ecf20Sopenharmony_ci"./tools/testing/fault-injection/failcmd.sh --help" for more information and
3708c2ecf20Sopenharmony_cisee the following examples.
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ciExamples:
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_ciRun a command "make -C tools/testing/selftests/ run_tests" with injecting slab
3758c2ecf20Sopenharmony_ciallocation failure::
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci	# ./tools/testing/fault-injection/failcmd.sh \
3788c2ecf20Sopenharmony_ci		-- make -C tools/testing/selftests/ run_tests
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ciSame as above except to specify 100 times failures at most instead of one time
3818c2ecf20Sopenharmony_ciat most by default::
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	# ./tools/testing/fault-injection/failcmd.sh --times=100 \
3848c2ecf20Sopenharmony_ci		-- make -C tools/testing/selftests/ run_tests
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ciSame as above except to inject page allocation failure instead of slab
3878c2ecf20Sopenharmony_ciallocation failure::
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	# env FAILCMD_TYPE=fail_page_alloc \
3908c2ecf20Sopenharmony_ci		./tools/testing/fault-injection/failcmd.sh --times=100 \
3918c2ecf20Sopenharmony_ci		-- make -C tools/testing/selftests/ run_tests
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_ciSystematic faults using fail-nth
3948c2ecf20Sopenharmony_ci---------------------------------
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ciThe following code systematically faults 0-th, 1-st, 2-nd and so on
3978c2ecf20Sopenharmony_cicapabilities in the socketpair() system call::
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci  #include <sys/types.h>
4008c2ecf20Sopenharmony_ci  #include <sys/stat.h>
4018c2ecf20Sopenharmony_ci  #include <sys/socket.h>
4028c2ecf20Sopenharmony_ci  #include <sys/syscall.h>
4038c2ecf20Sopenharmony_ci  #include <fcntl.h>
4048c2ecf20Sopenharmony_ci  #include <unistd.h>
4058c2ecf20Sopenharmony_ci  #include <string.h>
4068c2ecf20Sopenharmony_ci  #include <stdlib.h>
4078c2ecf20Sopenharmony_ci  #include <stdio.h>
4088c2ecf20Sopenharmony_ci  #include <errno.h>
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci  int main()
4118c2ecf20Sopenharmony_ci  {
4128c2ecf20Sopenharmony_ci	int i, err, res, fail_nth, fds[2];
4138c2ecf20Sopenharmony_ci	char buf[128];
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci	system("echo N > /sys/kernel/debug/failslab/ignore-gfp-wait");
4168c2ecf20Sopenharmony_ci	sprintf(buf, "/proc/self/task/%ld/fail-nth", syscall(SYS_gettid));
4178c2ecf20Sopenharmony_ci	fail_nth = open(buf, O_RDWR);
4188c2ecf20Sopenharmony_ci	for (i = 1;; i++) {
4198c2ecf20Sopenharmony_ci		sprintf(buf, "%d", i);
4208c2ecf20Sopenharmony_ci		write(fail_nth, buf, strlen(buf));
4218c2ecf20Sopenharmony_ci		res = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
4228c2ecf20Sopenharmony_ci		err = errno;
4238c2ecf20Sopenharmony_ci		pread(fail_nth, buf, sizeof(buf), 0);
4248c2ecf20Sopenharmony_ci		if (res == 0) {
4258c2ecf20Sopenharmony_ci			close(fds[0]);
4268c2ecf20Sopenharmony_ci			close(fds[1]);
4278c2ecf20Sopenharmony_ci		}
4288c2ecf20Sopenharmony_ci		printf("%d-th fault %c: res=%d/%d\n", i, atoi(buf) ? 'N' : 'Y',
4298c2ecf20Sopenharmony_ci			res, err);
4308c2ecf20Sopenharmony_ci		if (atoi(buf))
4318c2ecf20Sopenharmony_ci			break;
4328c2ecf20Sopenharmony_ci	}
4338c2ecf20Sopenharmony_ci	return 0;
4348c2ecf20Sopenharmony_ci  }
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ciAn example output::
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	1-th fault Y: res=-1/23
4398c2ecf20Sopenharmony_ci	2-th fault Y: res=-1/23
4408c2ecf20Sopenharmony_ci	3-th fault Y: res=-1/12
4418c2ecf20Sopenharmony_ci	4-th fault Y: res=-1/12
4428c2ecf20Sopenharmony_ci	5-th fault Y: res=-1/23
4438c2ecf20Sopenharmony_ci	6-th fault Y: res=-1/23
4448c2ecf20Sopenharmony_ci	7-th fault Y: res=-1/23
4458c2ecf20Sopenharmony_ci	8-th fault Y: res=-1/12
4468c2ecf20Sopenharmony_ci	9-th fault Y: res=-1/12
4478c2ecf20Sopenharmony_ci	10-th fault Y: res=-1/12
4488c2ecf20Sopenharmony_ci	11-th fault Y: res=-1/12
4498c2ecf20Sopenharmony_ci	12-th fault Y: res=-1/12
4508c2ecf20Sopenharmony_ci	13-th fault Y: res=-1/12
4518c2ecf20Sopenharmony_ci	14-th fault Y: res=-1/12
4528c2ecf20Sopenharmony_ci	15-th fault Y: res=-1/12
4538c2ecf20Sopenharmony_ci	16-th fault N: res=0/12
454