#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016 Fujitsu.  All Rights Reserved.
#
# FS QA Test 371
#
# Run write(2) and fallocate(2) in parallel and the total needed data space
# for these operations don't exceed whole fs free data space, to see whether
# we will get any unexpected ENOSPC error.
#
. ./common/preamble
_begin_fstest auto quick enospc prealloc

# Import common functions.
. ./common/filter

# Modify as appropriate.
_require_scratch
_require_xfs_io_command "falloc"
test "$FSTYP" = "xfs" && _require_xfs_io_command "extsize"

_scratch_mkfs_sized $((256 * 1024 * 1024)) >> $seqres.full 2>&1
_scratch_mount

# Disable speculative post-EOF preallocation on XFS, which can grow fast enough
# that a racing fallocate then fails.
if [ "$FSTYP" = "xfs" ]; then
	alloc_sz="$(_get_file_block_size $SCRATCH_MNT)"
	$XFS_IO_PROG -c "extsize $alloc_sz" $SCRATCH_MNT >> $seqres.full
fi

testfile1=$SCRATCH_MNT/testfile1
testfile2=$SCRATCH_MNT/testfile2

echo "Silence is golden"
for ((i=0; i<100; i++)); do
	$XFS_IO_PROG -fc "pwrite 0 80M" $testfile1 >/dev/null
	rm -f $testfile1
done &
pids=$!

for ((i=0; i<100; i++)); do
	$XFS_IO_PROG -fc "falloc 0 80M" $testfile2 >/dev/null
	rm -f $testfile2
done &
pids="$pids $!"

wait $pids
status=0
exit
