mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
7e98d41a6e
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>
85 lines
2.4 KiB
Bash
Executable File
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
|