| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2016 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FSQA Test No. 336 |
| # |
| # Test that if we have a file F1 with two links, one in a directory A and the |
| # other in directory B, if we remove the link in directory B, move some other |
| # file F2 from directory B into directory C, fsync inode F1, power fail and |
| # remount the filesystem, file F2 exists and is located only in directory C. |
| # |
| . ./common/preamble |
| _begin_fstest auto quick metadata log |
| |
| # Override the default cleanup function. |
| _cleanup() |
| { |
| _cleanup_flakey |
| cd / |
| rm -f $tmp.* |
| } |
| |
| # Import common functions. |
| . ./common/filter |
| . ./common/dmflakey |
| |
| # real QA test starts here |
| _supported_fs generic |
| _require_scratch |
| _require_hardlinks |
| _require_dm_target flakey |
| |
| _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 (file bar). |
| mkdir $SCRATCH_MNT/a |
| mkdir $SCRATCH_MNT/b |
| mkdir $SCRATCH_MNT/c |
| touch $SCRATCH_MNT/a/foo |
| ln $SCRATCH_MNT/a/foo $SCRATCH_MNT/b/foo_link |
| touch $SCRATCH_MNT/b/bar |
| |
| # Make sure everything is durably persisted. |
| sync |
| |
| # Now delete one of the hard links of file foo and move file bar into c/ |
| unlink $SCRATCH_MNT/b/foo_link |
| mv $SCRATCH_MNT/b/bar $SCRATCH_MNT/c/ |
| |
| # Now fsync file foo. |
| $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/a/foo |
| |
| echo "Filesystem content before power failure:" |
| ls -R $SCRATCH_MNT/a $SCRATCH_MNT/b $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 that after the journal/log was replayed, we no longer have the link |
| # foo_link and file bar was moved from directory b/ to directory c/. |
| echo "Filesystem content after power failure:" |
| # Must match what we had before the power failure. |
| ls -R $SCRATCH_MNT/a $SCRATCH_MNT/b $SCRATCH_MNT/c | _filter_scratch |
| |
| _unmount_flakey |
| |
| status=0 |
| exit |