#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2017 Oracle. All Rights Reserved. # # FS QA Test 154 # # Test for reappearing missing device functionality. # This test will fail without the btrfs kernel patch # [PATCH] btrfs: handle dynamically reappearing missing device # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / rm -f $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/module # remove previous $seqres.full before test rm -f $seqres.full # real QA test starts here _supported_fs btrfs _supported_os Linux _require_scratch_dev_pool 2 _require_loadable_fs_module "btrfs" _scratch_dev_pool_get 2 DEV1=`echo $SCRATCH_DEV_POOL | awk '{print $1}'` DEV2=`echo $SCRATCH_DEV_POOL | awk '{print $2}'` echo DEV1=$DEV1 >> $seqres.full echo DEV2=$DEV2 >> $seqres.full # Balance won't be successful if filled too much DEV1_SZ=`blockdev --getsize64 $DEV1` DEV2_SZ=`blockdev --getsize64 $DEV2` # get min MAX_FS_SZ=`echo -e "$DEV1_SZ\n$DEV2_SZ" | sort | head -1` # Need disks with more than 2G if [ $MAX_FS_SZ -lt 2000000000 ]; then _scratch_dev_pool_put _notrun "Smallest dev size $MAX_FS_SZ, Need at least 2G" fi MAX_FS_SZ=100000000 bs="1M" COUNT=$(($MAX_FS_SZ / 1000000)) CHECKPOINT1=0 CHECKPOINT2=0 setup() { echo >> $seqres.full echo "MAX_FS_SZ=$MAX_FS_SZ COUNT=$COUNT" >> $seqres.full echo "setup" echo "-----setup-----" >> $seqres.full _scratch_pool_mkfs "-mraid1 -draid1" >> $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 dd if=/dev/urandom of="$SCRATCH_MNT"/tf bs=$bs count=1 \ >>$seqres.full 2>&1 _run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT} _run_btrfs_util_prog filesystem df $SCRATCH_MNT COUNT=$(( $COUNT - 1 )) echo "unmount" >> $seqres.full _scratch_unmount } degrade_mount_write() { echo >> $seqres.full echo "--degraded mount: max_fs_sz $max_fs_sz bytes--" >> $seqres.full echo echo "degraded mount" echo "clean btrfs ko" >> $seqres.full # un-scan the btrfs devices _reload_fs_module "btrfs" _mount -o degraded $DEV1 $SCRATCH_MNT >>$seqres.full 2>&1 cnt=$(( $COUNT/10 )) dd if=/dev/urandom of="$SCRATCH_MNT"/tf1 bs=$bs count=$cnt \ >>$seqres.full 2>&1 COUNT=$(( $COUNT - $cnt )) _run_btrfs_util_prog filesystem show -m $SCRATCH_MNT _run_btrfs_util_prog filesystem df $SCRATCH_MNT CHECKPOINT1=`md5sum $SCRATCH_MNT/tf1` echo $SCRATCH_MNT/tf1:$CHECKPOINT1 >> $seqres.full } scan_missing_dev_and_write() { echo >> $seqres.full echo "--scan missing $DEV2--" >> $seqres.full echo echo "scan missing dev and write" _run_btrfs_util_prog device scan $DEV2 echo >> $seqres.full _run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT} _run_btrfs_util_prog filesystem df ${SCRATCH_MNT} dd if=/dev/urandom of="$SCRATCH_MNT"/tf2 bs=$bs count=$COUNT \ >>$seqres.full 2>&1 CHECKPOINT2=`md5sum $SCRATCH_MNT/tf2` echo $SCRATCH_MNT/tf2:$CHECKPOINT2 >> $seqres.full } balance_convert() { echo >> $seqres.full echo "----- run balance -----" >> $seqres.full echo echo "run balance" _run_btrfs_util_prog balance start --full-balance -dconvert=raid1 \ -mconvert=raid1 ${SCRATCH_MNT} } verify() { echo >> $seqres.full echo "--mount reconstructed dev only and check md5sum--" >> $seqres.full echo echo "mount reconstructed dev only and check md5sum" echo "unmount" >> $seqres.full _scratch_unmount _reload_fs_module "btrfs" _mount -o degraded $DEV2 $SCRATCH_MNT >>$seqres.full 2>&1 verify_checkpoint1=`md5sum $SCRATCH_MNT/tf1` verify_checkpoint2=`md5sum $SCRATCH_MNT/tf2` if [ "$verify_checkpoint1" != "$CHECKPOINT1" ]; then echo "checkpoint1 on reappeared disk does not match after balance" fi if [ "$verify_checkpoint2" != "$CHECKPOINT2" ]; then echo "checkpoint2 on reappeared disk does not match after balance" fi } setup degrade_mount_write scan_missing_dev_and_write balance_convert verify $UMOUNT_PROG $DEV2 _scratch_dev_pool_put status=0 exit