fault-injection: fix example scripts in documentation

Fix and cleanup example scripts in fault injection documentation.

1. Eliminate broken oops() shell function.

2. Fold failcmd.sh and failmodule.sh into example scripts. It makes
   the example scripts work independent of current working directory.

3. Set "space" parameter to 0 to start injecting errors immediately.

4. Use /sys/module/<modulename>/sections/.data as upper bound of
   .text section. Because some module doesn't have .exit.text section.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Akinobu Mita 2007-07-15 23:40:24 -07:00 committed by Linus Torvalds
parent 54114994f4
commit 185848707e
3 changed files with 55 additions and 83 deletions

View File

@ -1,4 +0,0 @@
#!/bin/bash
echo 1 > /proc/self/make-it-fail
exec $*

View File

@ -1,31 +0,0 @@
#!/bin/bash
#
# Usage: failmodule <failname> <modulename> [stacktrace-depth]
#
# <failname>: "failslab", "fail_alloc_page", or "fail_make_request"
#
# <modulename>: module name that you want to inject faults.
#
# [stacktrace-depth]: the maximum number of stacktrace walking allowed
#
STACKTRACE_DEPTH=5
if [ $# -gt 2 ]; then
STACKTRACE_DEPTH=$3
fi
if [ ! -d /debug/$1 ]; then
echo "Fault-injection $1 does not exist" >&2
exit 1
fi
if [ ! -d /sys/module/$2 ]; then
echo "Module $2 does not exist" >&2
exit 1
fi
# Disable any fault injection
echo 0 > /debug/$1/stacktrace-depth
echo `cat /sys/module/$2/sections/.text` > /debug/$1/require-start
echo `cat /sys/module/$2/sections/.exit.text` > /debug/$1/require-end
echo $STACKTRACE_DEPTH > /debug/$1/stacktrace-depth

View File

@ -161,70 +161,77 @@ o add a hook to insert failures
Application Examples Application Examples
-------------------- --------------------
o inject slab allocation failures into module init/cleanup code o Inject slab allocation failures into module init/exit code
------------------------------------------------------------------------------
#!/bin/bash #!/bin/bash
FAILCMD=Documentation/fault-injection/failcmd.sh FAILTYPE=failslab
BLACKLIST="root_plug evbug" echo Y > /debug/$FAILTYPE/task-filter
echo 10 > /debug/$FAILTYPE/probability
echo 100 > /debug/$FAILTYPE/interval
echo -1 > /debug/$FAILTYPE/times
echo 0 > /debug/$FAILTYPE/space
echo 2 > /debug/$FAILTYPE/verbose
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
FAILNAME=failslab faulty_system()
echo Y > /debug/$FAILNAME/task-filter
echo 10 > /debug/$FAILNAME/probability
echo 100 > /debug/$FAILNAME/interval
echo -1 > /debug/$FAILNAME/times
echo 2 > /debug/$FAILNAME/verbose
echo 1 > /debug/$FAILNAME/ignore-gfp-wait
blacklist()
{ {
echo $BLACKLIST | grep $1 > /dev/null 2>&1 bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
} }
oops() if [ $# -eq 0 ]
{ then
dmesg | grep BUG > /dev/null 2>&1 echo "Usage: $0 modulename [ modulename ... ]"
} exit 1
fi
find /lib/modules/`uname -r` -name '*.ko' -exec basename {} .ko \; | for m in $*
while read i do
do echo inserting $m...
oops && exit 1 faulty_system modprobe $m
if ! blacklist $i echo removing $m...
then faulty_system modprobe -r $m
echo inserting $i... done
bash $FAILCMD modprobe $i
fi
done
lsmod | awk '{ if ($3 == 0) { print $1 } }' |
while read i
do
oops && exit 1
if ! blacklist $i
then
echo removing $i...
bash $FAILCMD modprobe -r $i
fi
done
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
o inject slab allocation failures only for a specific module o Inject page allocation failures only for a specific module
------------------------------------------------------------------------------
#!/bin/bash #!/bin/bash
FAILMOD=Documentation/fault-injection/failmodule.sh FAILTYPE=fail_page_alloc
module=$1
echo injecting errors into the module $1... if [ -z $module ]
then
echo "Usage: $0 <modulename>"
exit 1
fi
modprobe $1 modprobe $module
bash $FAILMOD failslab $1 10
echo 25 > /debug/failslab/probability
------------------------------------------------------------------------------ if [ ! -d /sys/module/$module/sections ]
then
echo Module $module is not loaded
exit 1
fi
cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end
echo N > /debug/$FAILTYPE/task-filter
echo 10 > /debug/$FAILTYPE/probability
echo 100 > /debug/$FAILTYPE/interval
echo -1 > /debug/$FAILTYPE/times
echo 0 > /debug/$FAILTYPE/space
echo 2 > /debug/$FAILTYPE/verbose
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
echo 10 > /debug/$FAILTYPE/stacktrace-depth
trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
echo "Injecting errors into the module $module... (interrupt to stop)"
sleep 1000000