Files
apfstests/tests/xfs/123
T
Darrick J. Wong 6cef63e668 xfs/123: fix remote symlink block size calculation
In this test we try to create a remote symlink block by creating a
symlink target buffer large enough to exceed the size of an inode.
Unfortunately we don't use the correct block size or symlink header
size, which on a 1k block filesystem causes there to be two remote
blocks.  This causes crc verification errors in xfs_db (because it's
too dumb to load both blocks as one like the kernel does) which we
don't care about because we're about to corrupt the block anyway.

So, fix the block size calculation so that we end up with one block.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2018-12-22 22:16:04 +08:00

85 lines
2.0 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015 Oracle, Inc. All Rights Reserved.
#
# FS QA Test No. 123
#
# Create and populate an XFS filesystem, corrupt a long symlink, 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=1024
echo "+ make some files"
echo "file contents: moo" > "${SCRATCH_MNT}/x"
reps=$(( (blksz - (56 + 1)) / 2 ))
str="$(perl -e "print './' x $reps;")x"
(cd $SCRATCH_MNT; ln -s "${str}" "long_symlink")
cat "${SCRATCH_MNT}/long_symlink"
inode="$(stat -c '%i' "${SCRATCH_MNT}/long_symlink")"
umount "${SCRATCH_MNT}"
echo "+ check fs"
_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail"
echo "+ corrupt image"
_scratch_xfs_db -x -c "inode ${inode}" -c "dblock 0" -c "stack" -c "blocktrash -x 32 -o 256 -y $((blksz * 4)) -z ${FUZZ_ARGS}" >> $seqres.full
echo "+ mount image"
if _try_scratch_mount >> $seqres.full 2>&1; then
cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken"
umount "${SCRATCH_MNT}"
fi
echo "+ repair fs"
_scratch_xfs_repair >> $seqres.full 2>&1
echo "+ mount image (2)"
_scratch_mount
cat "${SCRATCH_MNT}/long_symlink" 2>/dev/null && _fail "symlink should be broken"
umount "${SCRATCH_MNT}"
echo "+ check fs (2)"
_scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail"
status=0
exit