generic: test for file fsync after moving it to a new parent directory

Test that if we move a file from a directory B to a directory A, replace
directory B with directory A, fsync the file and then power fail, after
mounting the filesystem the file has a single parent, named B and there
is no longer any directory with the name A.

This test is motivated by a bug found in btrfs which is fixed by a patch
for the linux kernel titled:

  "Btrfs: fix wrong dentries after fsync of file that got its parent
   replaced"

This test passes on ext4, xfs and patched btrfs but it hangs on f2fs (the
fsck.f2fs process seems stuck).

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2018-10-09 15:05:35 +01:00
committed by Eryu Guan
parent 2fdaeccead
commit 1b61fc81a5
3 changed files with 79 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. 510
#
# Test that if we move a file from a directory B to a directory A, replace
# directory B with directory A, fsync the file and then power fail, after
# mounting the filesystem the file has a single parent, named B and there
# is no longer any directory with the name A.
#
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 directories and file.
mkdir $SCRATCH_MNT/testdir
mkdir $SCRATCH_MNT/testdir/A
mkdir $SCRATCH_MNT/testdir/B
touch $SCRATCH_MNT/testdir/B/bar
# Make sure everything done so far is durably persisted.
sync
# Now move our file bar from directory B to directory A and then replace
# directory B with directory A, also renaming directory A to B. Finally
# fsync file bar.
mv $SCRATCH_MNT/testdir/B/bar $SCRATCH_MNT/testdir/A/bar
mv -T $SCRATCH_MNT/testdir/A $SCRATCH_MNT/testdir/B
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/testdir/B/bar
# Simulate a power failure and mount the filesystem. We expect file bar
# to exist and have a single parent directory, named B, and that no
# directory named A exists.
_flakey_drop_and_remount
echo "Filesystem content after power failure:"
ls -R $SCRATCH_MNT/testdir | _filter_scratch
_unmount_flakey
status=0
exit
+7
View File
@@ -0,0 +1,7 @@
QA output created by 510
Filesystem content after power failure:
SCRATCH_MNT/testdir:
B
SCRATCH_MNT/testdir/B:
bar
+1
View File
@@ -512,3 +512,4 @@
507 shutdown auto quick metadata
508 shutdown auto quick metadata
509 auto quick log
510 auto quick log