]> www.infradead.org Git - users/hch/xfstests-dev.git/commitdiff
btrfs/271: adjust failure condition
authorJosef Bacik <josef@toxicpanda.com>
Tue, 5 Mar 2024 18:52:17 +0000 (19:52 +0100)
committerZorro Lang <zlang@kernel.org>
Mon, 11 Mar 2024 04:50:09 +0000 (12:50 +0800)
btrfs/271 was failing with the subpage blocksize VM's.  This is because
there's an assumption made that the device error counters are
per-sector, but they're per-io.  With a 16kib pagesize and a 4k
sectorsize/nodesize the threshold was expecting 16 failed IO's, but
instead we were getting 5.

This other gotcha here is that with the tree log we will write the log
tree first, and then update the log root tree with the location of the
log tree root node.  With pagesize == nodesize this is fine, we will
only write the log tree root node.  However with subpage blocksize both
of these nodes could be on the same page, and thus they are both written
out during that initial write.  When we update the pointer for the log
root tree we will COW the log root tree root node and submit another IO,
resulting in 3 metadata IO's instead of 2.

Fix the failure case to be < 4 blocks, which is the minimum number of
IO's we should be seeing.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
tests/btrfs/271

index 273799f17924c0d1674a0f5fc4c9b96168345d10..a342af3aed44cf0ff1dc065e55fcbe76f84540f8 100755 (executable)
@@ -25,10 +25,6 @@ _scratch_mount
 
 dev2=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}'`
 
-pagesize=$(_get_page_size)
-blocksize=$(_get_block_size $SCRATCH_MNT)
-sectors_per_page=$(($pagesize / $blocksize))
-
 _allow_fail_make_request
 
 echo "Step 1: writing with one failing mirror:"
@@ -36,9 +32,14 @@ _bdev_fail_make_request $SCRATCH_DEV 1
 $XFS_IO_PROG -f -c "pwrite -W -S 0xaa 0 8K" $SCRATCH_MNT/foobar | _filter_xfs_io
 _bdev_fail_make_request $SCRATCH_DEV 0
 
+# btrfs counts errors per IO, assuming the data is merged that'll be 1 IO, then
+# the log tree block and then the log root tree block and then the super block.
+# We should see at least 4 failed IO's, but with subpage blocksize we could see
+# more if the log blocks end up on the same page, or if the data IO gets split
+# at all.
 errs=$($BTRFS_UTIL_PROG device stats $SCRATCH_DEV | \
        $AWK_PROG '/write_io_errs/ { print $2 }')
-if [ $errs -ne $((4 * $sectors_per_page)) ]; then
+if [ $errs -lt 4 ]; then
         _fail "Errors: $errs expected: 4"
 fi