blob: 8e01dff05957ccbc2b1dbe4c321fbe43dcdc45da [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2025 SUSE S.A. All Rights Reserved.
#
# FS QA Test 784
#
# Test moving a directory to another location, create a file in the old location
# of the directory and with the same name, fsync the file, then move the file
# elsewhere and fsync again the file. After a power failure we expect to be able
# to mount the fs and have the same content as before the power failure.
#
. ./common/preamble
_begin_fstest auto quick log
_cleanup()
{
_cleanup_flakey
cd /
rm -r -f $tmp.*
}
. ./common/filter
. ./common/dmflakey
_require_scratch
_require_dm_target flakey
[ "$FSTYP" = "btrfs" ] && _fixed_by_kernel_commit xxxxxxxxxxxx \
"btrfs: don't log conflicting inode if it's a dir moved in the current transaction"
_scratch_mkfs >>$seqres.full 2>&1 || _fail "mkfs failed"
_require_metadata_journaling $SCRATCH_DEV
_init_flakey
_mount_flakey
list_fs_contents()
{
# Remove the 'lost+found' directory which only exists in some
# filesystems like extN and remove empty lines to have a consistent
# output regardless of the existence of the 'lost+found' directory.
ls -1R $SCRATCH_MNT/ | grep -v 'lost+found' | grep -v -e '^$' | \
_filter_scratch
}
mkdir $SCRATCH_MNT/dir1
mkdir $SCRATCH_MNT/dir2
_scratch_sync
mv $SCRATCH_MNT/dir1 $SCRATCH_MNT/dir2
# Create a file with the old name of the first directory and persist it with
# a fsync.
$XFS_IO_PROG -f -c "fsync" $SCRATCH_MNT/dir1
# Move the file to some other location.
mv $SCRATCH_MNT/dir1 $SCRATCH_MNT/dir2/foo
# Fsync again the file.
$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/dir2/foo
echo -e "\nfs contents before power failure:\n"
list_fs_contents
# Simulate a power failure and then mount again the filesystem to replay the
# journal/log. We expect the mount to succeed.
_flakey_drop_and_remount
# We expect the fs contents to be the same as before the power failure.
echo -e "\nfs contents after power failure:\n"
list_fs_contents
_unmount_flakey
# success, all done
_exit 0