Files
apfstests/tests/generic/507
T
Chao Yu 1c29d399b6 generic: test i_flags recovery after power failure
After fsync, filesystem should guarantee inode metadata including
i_flags being persisted, so even after sudden power-cut, during
mount, we should recover i_flags fields correctly, in order to not
loss those meta info.

So adding this testcase to check whether generic filesystem can
guarantee that.

We only check below attribute modification which most filesystem
supports:
- no atime updates (A)
- secure deletion (s)
- synchronous updates (S)
- undeletable (u)

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2018-10-14 21:35:02 +08:00

134 lines
2.5 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2018 Huawei. All Rights Reserved.
#
# FS QA Test 507
#
# This testcase is trying to test recovery flow of generic filesystem, w/ below
# steps, once i_flags changes, after we fsync that file, we can expect that
# i_flags can be recovered after sudden power-cuts.
# 1. touch testfile;
# 1.1 sync (optional)
# 2. chattr +[AsSu] testfile
# 3. xfs_io -f testfile -c "fsync";
# 4. godown;
# 5. umount;
# 6. mount;
# 7. check i_flags
# 8. chattr -[AsSu] testfile
# 9. xfs_io -f testfile -c "fsync";
# 10. godown;
# 11. umount;
# 12. mount;
# 13. check i_flags
#
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
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
_supported_fs generic
_supported_os Linux
_require_command "$LSATTR_PROG" lasttr
_require_command "$CHATTR_PROG" chattr
_require_chattr AsSu
_require_scratch
_require_scratch_shutdown
_scratch_mkfs >/dev/null 2>&1
_require_metadata_journaling $SCRATCH_DEV
testfile=$SCRATCH_MNT/testfile
do_check()
{
attr=$1
_scratch_mount
touch $testfile
if [ "$2" == "sync" ]; then
echo "sync" >> $seqres.full
sync
fi
echo "Test chattr +$1" >> $seqres.full
# add attribute
$CHATTR_PROG +$attr $testfile
before=`$LSATTR_PROG $testfile`
$XFS_IO_PROG -f $testfile -c "fsync" | _filter_xfs_io
_scratch_shutdown | tee -a $seqres.full
_scratch_cycle_mount
after=`$LSATTR_PROG $testfile`
# check inode's i_flags
if [ "$before" != "$after" ]; then
echo "Before: $before"
echo "After : $after"
fi
echo "Before: $before" >> $seqres.full
echo "After : $after" >> $seqres.full
echo "Test chattr -$1" >> $seqres.full
# delete attribute
$CHATTR_PROG -$attr $testfile
before=`$LSATTR_PROG $testfile`
$XFS_IO_PROG -f $testfile -c "fsync" | _filter_xfs_io
_scratch_shutdown | tee -a $seqres.full
_scratch_cycle_mount
after=`$LSATTR_PROG $testfile`
# check inode's i_flags
if [ "$before" != "$after" ]; then
echo "Before: $before"
echo "After : $after"
fi
echo "Before: $before" >> $seqres.full
echo "After : $after" >> $seqres.full
rm -f $testfile
_scratch_unmount
}
echo "Silence is golden"
opts="A s S u"
for i in $opts; do
do_check $i
do_check $i sync
done
status=0
exit