mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
68d3b93bf6
Many tests use dm_flakey to trigger log replay, but for filesystems that don't support metadata journaling, this causes failures when it shouldn't. (i.e. we can hardly test log replay if there is no log, and the subsequent filesystem check will turn up errors). For some tests they actually sync everything we care about, and find inconsistencies elsewhere, but I erred on the side of simply not running the test in most cases. Tested-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Eric Sandeen <sandeen@redhat.com> Reviewed-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
140 lines
3.7 KiB
Bash
Executable File
140 lines
3.7 KiB
Bash
Executable File
#! /bin/bash
|
|
# FS QA Test No. 321
|
|
#
|
|
# Runs various dir fsync tests to cover fsync'ing directory corner cases.
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
# Copyright (c) 2013 Fusion IO. All Rights Reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
status=1 # failure is the default!
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_flakey
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/dmflakey
|
|
|
|
# real QA test starts here
|
|
_supported_fs generic
|
|
_supported_os Linux
|
|
_need_to_be_root
|
|
_require_scratch_nocheck
|
|
_require_dm_flakey
|
|
_require_metadata_journaling $SCRATCH_DEV
|
|
|
|
rm -f $seqres.full
|
|
|
|
_clean_working_dir()
|
|
{
|
|
_mount_flakey
|
|
rm -rf $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
|
_unmount_flakey
|
|
}
|
|
|
|
# Btrfs wasn't making sure the directory survived fsync
|
|
_directory_test()
|
|
{
|
|
echo "fsync new directory"
|
|
_mount_flakey
|
|
mkdir $SCRATCH_MNT/bar
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar
|
|
_load_flakey_table $FLAKEY_DROP_WRITES
|
|
_unmount_flakey
|
|
|
|
_load_flakey_table $FLAKEY_ALLOW_WRITES
|
|
_mount_flakey
|
|
_ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }'
|
|
_unmount_flakey
|
|
_check_scratch_fs $FLAKEY_DEV
|
|
[ $? -ne 0 ] && _fatal "fsck failed"
|
|
}
|
|
|
|
# Btrfs was losing a rename into a new directory
|
|
_rename_test()
|
|
{
|
|
echo "rename fsync test"
|
|
_mount_flakey
|
|
touch $SCRATCH_MNT/foo
|
|
mkdir $SCRATCH_MNT/bar
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foo
|
|
mv $SCRATCH_MNT/foo $SCRATCH_MNT/bar/foo
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar/foo
|
|
_load_flakey_table $FLAKEY_DROP_WRITES
|
|
_unmount_flakey
|
|
|
|
_load_flakey_table $FLAKEY_ALLOW_WRITES
|
|
_mount_flakey
|
|
_ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }'
|
|
_ls_l $SCRATCH_MNT/bar | tail -n +2 | awk '{ print $1, $9 }'
|
|
_unmount_flakey
|
|
_check_scratch_fs $FLAKEY_DEV
|
|
[ $? -ne 0 ] && _fatal "fsck failed"
|
|
}
|
|
|
|
# Btrfs was failing to replay a log when we had a inode with a smaller inode
|
|
# number that is renamed into a directory with a higher inode number
|
|
_replay_rename_test()
|
|
{
|
|
echo "replay rename fsync test"
|
|
_mount_flakey
|
|
touch $SCRATCH_MNT/foo
|
|
mkdir $SCRATCH_MNT/bar
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foo
|
|
mv $SCRATCH_MNT/foo $SCRATCH_MNT/bar/foo
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar
|
|
|
|
# This is to force btrfs to relog the entire inode including the ref so
|
|
# we are sure to try and replay the ref along with the dir_index item
|
|
setfattr -n user.foo -v blah $SCRATCH_MNT/bar/foo >> $seqres.full 2>&1
|
|
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar/foo
|
|
_load_flakey_table $FLAKEY_DROP_WRITES
|
|
_unmount_flakey
|
|
|
|
_load_flakey_table $FLAKEY_ALLOW_WRITES
|
|
_mount_flakey
|
|
_ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }'
|
|
_ls_l $SCRATCH_MNT/bar | tail -n +2 | awk '{ print $1, $9 }'
|
|
_unmount_flakey
|
|
}
|
|
|
|
_scratch_mkfs >> $seqres.full 2>&1
|
|
|
|
# Create a basic flakey device that will never error out
|
|
_init_flakey
|
|
|
|
_directory_test
|
|
_clean_working_dir
|
|
_rename_test
|
|
_clean_working_dir
|
|
_replay_rename_test
|
|
|
|
status=0
|
|
exit
|