#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2017 Liu Bo. All Rights Reserved. # Copyright (c) 2022 Christoph Hellwig. # # FS QA Test 265 # # Test that btrfs raid repair on a raid1c3 profile can repair corruption on two # mirrors for the same logical offset. # . ./common/preamble _begin_fstest auto quick read_repair . ./common/filter _supported_fs btrfs _require_scratch_dev_pool 3 # No data checksums for NOCOW case, so can't detect corruption and repair data. _require_btrfs_no_nodatacow _require_odirect # Overwriting data is forbidden on a zoned block device _require_non_zoned_device "${SCRATCH_DEV}" _scratch_dev_pool_get 3 # step 1, create a raid1 btrfs which contains one 128k file. echo "step 1......mkfs.btrfs" mkfs_opts="-d raid1c3 -b 1G" _scratch_pool_mkfs $mkfs_opts >>$seqres.full 2>&1 _scratch_mount $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 one copy (on SCRATCH_DEV which is the first # one in $SCRATCH_DEV_POOL echo "step 2......corrupt file extent" # ensure btrfs-map-logical sees the tree updates sync logical=$(_btrfs_get_first_logical $SCRATCH_MNT/foobar) physical1=$(_btrfs_get_physical ${logical} 1) devpath1=$(_btrfs_get_device_path ${logical} 1) physical2=$(_btrfs_get_physical ${logical} 2) devpath2=$(_btrfs_get_device_path ${logical} 2) _scratch_unmount echo " corrupt stripe #1, devpath $devpath1 physical $physical1" \ >> $seqres.full $XFS_IO_PROG -d -c "pwrite -S 0xbf -b 64K $physical1 64K" $devpath1 \ > /dev/null echo " corrupt stripe #2, devpath $devpath2 physical $physical2" \ >> $seqres.full $XFS_IO_PROG -d -c "pwrite -S 0xbf -b 64K $physical2 64K" $devpath2 \ > /dev/null _scratch_mount # step 3, 128k dio read (this read can repair bad copy) echo "step 3......repair the bad copy" _btrfs_direct_read_on_mirror 0 3 "$SCRATCH_MNT/foobar" 0 128K _btrfs_direct_read_on_mirror 1 3 "$SCRATCH_MNT/foobar" 0 128K _scratch_unmount echo "step 4......check if the repair worked" $XFS_IO_PROG -d -c "pread -v -b 512 $physical1 512" $devpath1 |\ _filter_xfs_io_offset $XFS_IO_PROG -d -c "pread -v -b 512 $physical2 512" $devpath2 |\ _filter_xfs_io_offset _scratch_dev_pool_put # success, all done status=0 exit