| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2016 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FSQA Test No. 335 |
| # |
| # Test that if we move one file between directories, fsync the parent directory |
| # of the old directory, power fail and remount the filesystem, the file is not |
| # lost and it's located at the destination directory. |
| # |
| 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 directories and the file we will later check if it has |
| # disappeared. |
| mkdir -p $SCRATCH_MNT/a/b |
| mkdir $SCRATCH_MNT/c |
| touch $SCRATCH_MNT/a/b/foo |
| |
| # Make sure everything is durably persisted. |
| sync |
| |
| # Now move our test file into a new parent directory. |
| mv $SCRATCH_MNT/a/b/foo $SCRATCH_MNT/c/ |
| |
| # Create a new file inside the parent directory of the directory where our test |
| # file foo was previously at. This is just to ensure the fsync we do next |
| # against that parent directory actually does something and it's not a noop. |
| touch $SCRATCH_MNT/a/bar |
| $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/a |
| |
| echo "Filesystem content before power failure:" |
| ls -R $SCRATCH_MNT/a $SCRATCH_MNT/c | _filter_scratch |
| |
| # Simulate a power failure / crash and remount the filesystem, so that the |
| # journal/log is replayed. |
| _flakey_drop_and_remount |
| |
| # We expect our file foo to exist, have an entry in the new parent |
| # directory (c/) and not have anymore an entry in the old parent directory |
| # (a/b/). |
| # The new file named bar should also exist. |
| echo "Filesystem content after power failure:" |
| # Must match what we had before the power failure. |
| ls -R $SCRATCH_MNT/a $SCRATCH_MNT/c | _filter_scratch |
| |
| _unmount_flakey |
| |
| status=0 |
| exit |