mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
4590ee0ad3
Running xfs/126 sometimes fails due to output mismatch. Due to the randomized nature of the test, periodically the selected bits are not relevant to the test, or the selected bits are not flipped. Supply an offset that is close to the start of the metadata block, so that the test will reliably corrupt the header. Suggested-by: Darrick J. Wong <darrick.wong@oracle.com> Link: https://lore.kernel.org/linux-xfs/20200116160323.GC2149943@magnolia Signed-off-by: Anthony Iliopoulos <ailiop@suse.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
105 lines
2.9 KiB
Bash
Executable File
105 lines
2.9 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2015 Oracle, Inc. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. 126
|
|
#
|
|
# Create and populate an XFS filesystem, corrupt a leaf xattr's data extent,
|
|
# then see how the kernel and xfs_repair deal with it.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
#rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/attr
|
|
. ./common/populate
|
|
|
|
# real QA test starts here
|
|
_supported_fs xfs
|
|
_supported_os Linux
|
|
|
|
_require_scratch
|
|
test -n "${FORCE_FUZZ}" || _require_scratch_xfs_crc
|
|
_require_attrs
|
|
_require_populate_commands
|
|
_require_xfs_db_blocktrash_z_command
|
|
test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3"
|
|
|
|
rm -f $seqres.full
|
|
|
|
echo "+ create scratch fs"
|
|
_scratch_mkfs_xfs > /dev/null
|
|
|
|
echo "+ mount fs image"
|
|
_scratch_mount
|
|
blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")"
|
|
nr="$((8 * blksz / 40))"
|
|
|
|
echo "+ make some files"
|
|
touch "${SCRATCH_MNT}/attrfile"
|
|
seq 0 "${nr}" | while read d; do
|
|
setfattr -n "user.x$(printf "%.08d" "$d")" -v "0000000000000000" "${SCRATCH_MNT}/attrfile"
|
|
done
|
|
seq 1 2 "${nr}" | while read d; do
|
|
setfattr -x "user.x$(printf "%.08d" "$d")" "${SCRATCH_MNT}/attrfile"
|
|
done
|
|
inode="$(stat -c '%i' "${SCRATCH_MNT}/attrfile")"
|
|
umount "${SCRATCH_MNT}"
|
|
|
|
echo "+ check fs"
|
|
_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail"
|
|
|
|
echo "+ check xattr"
|
|
_scratch_xfs_db -x -c "inode ${inode}" -c "bmap" >> $seqres.full
|
|
_scratch_xfs_db -x -c "inode ${inode}" -c "ablock 0" -c "stack" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)"
|
|
_scratch_xfs_db -x -c "inode ${inode}" -c "ablock 1" -c "stack" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)"
|
|
|
|
echo "+ corrupt xattr"
|
|
loff=1
|
|
while true; do
|
|
_scratch_xfs_db -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" | grep -q 'file attr block is unmapped' && break
|
|
_scratch_xfs_db -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" -c "blocktrash -o 4 -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" >> $seqres.full
|
|
loff="$((loff + 1))"
|
|
done
|
|
|
|
echo "+ mount image && modify xattr"
|
|
if _try_scratch_mount >> $seqres.full 2>&1; then
|
|
|
|
setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" 2> /dev/null && _fail "modified corrupt xattr"
|
|
umount "${SCRATCH_MNT}"
|
|
fi
|
|
|
|
echo "+ repair fs"
|
|
_scratch_xfs_repair >> $seqres.full 2>&1
|
|
_scratch_xfs_repair >> $seqres.full 2>&1
|
|
|
|
echo "+ mount image (2)"
|
|
_scratch_mount
|
|
|
|
echo "+ chattr -R -i"
|
|
$CHATTR_PROG -R -f -i "${SCRATCH_MNT}/"
|
|
|
|
echo "+ modify xattr (2)"
|
|
getfattr "${SCRATCH_MNT}/attrfile" -n "user.x00000000" 2> /dev/null && (setfattr -x "user.x00000000" "${SCRATCH_MNT}/attrfile" || _fail "modified corrupt xattr")
|
|
umount "${SCRATCH_MNT}"
|
|
|
|
echo "+ check fs (2)"
|
|
_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail"
|
|
|
|
status=0
|
|
exit
|