#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved. # # FSQA Test No. 588 # # Test that if we clone part of an extent from a file to itself at different # offset, fsync it, rewrite (COW) part of the extent from the former offset, # fsync it again, power fail and then mount the filesystem, we are able to # read the whole file and it has the correct data. # . ./common/preamble _begin_fstest auto quick log clone # Override the default cleanup function. _cleanup() { _cleanup_flakey cd / rm -f $tmp.* } # Import common functions. . ./common/filter . ./common/reflink . ./common/dmflakey # real QA test starts here _supported_fs generic _require_scratch_reflink _require_dm_target flakey _scratch_mkfs >>$seqres.full 2>&1 _require_metadata_journaling $SCRATCH_DEV _init_flakey _mount_flakey _require_congruent_file_oplen $SCRATCH_MNT 65536 # Create our test file with two 256Kb extents, one at file offset 0 and the # other at file offset 256Kb. $XFS_IO_PROG -f -c "pwrite -S 0xa3 0 256K" \ -c "fsync" \ -c "pwrite -S 0xc7 256K 256K" \ $SCRATCH_MNT/foobar | _filter_xfs_io # Now clone the second 64Kb of data from the second extent into file offset 0. # After this we get that extent partially shared. Also fsync the file. $XFS_IO_PROG -c "reflink $SCRATCH_MNT/foobar 320K 0K 64K" \ -c "fsync" \ $SCRATCH_MNT/foobar | _filter_xfs_io # Now COW the first 64Kb of data for that second extent. After this we no longer # have the extent fully referenced - its second 64Kb of data are referenced at # file offset 0 and its last 192Kb of data are referenced at file offset 320Kb. # Fsync the file to make sure everything is durably persisted. $XFS_IO_PROG -c "pwrite -S 0xe5 256K 64K" \ -c "fsync" \ $SCRATCH_MNT/foobar | _filter_xfs_io echo "File digest before power failure:" _md5_checksum $SCRATCH_MNT/foobar # Simulate a power failure and then check no data loss or corruption happened. _flakey_drop_and_remount echo "File digest after mount:" _md5_checksum $SCRATCH_MNT/foobar _unmount_flakey status=0 exit