mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
f02fe94911
Test that if we rename a file, create a new file that has the old name of the other file and is a child of the same parent directory, fsync the new inode, power fail and mount the filesystem, we do not lose the first file and that file has the name it was renamed to. This test is motivated by an issue found in btrfs which is fixed by the following patch for the linux kernel: "Btrfs: fix file loss caused by fsync after rename and new inode" Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
91 lines
2.7 KiB
Bash
91 lines
2.7 KiB
Bash
#! /bin/bash
|
|
# FSQA Test No. 342
|
|
#
|
|
# Test that if we rename a file, create a new file that has the old name of the
|
|
# other file and is a child of the same parent directory, fsync the new inode,
|
|
# power fail and mount the filesystem, we do not lose the first file and that
|
|
# file has the name it was renamed to.
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
# Copyright (C) 2016 SUSE Linux Products GmbH. All Rights Reserved.
|
|
# Author: Filipe Manana <fdmanana@suse.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
|
|
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
|
|
_require_metadata_journaling $SCRATCH_DEV
|
|
|
|
rm -f $seqres.full
|
|
|
|
_scratch_mkfs >>$seqres.full 2>&1
|
|
_init_flakey
|
|
_mount_flakey
|
|
|
|
mkdir $SCRATCH_MNT/a
|
|
$XFS_IO_PROG -f -c "pwrite -S 0xf1 0 16K" $SCRATCH_MNT/a/foo | _filter_xfs_io
|
|
# Make sure everything done so far is durably persisted.
|
|
sync
|
|
|
|
# Now rename file foo to bar and create a new file named foo under the same
|
|
# directory. After a power failure we must see the two files.
|
|
mv $SCRATCH_MNT/a/foo $SCRATCH_MNT/a/bar
|
|
$XFS_IO_PROG -f -c "pwrite -S 0xba 0 16K" $SCRATCH_MNT/a/foo | _filter_xfs_io
|
|
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/a/foo
|
|
|
|
echo "File digests before log replay:"
|
|
md5sum $SCRATCH_MNT/a/foo | _filter_scratch
|
|
md5sum $SCRATCH_MNT/a/bar | _filter_scratch
|
|
|
|
# Simulate a power failure and mount again the filesystem to trigger replay of
|
|
# its journal/log.
|
|
_flakey_drop_and_remount
|
|
|
|
echo "Directory a/ contents after log replay:"
|
|
ls -R $SCRATCH_MNT/a | _filter_scratch
|
|
|
|
echo "File digests after log replay:"
|
|
# Must match what we got before the power failure.
|
|
md5sum $SCRATCH_MNT/a/foo | _filter_scratch
|
|
md5sum $SCRATCH_MNT/a/bar | _filter_scratch
|
|
|
|
_unmount_flakey
|
|
status=0
|
|
exit
|