generic: test fsync after fallocate on a very small file

Test that if we have a very small file, with a size smaller than the
block size, then fallocate a very small range within the block size
but past the file's current size, fsync the file and then power
fail, after mounting the filesystem all the file data is there and
the file size is correct.

This test is motivated by a failure in btrfs where it triggered an
assertion when using the no-holes feature, that is, when running
with MKFS_OPTIONS="-O no-holes". The btrfs issue is fixed by a patch
for the linux kernel titled:

 "Btrfs: fix assertion on fsync of regular file when using no-holes
  feature"

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Filipe Manana
2018-10-15 09:51:17 +01:00
committed by Eryu Guan
parent b0c8d2f735
commit 2b621418f4
3 changed files with 71 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018 SUSE Linux Products GmbH. All Rights Reserved.
#
# FS QA Test No. 512
#
# Test that if we have a very small file, with a size smaller than the block
# size, then fallocate a very small range within the block size but past the
# file's current size, fsync the file and then power fail, after mounting the
# filesystem all the file data is there and the file size is correct.
#
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
_supported_os Linux
_require_scratch
_require_xfs_io_command "falloc"
_require_dm_target flakey
rm -f $seqres.full
_scratch_mkfs >>$seqres.full 2>&1
_require_metadata_journaling $SCRATCH_DEV
_init_flakey
_mount_flakey
$XFS_IO_PROG -f \
-c "pwrite -S 0xb6 0 21" \
-c "falloc 40 40" \
-c "fsync" \
$SCRATCH_MNT/foobar | _filter_xfs_io
# Simulate a power failure and mount the filesystem. We expect no data loss
# and a correct file size.
_flakey_drop_and_remount
echo "File content after power failure:"
od -t x1 -A d $SCRATCH_MNT/foobar
_unmount_flakey
status=0
exit
+9
View File
@@ -0,0 +1,9 @@
QA output created by 512
wrote 21/21 bytes at offset 0
XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
File content after power failure:
0000000 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6 b6
0000016 b6 b6 b6 b6 b6 00 00 00 00 00 00 00 00 00 00 00
0000032 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0000080
+1
View File
@@ -514,3 +514,4 @@
509 auto quick log
510 auto quick log
511 auto quick rw zero
512 auto quick log prealloc