From: "Darrick J. Wong" <djwong@kernel.org>
To: zlang@redhat.com
Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, guan@eryu.me
Subject: [PATCH] generic/251: check min and max length and minlen for FSTRIM
Date: Thu, 19 Oct 2023 07:36:27 -0700 [thread overview]
Message-ID: <20231019143627.GD11391@frogsfrogsfrogs> (raw)
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>
---
tests/generic/251 | 59 ++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 8 deletions(-)
diff --git a/tests/generic/251 b/tests/generic/251
index 8ee74980cc..40cfd7c381 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 &
next reply other threads:[~2023-10-19 14:36 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-19 14:36 Darrick J. Wong [this message]
2023-10-21 13:14 ` [PATCH] generic/251: check min and max length and minlen for FSTRIM Zorro Lang
2023-10-21 23:00 ` Darrick J. Wong
2023-10-22 6:18 ` Zorro Lang
2023-10-23 4:46 ` Darrick J. Wong
2023-10-23 13:16 ` Zorro Lang
2023-10-23 17:49 ` Darrick J. Wong
2023-10-24 5:59 ` Zorro Lang
2023-10-24 15:28 ` Darrick J. Wong
2023-10-25 5:16 ` Zorro Lang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231019143627.GD11391@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=guan@eryu.me \
--cc=linux-xfs@vger.kernel.org \
--cc=zlang@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox