mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
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:
Executable
+71
@@ -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
|
||||
@@ -0,0 +1,7 @@
|
||||
QA output created by 510
|
||||
Filesystem content after power failure:
|
||||
SCRATCH_MNT/testdir:
|
||||
B
|
||||
|
||||
SCRATCH_MNT/testdir/B:
|
||||
bar
|
||||
@@ -512,3 +512,4 @@
|
||||
507 shutdown auto quick metadata
|
||||
508 shutdown auto quick metadata
|
||||
509 auto quick log
|
||||
510 auto quick log
|
||||
|
||||
Reference in New Issue
Block a user