#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2022 Christoph Hellwig. # # FS QA Test btrfs/271 # # Test btrfs write error propagation and reporting on the raid1 profile. # . ./common/preamble _begin_fstest auto quick raid . ./common/filter . ./common/fail_make_request _supported_fs btrfs _require_scratch _require_fail_make_request _require_scratch_dev_pool 2 _scratch_dev_pool_get 2 _check_minimal_fs_size $(( 1024 * 1024 * 1024 )) _scratch_pool_mkfs "-d raid1 -b 1G" >> $seqres.full 2>&1 _scratch_mount dev2=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}'` pagesize=$(get_page_size) blocksize=$(_get_block_size $SCRATCH_MNT) sectors_per_page=$(($pagesize / $blocksize)) _allow_fail_make_request echo "Step 1: writing with one failing mirror:" _bdev_fail_make_request $SCRATCH_DEV 1 $XFS_IO_PROG -f -c "pwrite -W -S 0xaa 0 8K" $SCRATCH_MNT/foobar | _filter_xfs_io _bdev_fail_make_request $SCRATCH_DEV 0 errs=$($BTRFS_UTIL_PROG device stats $SCRATCH_DEV | \ $AWK_PROG '/write_io_errs/ { print $2 }') if [ $errs -ne $((4 * $sectors_per_page)) ]; then _fail "Errors: $errs expected: 4" fi echo "Step 2: verify that the data reads back fine:" $XFS_IO_PROG -c "pread -v 0 8K" $SCRATCH_MNT/foobar | _filter_xfs_io_offset echo "Step 3: writing with two failing mirrors (should fail):" _bdev_fail_make_request $SCRATCH_DEV 1 _bdev_fail_make_request $dev2 1 $XFS_IO_PROG -f -c "pwrite -W -S 0xbb 0 8K" $SCRATCH_MNT/foobar | _filter_xfs_io _bdev_fail_make_request $dev2 0 _bdev_fail_make_request $SCRATCH_DEV 0 _disallow_fail_make_request _scratch_dev_pool_put # success, all done status=0 exit