generic: fallocate two bytes at block boundary
authorMax Reitz <mreitz@redhat.com>
Fri, 27 Sep 2019 10:38:46 +0000 (12:38 +0200)
committerEryu Guan <guaneryu@gmail.com>
Wed, 2 Oct 2019 08:54:45 +0000 (16:54 +0800)
Allocating two bytes at a block boundary with fallocate should allocate
both blocks involved.  Test this by writing data to both bytes
afterwards and see whether the on-disk size increases (it should not).

This is a regression test for the kernel patch "xfs: Fix tail rounding
in xfs_alloc_file_space()".

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
tests/generic/568 [new file with mode: 0755]
tests/generic/568.out [new file with mode: 0644]
tests/generic/group

diff --git a/tests/generic/568 b/tests/generic/568
new file mode 100755 (executable)
index 0000000..a3c0b4a
--- /dev/null
@@ -0,0 +1,60 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2019 Red Hat, Inc.  All Rights Reserved.
+#
+# FS QA Test No. generic/568
+#
+# Test that fallocating an unaligned range allocates all blocks
+# touched by that range
+#
+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()
+{
+       cd /
+       rm -f "$tmp".*
+       rm -f "$TEST_DIR/falloctest-$seq"
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_xfs_io_command "falloc"
+
+testfile="$TEST_DIR/falloctest-$seq"
+
+# Fallocate 2 bytes across a block boundary
+block_size=$(_get_file_block_size "$TEST_DIR")
+$XFS_IO_PROG -f -c "falloc $((block_size - 1)) 2" "$testfile"
+
+# Both the first blocks should be allocated now.  Check that by
+# inquiring whether the file grows when we write to the two bytes we
+# have just fallocated.
+
+allocated_size_before=$(($(stat -c '%b * %B' "$testfile")))
+
+$XFS_IO_PROG -c "pwrite $((block_size - 1)) 2" "$testfile" \
+       | _filter_xfs_io | sed -e "s/$((block_size - 1))/block_size - 1/"
+
+allocated_size_after=$(($(stat -c '%b * %B' "$testfile")))
+
+if [ $allocated_size_after -gt $allocated_size_before ]; then
+       echo "ERROR: File grew from ${allocated_size_before} B to" \
+            "${allocated_size_after} B when writing to the fallocated range."
+else
+       echo "OK: File did not grow."
+fi
+
+status=0
+exit
diff --git a/tests/generic/568.out b/tests/generic/568.out
new file mode 100644 (file)
index 0000000..435a963
--- /dev/null
@@ -0,0 +1,4 @@
+QA output created by 568
+wrote 2/2 bytes at offset block_size - 1
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+OK: File did not grow.
index 7cf4f6c48b2f465a23aaca1fc3e9af3b081eb608..dd971f0c6c575852c32ceacdfdb44956376b62fb 100644 (file)
 565 auto quick copy_range
 566 auto quick quota metadata
 567 auto quick rw punch
+568 auto quick rw prealloc