On Wed, Jun 11, 2025 at 07:42:25AM -0700, Darrick J. Wong wrote: > On Wed, Jun 11, 2025 at 03:04:47PM +0530, Ojaswin Mujoo wrote: > > From: "Ritesh Harjani (IBM)" <ritesh.list@xxxxxxxxx> > > > > This adds atomic write test using fio based on it's crc check verifier. > > fio adds a crc for each data block. If the underlying device supports atomic > > write then it is guaranteed that we will never have a mix data from two > > threads writing on the same physical block. > > > > Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx> > > Signed-off-by: Ojaswin Mujoo <ojaswin@xxxxxxxxxxxxx> > > --- > > tests/generic/767 | 84 +++++++++++++++++++++++++++++++++++++++++++ > > tests/generic/767.out | 2 ++ > > 2 files changed, 86 insertions(+) > > create mode 100755 tests/generic/767 > > create mode 100644 tests/generic/767.out > > > > diff --git a/tests/generic/767 b/tests/generic/767 > > new file mode 100755 > > index 00000000..4f80e7b6 > > --- /dev/null > > +++ b/tests/generic/767 > > @@ -0,0 +1,84 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0 > > +# Copyright (c) 2025 IBM Corporation. All Rights Reserved. > > +# > > +# FS QA Test 767 > > +# > > +# Validate FS atomic write using fio crc check verifier. > > +# > > +. ./common/preamble > > +. ./common/atomicwrites > > + > > +_begin_fstest auto aio rw atomicwrites > > + > > +_require_scratch_write_atomic > > +_require_odirect > > +_require_aio > > + > > +function max() > > +{ > > + if (( $1 > $2 )); then > > + echo "$1" > > + else > > + echo "$2" > > + fi > > +} > > + > > +function min() > > +{ > > + if (( $1 > $2 )); then > > + echo "$2" > > + else > > + echo "$1" > > + fi > > +} > > Should these be common/rc helpers? > > Or, since bash is ... uh fun with arguments... > > _min() { > local ret > > for arg in "$@"; do > if [ -z "$ret" ] || (( $arg < $ret )); then > ret="$arg" > fi > done > echo $ret > } > > and then you can pass as many arguments as you like. The only downside > is that you can pass stringly typed crap "_min cow frog" and it still > returns "cow". As if. Yes this makes sense (sans the cow vs frog part :p) . I'll make the change in v2. > > > +_scratch_mkfs >> $seqres.full 2>&1 > > +_scratch_mount > > + > > +touch "$SCRATCH_MNT/f1" > > +awu_min_write=$(_get_atomic_write_unit_min "$SCRATCH_MNT/f1") > > +awu_max_write=$(_get_atomic_write_unit_max "$SCRATCH_MNT/f1") > > +blocksize=$(max "$awu_min_write" "$((awu_max_write/2))") > > + > > +# XFS can have high awu_max_write due to software fallback. Cap it at 64k > > +blocksize=$(min "$blocksize" "65536") > > + > > +fio_config=$tmp.fio > > +fio_out=$tmp.fio.out > > + > > +FIO_LOAD=$(($(nproc) * 2 * LOAD_FACTOR)) > > What program is nproc? It returns the number of CPUs so we can scale the load based on CPUs we have. It comes from coreutils so I think the distros should have it. Thanks, ojaswin > > --D > > > +SIZE=$((100 * 1024 * 1024)) > > + > > +cat >$fio_config <<EOF > > +[aio-dio-aw-verify] > > +direct=1 > > +ioengine=libaio > > +rw=randwrite > > +bs=$blocksize > > +fallocate=native > > +filename=$SCRATCH_MNT/test-file > > +size=$SIZE > > +iodepth=$FIO_LOAD > > +numjobs=$FIO_LOAD > > +group_reporting=1 > > +verify_state_save=0 > > +verify=crc32c > > +verify_fatal=1 > > +verify_dump=0 > > +verify_backlog=1024 > > +verify_async=4 > > +verify_write_sequence=0 > > +atomic=1 > > +EOF > > + > > +_require_fio $fio_config > > + > > +cat $fio_config >> $seqres.full > > +$FIO_PROG $fio_config --output=$fio_out > > +cat $fio_out >> $seqres.full > > + > > +# success, all done > > +echo Silence is golden > > +status=0 > > +exit > > diff --git a/tests/generic/767.out b/tests/generic/767.out > > new file mode 100644 > > index 00000000..2bf7f989 > > --- /dev/null > > +++ b/tests/generic/767.out > > @@ -0,0 +1,2 @@ > > +QA output created by 767 > > +Silence is golden > > -- > > 2.49.0 > > > >