diff --git a/tests/generic/588 b/tests/generic/588 new file mode 100755 index 00000000..5217bea5 --- /dev/null +++ b/tests/generic/588 @@ -0,0 +1,77 @@ +#! /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. +# +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/reflink +. ./common/dmflakey + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_require_scratch_reflink +_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 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 diff --git a/tests/generic/588.out b/tests/generic/588.out new file mode 100644 index 00000000..d1b7332a --- /dev/null +++ b/tests/generic/588.out @@ -0,0 +1,13 @@ +QA output created by 588 +wrote 262144/262144 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 262144/262144 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +linked 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File digest before power failure: +b92c7b6e89d6f466cffba1f6e6193e5d +File digest after mount: +b92c7b6e89d6f466cffba1f6e6193e5d diff --git a/tests/generic/group b/tests/generic/group index 0924ce64..87d7441c 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -590,3 +590,4 @@ 585 auto rename 586 auto quick rw prealloc 587 auto quick rw prealloc +588 auto quick log clone