mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
98a3b42b42
These have been scripted conversions then cleaned up by hand as there was no consistency to the formatting of the license headers in the common/ directory. Author information was also removed (it's in the git history) and so now the header format is consistently: ##/bin/bash # SPDX-License-Identifier: GPL-2.0(+) # Copyright (c) <date> <owner>. All Rights Reserved. # # <file description> Signed-off-by: Dave Chinner <dchinner@redhat.com>
133 lines
3.0 KiB
Plaintext
133 lines
3.0 KiB
Plaintext
##/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright (c) 2016 Oracle. All Rights Reserved.
|
|
#
|
|
# Routines for injecting errors into filesystems
|
|
|
|
. ./common/log
|
|
|
|
# Tests whether $FSTYP is one of the filesystems that supports error injection
|
|
_require_error_injection()
|
|
{
|
|
case "$FSTYP" in
|
|
"xfs")
|
|
grep -q 'debug 1' /proc/fs/xfs/stat || \
|
|
_notrun "XFS error injection requires CONFIG_XFS_DEBUG"
|
|
;;
|
|
*)
|
|
_notrun "Error injection not supported on filesystem type: $FSTYP"
|
|
esac
|
|
}
|
|
|
|
# Find the errortag injection knob in sysfs for a given xfs mount's
|
|
# block device.
|
|
_find_xfs_mountdev_errortag_knob()
|
|
{
|
|
dev="$1"
|
|
knob="$2"
|
|
shortdev="$(_short_dev "${dev}")"
|
|
tagfile="/sys/fs/xfs/${shortdev}/errortag/${knob}"
|
|
|
|
# Some of the new sysfs errortag knobs were previously available via
|
|
# another sysfs path.
|
|
case "${knob}" in
|
|
"log_bad_crc")
|
|
if [ ! -w "${tagfile}" ]; then
|
|
tagfile="/sys/fs/xfs/${shortdev}/log/log_badcrc_factor"
|
|
fi
|
|
;;
|
|
"drop_writes")
|
|
if [ ! -w "${tagfile}" ]; then
|
|
tagfile="/sys/fs/xfs/${shortdev}/drop_writes"
|
|
fi
|
|
if [ ! -w "${tagfile}" ]; then
|
|
tagfile="/sys/fs/xfs/${shortdev}/fail_writes"
|
|
fi
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
echo "${tagfile}"
|
|
}
|
|
|
|
# Requires that xfs_io inject command knows about this error type
|
|
_require_xfs_io_error_injection()
|
|
{
|
|
type="$1"
|
|
_require_error_injection
|
|
|
|
# Can we find the error injection knobs via the new errortag
|
|
# configuration mechanism?
|
|
knob="$(_find_xfs_mountdev_errortag_knob "${TEST_DEV}" "${type}")"
|
|
test -w "${knob}" && return
|
|
|
|
# NOTE: We can't actually test error injection here because xfs
|
|
# hasn't always range checked the argument to xfs_errortag_add.
|
|
# We also don't want to trip an error before we're ready to deal
|
|
# with it.
|
|
|
|
$XFS_IO_PROG -x -c 'inject' $TEST_DIR | grep -q "$type" || \
|
|
_notrun "XFS error injection $type unknown."
|
|
}
|
|
|
|
# Inject an error into the test fs
|
|
_test_inject_error()
|
|
{
|
|
type="$1"
|
|
value="$2"
|
|
|
|
knob="$(_find_xfs_mountdev_errortag_knob "${TEST_DEV}" "${type}")"
|
|
if [ -w "${knob}" ]; then
|
|
test -z "${value}" && value="default"
|
|
echo -n "${value}" > "${knob}"
|
|
elif [ -z "${value}" ] || [ "${value}" = "default" ]; then
|
|
$XFS_IO_PROG -x -c "inject $type" $TEST_DIR
|
|
else
|
|
_fail "Cannot inject error ${type} value ${value}."
|
|
fi
|
|
}
|
|
|
|
# Inject an error into the scratch fs
|
|
_scratch_inject_error()
|
|
{
|
|
type="$1"
|
|
value="$2"
|
|
|
|
knob="$(_find_xfs_mountdev_errortag_knob "${SCRATCH_DEV}" "${type}")"
|
|
if [ -w "${knob}" ]; then
|
|
test -z "${value}" && value="default"
|
|
echo -n "${value}" > "${knob}"
|
|
elif [ -z "${value}" ] || [ "${value}" = "default" ]; then
|
|
$XFS_IO_PROG -x -c "inject $type" $SCRATCH_MNT
|
|
else
|
|
_fail "Cannot inject error ${type} value ${value}."
|
|
fi
|
|
}
|
|
|
|
# Unmount and remount the scratch device, dumping the log
|
|
_scratch_inject_logprint()
|
|
{
|
|
local opts="$1"
|
|
|
|
if test -n "$opts"; then
|
|
opts="-o $opts"
|
|
fi
|
|
_scratch_unmount
|
|
_scratch_dump_log
|
|
_scratch_mount "$opts"
|
|
}
|
|
|
|
# Unmount and remount the test device, dumping the log
|
|
_test_inject_logprint()
|
|
{
|
|
local opts="$1"
|
|
|
|
if test -n "$opts"; then
|
|
opts="-o $opts"
|
|
fi
|
|
_test_unmount
|
|
_test_dump_log
|
|
_test_mount "$opts"
|
|
}
|