From: Dave Chinner <dchinner@xxxxxxxxxx> Running a dm-flakey or dm-error test that loads a table that returns EIO to all IO and then running a command that is expected to fail with a specific error is racy. If there is memory pressure at the same time that the table is loaded, cached inodes can be turfed from memory and the command then needs to read the inode it is about to act on from disk again. This results in the inode read getting EIO and failing (e.g. xfs_io will return a stat() error) rather than having the desired operation fail. This results in spurious test failures that look like this: generic/331 - output mismatch (see /mnt/xfs/runner-41/results-2024-11-20-10:57:31/xfs/generic/331.out.bad) --- tests/generic/331.out 2022-12-21 15:53:25.487044098 +1100 +++ /mnt/xfs/runner-41/results-2024-11-20-10:57:31/xfs/generic/331.out.bad 2024-11-20 11:02:12.123572607 +1100 @@ -5,7 +5,8 @@ 1886e67cf8783e89ce6ddc5bb09a3944 SCRATCH_MNT/test-331/file1 1886e67cf8783e89ce6ddc5bb09a3944 SCRATCH_MNT/test-331/file2 CoW and unmount -fdatasync: Input/output error +/mnt/xfs/runner-41/scratch/test-331/file2: Input/output error +stat: Input/output error Compare files ... Add a new "flakey EIO filter" that will catch -any- EIO error from the command and change it to the error we expected to see. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- common/filter | 9 +++++++++ tests/btrfs/160 | 3 ++- tests/generic/252 | 3 ++- tests/generic/329 | 3 ++- tests/generic/331 | 5 +++-- tests/generic/484 | 3 ++- tests/generic/743 | 4 +++- tests/xfs/237 | 3 ++- tests/xfs/240 | 5 +++-- 9 files changed, 28 insertions(+), 10 deletions(-) diff --git a/common/filter b/common/filter index 6a509d8b5..7e02ded37 100644 --- a/common/filter +++ b/common/filter @@ -662,5 +662,14 @@ _filter_trailing_whitespace() sed -E -e "s/\s+$//" } +# Catch -any- EIO error regardless of it's source and replace it with the +# supplied error message. +_filter_flakey_EIO() +{ + local message="$*" + + sed -e "s#.*: Input\/output error#$message#" +} + # make sure this script returns success /bin/true diff --git a/tests/btrfs/160 b/tests/btrfs/160 index 04ed1f176..c4a01d330 100755 --- a/tests/btrfs/160 +++ b/tests/btrfs/160 @@ -66,7 +66,8 @@ _dmerror_load_working_table # open again and call fsync echo "The following fsync should fail with EIO:" -$XFS_IO_PROG -c fsync $testfile +$XFS_IO_PROG -c fsync $testfile |& \ + _filter_flakey_EIO "fsync: Input/output error" echo "done" # close file diff --git a/tests/generic/252 b/tests/generic/252 index ddf950e34..2ad0524c2 100755 --- a/tests/generic/252 +++ b/tests/generic/252 @@ -66,7 +66,8 @@ $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full _scratch_sync _dmerror_load_error_table -$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full +$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \ + _filter_flakey_EIO "write missed bytes expect 8388608 got 0" _dmerror_load_working_table _dmerror_unmount _dmerror_mount diff --git a/tests/generic/329 b/tests/generic/329 index e4300f92c..96a5ad54c 100755 --- a/tests/generic/329 +++ b/tests/generic/329 @@ -59,7 +59,8 @@ $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full _scratch_sync _dmerror_load_error_table -$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full +$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \ + _filter_flakey_EIO "write missed bytes expect 8388608 got 0" _dmerror_load_working_table _dmerror_unmount _dmerror_mount diff --git a/tests/generic/331 b/tests/generic/331 index fe12ec4eb..704bb1283 100755 --- a/tests/generic/331 +++ b/tests/generic/331 @@ -59,8 +59,9 @@ $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full _scratch_sync _dmerror_load_error_table -$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full -$XFS_IO_PROG -c "fdatasync" $testdir/file2 +$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full 2>&1 +$XFS_IO_PROG -c "fdatasync" $testdir/file2 |& \ + _filter_flakey_EIO "fdatasync: Input/output error" _dmerror_load_working_table _dmerror_unmount _dmerror_mount diff --git a/tests/generic/484 b/tests/generic/484 index 09c2c5598..ec50735a5 100755 --- a/tests/generic/484 +++ b/tests/generic/484 @@ -54,7 +54,8 @@ $XFS_IO_PROG -c "pwrite -W -q 0 $datalen" $testfile _dmerror_load_error_table # rewrite the data and call fdatasync -$XFS_IO_PROG -c "pwrite -w -q 0 $datalen" $testfile +$XFS_IO_PROG -c "pwrite -w -q 0 $datalen" $testfile |& \ + _filter_flakey_EIO "fdatasync: Input/output error" # heal the device error _dmerror_load_working_table diff --git a/tests/generic/743 b/tests/generic/743 index 228ba764e..efdeec82d 100755 --- a/tests/generic/743 +++ b/tests/generic/743 @@ -21,6 +21,7 @@ _cleanup() } # Import common functions. +. ./common/filter . ./common/dmerror _fixed_by_kernel_commit 631426ba1d45 \ @@ -55,7 +56,8 @@ _dmerror_mount stat "$SCRATCH_MNT/a" >> $seqres.full echo read with IO errors _dmerror_load_error_table -$TIMEOUT_PROG -s KILL 10s $XFS_IO_PROG -c "mmap -r 0 $filesz" -c "madvise -R 0 $filesz" "$SCRATCH_MNT/a" +$TIMEOUT_PROG -s KILL 10s $XFS_IO_PROG -c "mmap -r 0 $filesz" -c "madvise -R 0 $filesz" "$SCRATCH_MNT/a" |& \ + _filter_flakey_EIO "madvise: Bad address" _dmerror_load_working_table # success, all done diff --git a/tests/xfs/237 b/tests/xfs/237 index 91f56d6c1..eb5dc5d2f 100755 --- a/tests/xfs/237 +++ b/tests/xfs/237 @@ -68,7 +68,8 @@ $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full _scratch_sync _dmerror_load_error_table -$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full +$AIO_TEST -a $alignment -f DIRECT -b $bufsize $TEST_DIR/moo $testdir/file2 |& \ + _filter_flakey_EIO "write missed bytes expect 8388608 got 0" _dmerror_load_working_table _dmerror_unmount _dmerror_mount diff --git a/tests/xfs/240 b/tests/xfs/240 index e95cf3f5d..8916828a8 100755 --- a/tests/xfs/240 +++ b/tests/xfs/240 @@ -64,8 +64,9 @@ $XFS_IO_PROG -f -c "pwrite -S 0x63 $bufsize 1" $testdir/file2 >> $seqres.full $XFS_IO_PROG -f -c "pwrite -S 0x63 -b $bufsize 0 $filesize" $TEST_DIR/moo >> $seqres.full _scratch_sync _dmerror_load_error_table -$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full -$XFS_IO_PROG -c "fdatasync" $testdir/file2 +$AIO_TEST -b $bufsize $TEST_DIR/moo $testdir/file2 >> $seqres.full 2>&1 +$XFS_IO_PROG -c "fdatasync" $testdir/file2 |& \ + _filter_flakey_EIO "fdatasync: Input/output error" _dmerror_load_working_table _dmerror_unmount _dmerror_mount -- 2.45.2