xfs: test upgrading filesystem to bigtime

Test that we can upgrade an existing filesystem to use bigtime.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>	(xfs/908 only)
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Darrick J. Wong
2021-04-27 21:08:33 -07:00
committed by Eryu Guan
parent 05dc922771
commit 2837d7c32d
6 changed files with 327 additions and 0 deletions
+16
View File
@@ -1185,3 +1185,19 @@ _xfs_timestamp_range()
awk '{printf("%s %s", $1, $2);}'
fi
}
# Require that the scratch device exists, that mkfs can format with bigtime
# enabled, that the kernel can mount such a filesystem, and that xfs_info
# advertises the presence of that feature.
_require_scratch_xfs_bigtime()
{
_require_scratch
_scratch_mkfs -m bigtime=1 &>/dev/null || \
_notrun "mkfs.xfs doesn't support bigtime feature"
_try_scratch_mount || \
_notrun "kernel doesn't support xfs bigtime feature"
$XFS_INFO_PROG "$SCRATCH_MNT" | grep -q -w "bigtime=1" || \
_notrun "bigtime feature not advertised on mount?"
_scratch_unmount
}
Executable
+117
View File
@@ -0,0 +1,117 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 160
#
# Check that we can upgrade a filesystem to support bigtime and that inode
# timestamps work 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_command "$XFS_ADMIN_PROG" "xfs_admin"
_require_scratch_xfs_bigtime
_require_xfs_repair_upgrade bigtime
date --date='Jan 1 00:00:00 UTC 2040' > /dev/null 2>&1 || \
_notrun "Userspace does not support dates past 2038."
rm -f $seqres.full
# Make sure we can't upgrade a V4 filesystem
_scratch_mkfs -m crc=0 >> $seqres.full
_scratch_xfs_admin -O bigtime=1 2>> $seqres.full
_check_scratch_xfs_features BIGTIME
# Make sure we're required to specify a feature status
_scratch_mkfs -m crc=1,bigtime=0,inobtcount=0 >> $seqres.full
_scratch_xfs_admin -O bigtime 2>> $seqres.full
# Can we add bigtime and inobtcount at the same time?
_scratch_mkfs -m crc=1,bigtime=0,inobtcount=0 >> $seqres.full
_scratch_xfs_admin -O bigtime=1,inobtcount=1 2>> $seqres.full
# Format V5 filesystem without bigtime support and populate it
_scratch_mkfs -m crc=1,bigtime=0 >> $seqres.full
_scratch_xfs_db -c 'version' -c 'sb 0' -c 'p' >> $seqres.full
_scratch_mount >> $seqres.full
touch -d 'Jan 9 19:19:19 UTC 1999' $SCRATCH_MNT/a
touch -d 'Jan 9 19:19:19 UTC 1999' $SCRATCH_MNT/b
ls -la $SCRATCH_MNT/* >> $seqres.full
echo before upgrade:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
_scratch_unmount
_check_scratch_fs
# Now upgrade to bigtime support
_scratch_xfs_admin -O bigtime=1 2>> $seqres.full
_check_scratch_xfs_features BIGTIME
_check_scratch_fs
_scratch_xfs_db -c 'version' -c 'sb 0' -c 'p' >> $seqres.full
# Mount again, look at our files
_scratch_mount >> $seqres.full
ls -la $SCRATCH_MNT/* >> $seqres.full
echo after upgrade:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
# Bump one of the timestamps but stay under 2038
touch -d 'Jan 10 19:19:19 UTC 1999' $SCRATCH_MNT/a
echo after upgrade and bump:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
_scratch_cycle_mount
# Did the bumped timestamp survive the remount?
ls -la $SCRATCH_MNT/* >> $seqres.full
echo after upgrade, bump, and remount:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
# Modify the other timestamp to stretch beyond 2038
touch -d 'Feb 22 22:22:22 UTC 2222' $SCRATCH_MNT/b
echo after upgrade and extension:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
_scratch_cycle_mount
# Did the timestamp survive the remount?
ls -la $SCRATCH_MNT/* >> $seqres.full
echo after upgrade, extension, and remount:
TZ=UTC stat -c '%Y' $SCRATCH_MNT/a
TZ=UTC stat -c '%Y' $SCRATCH_MNT/b
# success, all done
status=0
exit
+29
View File
@@ -0,0 +1,29 @@
QA output created by 160
Running xfs_repair to upgrade filesystem.
Large timestamp feature only supported on V5 filesystems.
FEATURES: BIGTIME:NO
Running xfs_repair to upgrade filesystem.
Running xfs_repair to upgrade filesystem.
Adding inode btree counts to filesystem.
Adding large timestamp support to filesystem.
before upgrade:
915909559
915909559
Running xfs_repair to upgrade filesystem.
Adding large timestamp support to filesystem.
FEATURES: BIGTIME:YES
after upgrade:
915909559
915909559
after upgrade and bump:
915995959
915909559
after upgrade, bump, and remount:
915995959
915909559
after upgrade and extension:
915995959
7956915742
after upgrade, extension, and remount:
915995959
7956915742
Executable
+157
View File
@@ -0,0 +1,157 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2021 Oracle. All Rights Reserved.
#
# FS QA Test No. 161
#
# Check that we can upgrade a filesystem to support bigtime and that quota
# timers work properly after the upgrade. You need a quota-tools containing
# commit 16b60cb9e315ed for this test to run properly; v4.06 should do.
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/quota
# real QA test starts here
_supported_fs xfs
_require_command "$XFS_ADMIN_PROG" "xfs_admin"
_require_command "$QUOTA_PROG" "quota"
_require_quota
_require_scratch_xfs_bigtime
_require_xfs_repair_upgrade bigtime
# The word 'projectname' was added to quota(8)'s synopsis shortly after
# y2038+ support was added for XFS, so we use that to decide if we're going
# to run this test at all.
$QUOTA_PROG --help 2>&1 | grep -q projectname || \
_notrun 'quota: bigtime support not detected'
date --date='Jan 1 00:00:00 UTC 2040' > /dev/null 2>&1 || \
_notrun "Userspace does not support dates past 2038."
rm -f $seqres.full
# Format V5 filesystem without bigtime support and populate it
_scratch_mkfs -m crc=1,bigtime=0 >> $seqres.full
_qmount_option "usrquota"
_scratch_xfs_db -c 'version' -c 'sb 0' -c 'p' >> $seqres.full
_scratch_mount >> $seqres.full
# Force the block counters for uid 1 and 2 above zero
_pwrite_byte 0x61 0 64k $SCRATCH_MNT/a >> $seqres.full
_pwrite_byte 0x61 0 64k $SCRATCH_MNT/b >> $seqres.full
sync
chown 1 $SCRATCH_MNT/a
chown 2 $SCRATCH_MNT/b
# Set quota limits on uid 1 before upgrading
$XFS_QUOTA_PROG -x -c 'limit -u bsoft=12k bhard=1m 1' $SCRATCH_MNT
# Make sure the grace period is at /some/ point in the future. We have to
# use bc because not all bashes can handle integer comparisons with 64-bit
# numbers.
repquota -upn $SCRATCH_MNT > $tmp.repquota
cat $tmp.repquota >> $seqres.full
grace="$(cat $tmp.repquota | grep '^#1' | awk '{print $6}')"
now="$(date +%s)"
res="$(echo "${grace} > ${now}" | $BC_PROG)"
test $res -eq 1 || echo "Expected timer expiry (${grace}) to be after now (${now})."
_scratch_unmount
# Now upgrade to bigtime support
_scratch_xfs_admin -O bigtime=1 2>> $seqres.full
_check_scratch_xfs_features BIGTIME
_check_scratch_fs
_scratch_xfs_db -c 'version' -c 'sb 0' -c 'p' >> $seqres.full
# Mount again, see if our quota timer survived
_scratch_mount
# Set a very generous grace period and quota limits on uid 2 after upgrading
$XFS_QUOTA_PROG -x -c 'timer -u -b -d 2147483647' $SCRATCH_MNT
$XFS_QUOTA_PROG -x -c 'limit -u bsoft=10000 bhard=150000 2' $SCRATCH_MNT
# Query the grace periods to see if they got set properly after the upgrade.
repquota -upn $SCRATCH_MNT > $tmp.repquota
cat $tmp.repquota >> $seqres.full
grace1="$(repquota -upn $SCRATCH_MNT | grep '^#1' | awk '{print $6}')"
grace2="$(repquota -upn $SCRATCH_MNT | grep '^#2' | awk '{print $6}')"
now="$(date +%s)"
# Make sure that uid 1's expiration is in the future...
res1="$(echo "${grace} > ${now}" | $BC_PROG)"
test "${res1}" -eq 1 || echo "Expected uid 1 expiry (${grace1}) to be after now (${now})."
# ...and that uid 2's expiration is after uid 1's...
res2="$(echo "${grace2} > ${grace1}" | $BC_PROG)"
test "${res2}" -eq 1 || echo "Expected uid 2 expiry (${grace2}) to be after uid 1 (${grace1})."
# ...and that uid 2's expiration is after 2038 if right now is far enough
# past 1970 that our generous grace period would provide for that.
res3="$(echo "(${now} < 100) || (${grace2} > 2147483648)" | $BC_PROG)"
test "${res3}" -eq 1 || echo "Expected uid 2 expiry (${grace2}) to be after 2038."
_scratch_cycle_mount
# Query the grace periods to see if they survived a remount.
repquota -upn $SCRATCH_MNT > $tmp.repquota
cat $tmp.repquota >> $seqres.full
grace1="$(repquota -upn $SCRATCH_MNT | grep '^#1' | awk '{print $6}')"
grace2="$(repquota -upn $SCRATCH_MNT | grep '^#2' | awk '{print $6}')"
now="$(date +%s)"
# Make sure that uid 1's expiration is in the future...
res1="$(echo "${grace} > ${now}" | $BC_PROG)"
test "${res1}" -eq 1 || echo "Expected uid 1 expiry (${grace1}) to be after now (${now})."
# ...and that uid 2's expiration is after uid 1's...
res2="$(echo "${grace2} > ${grace1}" | $BC_PROG)"
test "${res2}" -eq 1 || echo "Expected uid 2 expiry (${grace2}) to be after uid 1 (${grace1})."
# ...and that uid 2's expiration is after 2038 if right now is far enough
# past 1970 that our generous grace period would provide for that.
res3="$(echo "(${now} < 100) || (${grace2} > 2147483648)" | $BC_PROG)"
test "${res3}" -eq 1 || echo "Expected uid 2 expiry (${grace2}) to be after 2038."
# Now try setting uid 2's expiration to Feb 22 22:22:22 UTC 2222
new_expiry=$(date -d 'Feb 22 22:22:22 UTC 2222' +%s)
now=$(date +%s)
test $now -ge $new_expiry && \
echo "Now is after February 2222? Expect problems."
expiry_delta=$((new_expiry - now))
echo "setting expiration to $new_expiry - $now = $expiry_delta" >> $seqres.full
$XFS_QUOTA_PROG -x -c "timer -u $expiry_delta 2" -c 'report' $SCRATCH_MNT >> $seqres.full
# Did we get an expiration within 5s of the target range?
grace2="$(repquota -upn $SCRATCH_MNT | grep '^#2' | awk '{print $6}')"
echo "grace2 is $grace2" >> $seqres.full
_within_tolerance "grace2 expiry" $grace2 $new_expiry 5 -v
_scratch_cycle_mount
# ...and is it still within 5s after a remount?
grace2="$(repquota -upn $SCRATCH_MNT | grep '^#2' | awk '{print $6}')"
echo "grace2 is $grace2" >> $seqres.full
_within_tolerance "grace2 expiry after remount" $grace2 $new_expiry 5 -v
# success, all done
status=0
exit
+6
View File
@@ -0,0 +1,6 @@
QA output created by 161
Running xfs_repair to upgrade filesystem.
Adding large timestamp support to filesystem.
FEATURES: BIGTIME:YES
grace2 expiry is in range
grace2 expiry after remount is in range
+2
View File
@@ -157,6 +157,8 @@
157 auto quick admin
158 auto quick inobtcount
159 auto quick bigtime
160 auto quick bigtime
161 auto quick bigtime quota
164 rw pattern auto prealloc quick
165 rw pattern auto prealloc quick
166 rw metadata auto quick