blob: 0e0f3675ea2fa8cd423c79e9a2ca32c321ed7d3b [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2025 Oracle. All Rights Reserved.
#
# FS QA Test No. 768
#
# Validate multi-fsblock atomic write support with or without hw support
#
. ./common/preamble
_begin_fstest auto quick rw atomicwrites
. ./common/atomicwrites
_require_scratch
_require_block_device $SCRATCH_DEV
_require_xfs_io_command "statx" "-r"
_require_atomic_write_test_commands
_require_scratch_write_atomic_multi_fsblock
echo "scratch device atomic write properties" >> $seqres.full
$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $SCRATCH_DEV >> $seqres.full
_scratch_mkfs >> $seqres.full
_scratch_mount
test "$FSTYP" = "xfs" && _xfs_force_bdev data $SCRATCH_MNT
testfile=$SCRATCH_MNT/testfile
touch $testfile
echo "filesystem atomic write properties" >> $seqres.full
$XFS_IO_PROG -c "statx -r -m $STATX_WRITE_ATOMIC" $testfile >> $seqres.full
sector_size=$(blockdev --getss $SCRATCH_DEV)
min_awu=$(_get_atomic_write_unit_min $testfile)
max_awu=$(_get_atomic_write_unit_max $testfile)
$XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile
# try outside the advertised sizes
echo "two EINVAL for unsupported sizes"
min_i=$((min_awu / 2))
_simple_atomic_write $min_i $min_i $testfile -d
max_i=$((max_awu * 2))
_simple_atomic_write $max_i $max_i $testfile -d
# try all of the advertised sizes
for ((i = min_awu; i <= max_awu; i *= 2)); do
$XFS_IO_PROG -f -c "falloc 0 $((max_awu * 2))" -c fsync $testfile
_test_atomic_file_writes $i $testfile
done
# does not support buffered io
echo "one EOPNOTSUPP for buffered atomic"
_simple_atomic_write 0 $min_awu $testfile
# does not support unaligned directio
echo "one EINVAL for unaligned directio"
if [ $sector_size -lt $min_awu ]; then
_simple_atomic_write $sector_size $min_awu $testfile -d
else
# not supported, so fake the output
echo "pwrite: Invalid argument"
fi
# success, all done
echo Silence is golden
status=0
exit