[prev in list] [next in list] [prev in thread] [next in thread]
List: fstests
Subject: Re: [PATCH 2/2] generic/251: check min and max length and minlen for FSTRIM
From: Zorro Lang <zlang () redhat ! com>
Date: 2023-10-27 12:12:13
Message-ID: 20231027121213.jmwsf2aa3kzdkgxy () dell-per750-06-vm-08 ! rhts ! eng ! pek2 ! redhat ! com
[Download RAW message or body]
On Wed, Oct 25, 2023 at 08:21:51PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> Every now and then, this test fails with the following output when
> running against my development tree when configured with an 8k fs block
> size:
>
> --- a/tests/generic/251.out 2023-07-11 12:18:21.624971186 -0700
> +++ b/tests/generic/251.out.bad 2023-10-15 20:54:44.636000000 -0700
> @@ -1,2 +1,4677 @@
> QA output created by 251
> Running the test: done.
> +fstrim: /opt: FITRIM ioctl failed: Invalid argument
> +fstrim: /opt: FITRIM ioctl failed: Invalid argument
> ...
> +fstrim: /opt: FITRIM ioctl failed: Invalid argument
>
> Dumping the exact fstrim command lines to seqres.full produces this at
> the end:
>
> /usr/sbin/fstrim -m 32544k -o 30247k -l 4k /opt
> /usr/sbin/fstrim -m 32544k -o 30251k -l 4k /opt
> ...
> /usr/sbin/fstrim -m 32544k -o 30255k -l 4k /opt
>
> The count of failure messages is the same as the count as the "-l 4k"
> fstrim invocations. Since this is an 8k-block filesystem, the -l
> parameter is clearly incorrect. The test computes random -m and -l
> options.
>
> Therefore, create helper functions to guess at the minimum and maximum
> length and minlen parameters that can be used with the fstrim program.
> In the inner loop of the test, make sure that our choices for -m and -l
> fall within those constraints.
>
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
Good to me, although I need to add some spaces to those lines with "+", to
merge it successfully :)
Reviewed-by: Zorro Lang <zlang@redhat.com>
> tests/generic/251 | 59 ++++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 51 insertions(+), 8 deletions(-)
>
> diff --git a/tests/generic/251 b/tests/generic/251
> index 3b807df5fa..b7a15f9189 100755
> --- a/tests/generic/251
> +++ b/tests/generic/251
> @@ -53,14 +53,46 @@ _fail()
> kill $mypid 2> /dev/null
> }
>
> -_guess_max_minlen()
> +# Set FSTRIM_{MIN,MAX}_MINLEN to the lower and upper bounds of the -m(inlen)
> +# parameter to fstrim on the scratch filesystem.
> +set_minlen_constraints()
> {
> - mmlen=100000
> - while [ $mmlen -gt 1 ]; do
> + local mmlen
> +
> + for ((mmlen = 100000; mmlen > 0; mmlen /= 2)); do
> $FSTRIM_PROG -l $(($mmlen*2))k -m ${mmlen}k $SCRATCH_MNT &> /dev/null && break
> - mmlen=$(($mmlen/2))
> done
> - echo $mmlen
> + test $mmlen -gt 0 || \
> + _notrun "could not determine maximum FSTRIM minlen param"
> + FSTRIM_MAX_MINLEN=$mmlen
> +
> + for ((mmlen = 1; mmlen < FSTRIM_MAX_MINLEN; mmlen *= 2)); do
> + $FSTRIM_PROG -l $(($mmlen*2))k -m ${mmlen}k $SCRATCH_MNT &> /dev/null && break
> + done
> + test $mmlen -le $FSTRIM_MAX_MINLEN || \
> + _notrun "could not determine minimum FSTRIM minlen param"
> + FSTRIM_MIN_MINLEN=$mmlen
> +}
> +
> +# Set FSTRIM_{MIN,MAX}_LEN to the lower and upper bounds of the -l(ength)
> +# parameter to fstrim on the scratch filesystem.
> +set_length_constraints()
> +{
> + local mmlen
> +
> + for ((mmlen = 100000; mmlen > 0; mmlen /= 2)); do
> + $FSTRIM_PROG -l ${mmlen}k $SCRATCH_MNT &> /dev/null && break
> + done
> + test $mmlen -gt 0 || \
> + _notrun "could not determine maximum FSTRIM length param"
> + FSTRIM_MAX_LEN=$mmlen
> +
> + for ((mmlen = 1; mmlen < FSTRIM_MAX_LEN; mmlen *= 2)); do
> + $FSTRIM_PROG -l ${mmlen}k $SCRATCH_MNT &> /dev/null && break
> + done
> + test $mmlen -le $FSTRIM_MAX_LEN || \
> + _notrun "could not determine minimum FSTRIM length param"
> + FSTRIM_MIN_LEN=$mmlen
> }
>
> ##
> @@ -70,13 +102,24 @@ _guess_max_minlen()
> ##
> fstrim_loop()
> {
> + set_minlen_constraints
> + set_length_constraints
> + echo "MINLEN max=$FSTRIM_MAX_MINLEN min=$FSTRIM_MIN_MINLEN" >> $seqres.full
> + echo "LENGTH max=$FSTRIM_MAX_LEN min=$FSTRIM_MIN_LEN" >> $seqres.full
> +
> trap "_destroy_fstrim; exit \$status" 2 15
> fsize=$(_discard_max_offset_kb "$SCRATCH_MNT" "$SCRATCH_DEV")
> - mmlen=$(_guess_max_minlen)
>
> while true ; do
> - step=$((RANDOM*$RANDOM+4))
> - minlen=$(((RANDOM*($RANDOM%2+1))%$mmlen))
> + while true; do
> + step=$((RANDOM*$RANDOM+4))
> + test "$step" -ge "$FSTRIM_MIN_LEN" && break
> + done
> + while true; do
> + minlen=$(( (RANDOM * (RANDOM % 2 + 1)) % FSTRIM_MAX_MINLEN ))
> + test "$minlen" -ge "$FSTRIM_MIN_MINLEN" && break
> + done
> +
> start=$RANDOM
> if [ $((RANDOM%10)) -gt 7 ]; then
> $FSTRIM_PROG $SCRATCH_MNT &
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic