blob: 50d31863a589f3ea1570b698eb386701ba548a1b [file] [log] [blame]
#! /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