#! /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 _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