Files
apfstests/tests/generic/502
T
Filipe Manana b19c447027 generic: add test for fsync after renaming hard links of same file
Test that if we have a file with 2 (or more) hard links in the same
parent directory, rename of the hard links, rename one of the other
hard links to the old name of the hard link we renamed before,
create a new file in the same parent directory with the old name of
second hard link we renamed, fsync fsync this new file and power
fail, we will be able to mount again the filesystem and the new file
and all hard links exist.

This test is motivated by a bug found in btrfs, where mounting the
filesystem after the power failure resulted in failure with an errno
value of EEXIST, which is fixed by a patch for the linux kernel
titled:

  "Btrfs: fix mount failure after fsync due to hard link recreation"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
2018-07-22 01:44:30 +08:00

80 lines
2.3 KiB
Bash
Executable File

#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. 502
#
# Test that if we have a file with 2 (or more) hard links in the same parent
# directory, rename of the hard links, rename one of the other hard links to
# the old name of the hard link we renamed before, create a new file in the
# same parent directory with the old name of second hard link we renamed, fsync
# fsync this new file and power fail, we will be able to mount again the
# filesystem and the new file and all hard links exist.
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
_cleanup_flakey
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/dmflakey
# real QA test starts here
_supported_fs generic
_supported_os Linux
_require_scratch
_require_dm_target flakey
rm -f $seqres.full
_scratch_mkfs >>$seqres.full 2>&1
_require_metadata_journaling $SCRATCH_DEV
_init_flakey
_mount_flakey
# Create our test file with 2 hard links in the same parent directory.
mkdir $SCRATCH_MNT/testdir
touch $SCRATCH_MNT/testdir/foo
ln $SCRATCH_MNT/testdir/foo $SCRATCH_MNT/testdir/bar
# Make sure everything done so far is durably persisted.
sync
# Now rename the first hard link (foo) to a new name and rename the second hard
# link (bar) to the old name of the first hard link (foo).
mv $SCRATCH_MNT/testdir/foo $SCRATCH_MNT/testdir/qwerty
mv $SCRATCH_MNT/testdir/bar $SCRATCH_MNT/testdir/foo
# Create a new file, in the same parent directory, with the old name of the
# second hard link (bar) and fsync this new file.
touch $SCRATCH_MNT/testdir/bar
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/testdir/bar
echo "Contents of test directory before the power failure:"
ls -R $SCRATCH_MNT/testdir | _filter_scratch
# Simulate a power failure and mount the filesystem to check that we are able to
# mount it and we have the same files, with the same hard links, that we had
# before the power failure and in the same order.
_flakey_drop_and_remount
echo "Contents of test directory after the power failure:"
ls -R $SCRATCH_MNT/testdir | _filter_scratch
_unmount_flakey
_cleanup_flakey
status=0
exit