Files
apfstests/tests/btrfs/142
T
Darrick J. Wong 7e98d41a6e fstests: move test group info to test files
Refactor every test in the entire test suite to use the new boilerplate
functions.  This also migrates all the test group information into the
test files.  This patch has been autogenerated via the command:

./tools/convert-group btrfs ceph cifs ext4 f2fs generic nfs ocfs2 overlay perf shared udf xfs

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2021-06-27 22:50:02 +08:00

85 lines
2.4 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2017 Liu Bo. All Rights Reserved.
#
# FS QA Test 142
#
# Regression test for btrfs DIO read's repair during read without checksum.
#
# Commit 2dabb3248453 ("Btrfs: Direct I/O read: Work on sectorsized blocks")
# introduced this regression. It'd cause 'Segmentation fault' error.
#
# The upstream fix is
# commit 97bf5a5589aa ("Btrfs: fix segmentation fault when doing dio read")
#
. ./common/preamble
_begin_fstest auto quick
# Import common functions.
. ./common/filter
. ./common/dmdust
# real QA test starts here
# Modify as appropriate.
_supported_fs btrfs
_require_scratch_dev_pool 2
_require_dm_target dust
_require_btrfs_command inspect-internal dump-tree
_require_command "$FILEFRAG_PROG" filefrag
_scratch_dev_pool_get 2
# step 1, create a raid1 btrfs which contains one 128k file.
echo "step 1......mkfs.btrfs" >>$seqres.full
mkfs_opts="-d raid1 -b 1G"
_scratch_pool_mkfs $mkfs_opts >>$seqres.full 2>&1
# -o nospace_cache makes sure data is written to the start position of the data
# chunk
_scratch_mount -o nospace_cache,nodatasum
$XFS_IO_PROG -f -d -c "pwrite -S 0xaa -b 128K 0 128K" "$SCRATCH_MNT/foobar" |\
_filter_xfs_io_offset
# step 2, corrupt the first 64k of stripe #1
echo "step 2......corrupt file extent" >>$seqres.full
${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
echo "Logical offset is $logical_in_btrfs" >>$seqres.full
_scratch_unmount
read -r stripe physical < <(
$BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 "$SCRATCH_DEV" |
grep "$logical_in_btrfs" -A 6 |
$AWK_PROG '$1 == "stripe" && $3 == "devid" && $4 == 1 { print $2 " " $6; exit }')
echo "Physical offset of stripe $stripe is $physical on devid 1" >> $seqres.full
$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" "$SCRATCH_DEV" > /dev/null
_init_dust
_mount_dust
# step 3, 128k dio read (this read can repair bad copy)
echo "step 3......repair the bad copy" >>$seqres.full
$DMSETUP_PROG message dust-test 0 addbadblock $((physical / 512))
$DMSETUP_PROG message dust-test 0 enable
while [[ -z $( (( BASHPID % 2 == stripe )) &&
exec $XFS_IO_PROG -d -c "pread -b 128K 0 128K" "$SCRATCH_MNT/foobar") ]]; do
:
done
_cleanup_dust
# check if the repair works
$XFS_IO_PROG -c "pread -v -b 512 $physical 512" "$SCRATCH_DEV" |
_filter_xfs_io_offset
_scratch_dev_pool_put
# success, all done
status=0
exit