| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # Copyright (c) 2021 Oracle. All Rights Reserved. |
| # |
| # FS QA Test No. 158 |
| # |
| # Check that we can upgrade a filesystem to support inobtcount and that |
| # everything works properly after the upgrade. |
| |
| 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 |
| |
| # real QA test starts here |
| _supported_fs xfs |
| _require_scratch_xfs_inobtcount |
| _require_command "$XFS_ADMIN_PROG" "xfs_admin" |
| _require_xfs_repair_upgrade inobtcount |
| |
| rm -f $seqres.full |
| |
| # Make sure we can't format a filesystem with inobtcount and not finobt. |
| _scratch_mkfs -m crc=1,inobtcount=1,finobt=0 &> $seqres.full && \ |
| echo "Should not be able to format with inobtcount but not finobt." |
| |
| # Make sure we can't upgrade a V4 filesystem |
| _scratch_mkfs -m crc=0,inobtcount=0,finobt=0 >> $seqres.full |
| _scratch_xfs_admin -O inobtcount=1 2>> $seqres.full |
| _check_scratch_xfs_features INOBTCNT |
| |
| # Make sure we can't upgrade a filesystem to inobtcount without finobt. |
| _scratch_mkfs -m crc=1,inobtcount=0,finobt=0 >> $seqres.full |
| _scratch_xfs_admin -O inobtcount=1 2>> $seqres.full |
| _check_scratch_xfs_features INOBTCNT |
| |
| # Format V5 filesystem without inode btree counter support and populate it. |
| _scratch_mkfs -m crc=1,inobtcount=0 >> $seqres.full |
| _scratch_mount |
| |
| mkdir $SCRATCH_MNT/stress |
| $FSSTRESS_PROG -d $SCRATCH_MNT/stress -n 1000 >> $seqres.full |
| echo moo > $SCRATCH_MNT/urk |
| |
| _scratch_unmount |
| |
| # Upgrade filesystem to have the counters and inject failure into repair and |
| # make sure that the only path forward is to re-run repair on the filesystem. |
| echo "Fail partway through upgrading" |
| XFS_REPAIR_FAIL_AFTER_PHASE=2 _scratch_xfs_repair -c inobtcount=1 2>> $seqres.full |
| test $? -eq 137 || echo "repair should have been killed??" |
| _check_scratch_xfs_features NEEDSREPAIR INOBTCNT |
| _try_scratch_mount &> $tmp.mount |
| res=$? |
| _filter_scratch < $tmp.mount |
| if [ $res -eq 0 ]; then |
| echo "needsrepair should have prevented mount" |
| _scratch_unmount |
| fi |
| |
| echo "Re-run repair to finish upgrade" |
| _scratch_xfs_repair 2>> $seqres.full |
| _check_scratch_xfs_features NEEDSREPAIR INOBTCNT |
| |
| echo "Filesystem should be usable again" |
| _scratch_mount |
| $FSSTRESS_PROG -d $SCRATCH_MNT/stress -n 1000 >> $seqres.full |
| _scratch_unmount |
| _check_scratch_fs |
| _check_scratch_xfs_features INOBTCNT |
| |
| echo "Make sure we have nonzero counters" |
| _scratch_xfs_db -c 'agi 0' -c 'print ino_blocks fino_blocks' | \ |
| sed -e 's/= 0$/= ZERO/g' -e 's/= [0-9]*/= NONZERO/g' |
| |
| echo "Make sure we can't re-add inobtcount" |
| _scratch_xfs_admin -O inobtcount=1 2>> $seqres.full |
| |
| echo "Mount again, look at our files" |
| _scratch_mount >> $seqres.full |
| cat $SCRATCH_MNT/urk |
| |
| status=0 |
| exit |