| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2016 Oracle. All Rights Reserved. |
| # |
| # FS QA Test 124 |
| # |
| # This test verify the RAID1 reconstruction on the reappeared |
| # device. By using the following steps: |
| # Initialize a RAID1 with some data |
| # |
| # Re-mount RAID1 degraded with dev2 missing and write up to |
| # half of the FS capacity. |
| # Save md5sum checkpoint1 |
| # |
| # Re-mount healthy RAID1 |
| # |
| # Let balance re-silver. |
| # Save md5sum checkpoint2 |
| # |
| # Re-mount RAID1 degraded with dev1 missing |
| # Save md5sum checkpoint3 |
| # |
| # Verify if all three checkpoints match |
| # |
| . ./common/preamble |
| _begin_fstest auto replace volume balance |
| |
| # Override the default cleanup function. |
| _cleanup() |
| { |
| cd / |
| rm -f $tmp.* |
| _btrfs_rescan_devices |
| } |
| |
| . ./common/filter |
| |
| _require_scratch_dev_pool 2 |
| _test_unmount |
| _require_btrfs_forget_or_module_loadable |
| |
| _scratch_dev_pool_get 2 |
| |
| dev1=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $1}'` |
| dev2=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}'` |
| |
| # RAID1 is not supported on zoned btrfs |
| _require_non_zoned_device "$dev1" |
| _require_non_zoned_device "$dev2" |
| |
| dev1_sz=`blockdev --getsize64 $dev1` |
| dev2_sz=`blockdev --getsize64 $dev2` |
| # get min of both |
| max_fs_sz=`echo -e "$dev1_sz\n$dev2_sz" | sort -n | head -1` |
| # Need disks with more than 2G. |
| if [ $max_fs_sz -lt 2000000000 ]; then |
| _scratch_dev_pool_put |
| _test_mount |
| _notrun "Smallest dev size $max_fs_sz, Need at least 2G" |
| fi |
| max_fs_sz=1200000000 |
| bs="1M" |
| count=$(($max_fs_sz / 1000000)) |
| |
| echo >> $seqres.full |
| echo "max_fs_sz=$max_fs_sz count=$count" >> $seqres.full |
| echo "-----Initialize -----" >> $seqres.full |
| _scratch_pool_mkfs "-mraid1 -draid1" >> $seqres.full 2>&1 |
| _scratch_mount >> $seqres.full 2>&1 |
| _btrfs filesystem show |
| dd if=/dev/zero of="$SCRATCH_MNT"/tf1 bs=$bs count=1 \ |
| >>$seqres.full 2>&1 |
| echo "unmount" >> $seqres.full |
| echo "clean btrfs ko" >> $seqres.full |
| _scratch_unmount |
| |
| # un-scan the btrfs devices |
| _btrfs_forget_or_module_reload |
| |
| echo >> $seqres.full |
| echo "-----Write degraded mount fill upto $max_fs_sz bytes-----" >> $seqres.full |
| echo |
| echo "Write data with degraded mount" |
| # Since we didn't run dev scan, btrfs kernel does not know |
| # about the dev2 |
| # don't use _scratch_mount as we want to control |
| # the device used for mounting. |
| |
| _mount -o degraded $dev1 $SCRATCH_MNT >>$seqres.full 2>&1 |
| _btrfs filesystem show |
| dd if=/dev/zero of="$SCRATCH_MNT"/tf2 bs=$bs count=$count \ |
| >>$seqres.full 2>&1 |
| checkpoint1=`md5sum $SCRATCH_MNT/tf2` |
| echo $checkpoint1 >> $seqres.full 2>&1 |
| _scratch_unmount |
| echo "unmount" >> $seqres.full |
| |
| echo >> $seqres.full |
| echo "-----Mount normal-----" >> $seqres.full |
| echo |
| echo "Mount normal and balance" |
| _btrfs device scan |
| _scratch_mount >> $seqres.full 2>&1 |
| _btrfs filesystem show |
| echo >> $seqres.full |
| _run_btrfs_balance_start ${SCRATCH_MNT} >>$seqres.full |
| |
| checkpoint2=`md5sum $SCRATCH_MNT/tf2` |
| echo $checkpoint2 >> $seqres.full 2>&1 |
| |
| echo >> $seqres.full |
| echo "-----Mount degraded with the other dev -----" >> $seqres.full |
| echo |
| echo "Mount degraded with the other dev" |
| _scratch_unmount |
| # un-scan the btrfs devices |
| _btrfs_forget_or_module_reload |
| _mount -o degraded $dev2 $SCRATCH_MNT >>$seqres.full 2>&1 |
| _btrfs filesystem show |
| checkpoint3=`md5sum $SCRATCH_MNT/tf2` |
| echo $checkpoint3 >> $seqres.full 2>&1 |
| |
| if [ "$checkpoint1" != "$checkpoint2" ]; then |
| echo $checkpoint1 |
| echo $checkpoint2 |
| echo "Inital sum does not match with after balance" |
| fi |
| |
| if [ "$checkpoint1" != "$checkpoint3" ]; then |
| echo $checkpoint1 |
| echo $checkpoint3 |
| echo "Inital sum does not match with data on dev2 written by balance" |
| fi |
| |
| $UMOUNT_PROG $dev2 |
| _scratch_dev_pool_put |
| _btrfs_rescan_devices |
| _test_mount |
| |
| status=0 |
| exit |