From: Filipe Manana Date: Wed, 19 Jun 2019 12:06:08 +0000 (+0100) Subject: generic: test dir fsync after deleting dentry post eviction of its inode X-Git-Tag: v2022.05.01~1114 X-Git-Url: http://git.apps.os.sepia.ceph.com/?p=xfstests-dev.git;a=commitdiff_plain;h=c132cd4de91b634c67158f5295a940a9a0f8f8bd;hp=03a2da5879c08619304f396c9cf4b84ee9e416ff generic: test dir fsync after deleting dentry post eviction of its inode Test that if we fsync a file, evict its inode, unlink it and then fsync its parent directory, after a power failure the file does not exists. This is motivated by a bug found in btrfs, which is fixed by the following patch for the linux kernel: "Btrfs: fix fsync not persisting dentry deletions due to inode evictions" Signed-off-by: Filipe Manana Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- diff --git a/tests/generic/557 b/tests/generic/557 new file mode 100755 index 00000000..64a4dbf7 --- /dev/null +++ b/tests/generic/557 @@ -0,0 +1,79 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved. +# +# FSQA Test No. 557 +# +# Test that if we fsync a file, evict its inode, unlink it and then fsync its +# parent directory, after a power failure the file does not exists. +# +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 directory with one file in it and fsync the file. +mkdir $SCRATCH_MNT/dir +touch $SCRATCH_MNT/dir/foo +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/dir/foo + +# Keep an open file descriptor on our directory while we evict inodes. We just +# want to evict the file's inode, the directory's inode must not be evicted. +( + cd $SCRATCH_MNT/dir + while true; do + : + done +) & +pid=$! +# Wait a bit to give time to background process to chdir to our test directory. +sleep 0.1 + +# Trigger eviction of the file's inode. +echo 2 > /proc/sys/vm/drop_caches + +# Unlink our file and fsync the parent directory. After a power failure we don't +# expect to see the file anymore, since we fsync'ed the parent directory. +unlink $SCRATCH_MNT/dir/foo +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/dir + +# Kill the background process using our test directory. +kill $pid +wait $pid + +# Simulate a power failure and then check file foo does not exists anymore. +_flakey_drop_and_remount + +[ -f $SCRATCH_MNT/dir/foo ] && echo "File foo still exists" + +_unmount_flakey +echo "Silence is golden" +status=0 +exit diff --git a/tests/generic/557.out b/tests/generic/557.out new file mode 100644 index 00000000..1f1ae1d4 --- /dev/null +++ b/tests/generic/557.out @@ -0,0 +1,2 @@ +QA output created by 557 +Silence is golden diff --git a/tests/generic/group b/tests/generic/group index 0867e455..543c0627 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -559,3 +559,4 @@ 554 auto quick copy_range swap 555 auto quick cap 556 auto quick casefold +557 auto quick log