#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2025 IBM Corporation. All Rights Reserved.
#
# FS QA Test No. 776
#
# fuzz fsx with atomic writes
#
. ./common/preamble
. ./common/atomicwrites
_begin_fstest rw auto quick atomicwrites

_require_odirect
_require_scratch_write_atomic

_scratch_mkfs >> $seqres.full 2>&1
_scratch_mount  >> $seqres.full 2>&1

testfile=$SCRATCH_MNT/testfile
touch $testfile

awu_max=$(_get_atomic_write_unit_max $testfile)
blksz=$(_get_block_size $SCRATCH_MNT)
bsize=`$here/src/min_dio_alignment $SCRATCH_MNT $SCRATCH_DEV`

set_fsx_avoid() {
	local file=$1

	case "$FSTYP" in
	"ext4")
		local dev=$(findmnt -n -o SOURCE --target $testfile)

		# fsx insert/collapse range support for ext4+bigalloc is
		# currently broken, so disable it. Also disable in case we
		# can't detect bigalloc to be on safer side.
		if [ -z "$DUMPE2FS_PROG" ]; then
			echo "dumpe2fs not found, disabling insert/collapse range" >> $seqres.full
			FSX_AVOID+=" -I -C"
			return
		fi

		$DUMPE2FS_PROG -h $dev 2>&1 | grep -q bigalloc && {
			echo "fsx insert/collapse range not supported with bigalloc. Disabling.." >> $seqres.full
			FSX_AVOID+=" -I -C"
		}
		;;
	*)
		;;
	esac
}

# fsx usage:
#
# -N numops: total # operations to do
# -l flen: the upper bound on file size
# -o oplen: the upper bound on operation size (64k default)
# -Z: O_DIRECT ()

set_fsx_avoid
_run_fsx_on_file $testfile -N 10000 -o $awu_max -A -l 500000 -r $bsize -w $bsize -Z $FSX_AVOID  >> $seqres.full
if [[ "$?" != "0" ]]
then
	_fail "fsx returned error: $?"
fi

echo "Silence is golden"
status=0
exit
