#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2022 SUSE Linux Products GmbH. All Rights Reserved. # # FS QA Test 261 # # Make sure btrfs raid profiles can handling one corrupted device # without affecting the consistency of the fs. # . ./common/preamble _begin_fstest auto volume raid _supported_fs btrfs _require_scratch_dev_pool 4 _btrfs_get_profile_configs replace-missing _require_fssum prepare_fs() { local mkfs_opts=$1 # We don't want too large fs which can take too long to populate # And the extra redirection of stderr is to avoid the RAID56 warning # message to polluate the golden output _scratch_pool_mkfs $mkfs_opts -b 1G >> $seqres.full 2>&1 if [ $? -ne 0 ]; then _fail "mkfs $mkfs_opts failed" fi # Disable compression, as compressed read repair is known to have problems _scratch_mount -o compress=no # Fill some part of the fs first $XFS_IO_PROG -f -c "pwrite -S 0xfe 0 400M" $SCRATCH_MNT/garbage > /dev/null 2>&1 # Then use fsstress to generate some extra contents. # Disable setattr related operations, as it may set NODATACOW which will # not allow us to use btrfs checksum to verify the content. $FSSTRESS_PROG -f setattr=0 -d $SCRATCH_MNT -w -n 3000 > /dev/null 2>&1 sync # Save the fssum of this fs $FSSUM_PROG -A -f -w $tmp.saved_fssum $SCRATCH_MNT _scratch_unmount } workload() { local mkfs_opts=$1 local num_devs=$2 _scratch_dev_pool_get 4 echo "=== Testing profile $mkfs_opts ===" >> $seqres.full rm -f -- $tmp.saved_fssum prepare_fs "$mkfs_opts" # $SCRATCH_DEV is always the first device of dev pool. # Corrupt the disk but keep the primary superblock. $XFS_IO_PROG -c "pwrite 1M 1023M" $SCRATCH_DEV > /dev/null 2>&1 _scratch_mount # All content should be fine $FSSUM_PROG -r $tmp.saved_fssum $SCRATCH_MNT > /dev/null # Scrub to fix the fs, this is known to report various correctable # errors $BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT >> $seqres.full 2>&1 # Make sure above scrub fixed the fs # Redirect the stderr to seqres.full as well to avoid warnings if # /var/lib filesystem is readonly, as scrub fails to write status. $BTRFS_UTIL_PROG scrub start -Br $SCRATCH_MNT >> $seqres.full 2>&1 if [ $? -ne 0 ]; then echo "scrub failed to fix the fs for profile $mkfs_opts" fi _scratch_unmount _scratch_dev_pool_put } for t in "${_btrfs_profile_configs[@]}"; do workload "$t" done echo "Silence is golden" # success, all done status=0 exit