generic: do operations which doesn't take data space on full fs

This test will test if we can still do the following operations when a
full is full:
- buffered write into unpopulated preallocated extent
- clone the untouched preallocated extent
- fsync
- no data loss if power loss happens after above fsync
Above operations should not fail, as they takes no extra data space.

Xfs passes the test, while btrfs fails at fsync and has data loss.
The fix for btrfs is:
"btrfs: Flush before reflinking any extent to prevent NOCOW write falling
 back to CoW without data reservation"

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Qu Wenruo
2019-05-08 22:04:05 +08:00
committed by Eryu Guan
parent 80bac2129b
commit 2bb2dd24cc
3 changed files with 88 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test 546
#
# Test when a fs is full we can still:
# - Do buffered write into a unpopulated preallocated extent
# - Clone the untouched part of that preallocated extent
# - Fsync
# - No data loss even power loss happens after fsync
# All operations above should not fail.
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
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
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
# Modify as appropriate.
_supported_fs generic
_supported_os Linux
_require_xfs_io_command "falloc"
_require_scratch_reflink
_require_dm_target flakey
_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full 2>&1
_require_metadata_journaling $SCRATCH_DEV
_init_flakey
_mount_flakey
# Create preallocated extent where we can write into
$XFS_IO_PROG -f -c 'falloc 8k 64m' "$SCRATCH_MNT/foobar" >> $seqres.full
# Use up all data space, to test later write-into-preallocate behavior
_pwrite_byte 0x00 0 512m "$SCRATCH_MNT/padding" >> $seqres.full 2>&1
# Sync to ensure that padding file reach disk so that at log recovery we
# still have no data space
sync
# This should not fail
_pwrite_byte 0xcd 1m 16m "$SCRATCH_MNT/foobar" >> $seqres.full
# Do reflink here, we shouldn't use extra data space, thus it should not fail
$XFS_IO_PROG -c "reflink ${SCRATCH_MNT}/foobar 8k 0 4k" "$SCRATCH_MNT/foobar" \
>> $seqres.full
# Checksum before power loss
echo md5 before $(_md5_checksum "$SCRATCH_MNT/foobar")
# Fsync to check if writeback is ok
$XFS_IO_PROG -c 'fsync' "$SCRATCH_MNT/foobar"
# Now emulate power loss
_flakey_drop_and_remount
# Checksum after power loss
echo md5 after $(_md5_checksum "$SCRATCH_MNT/foobar")
# success, all done
status=0
exit
+3
View File
@@ -0,0 +1,3 @@
QA output created by 546
md5 before cdccc121ae95c72fdbe53d8e343ef5ee
md5 after cdccc121ae95c72fdbe53d8e343ef5ee
+1
View File
@@ -548,3 +548,4 @@
543 auto quick clone
544 auto quick clone
545 auto quick cap
546 auto quick clone enospc log