-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This is a regression test for https://bugzilla.redhat.com/show_bug.cgi?id=2234374. All this test needs to do is trigger an I/O error inside of file-posix (specifically raw_co_prw()). One reliable way to do this without requiring special privileges is to use a FUSE export, which allows us to inject any error that we want, e.g. via blkdebug. Signed-off-by: Hanna Czenczek <hreitz@redhat.com> Message-Id: <20230824155345.109765-6-hreitz@redhat.com> [hreitz: Fixed test to be skipped when there is no FUSE support, to suppress fusermount's allow_other warning, and to be skipped with $IMGOPTSSYNTAX enabled] Signed-off-by: Hanna Czenczek <hreitz@redhat.com> (cherry picked from commit 3804484) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
- Loading branch information
Showing
2 changed files
with
152 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
#!/usr/bin/env bash | ||
# group: rw | ||
# | ||
# Produce an I/O error in file-posix, and hope that it is not catastrophic. | ||
# Regression test for: https://bugzilla.redhat.com/show_bug.cgi?id=2234374 | ||
# | ||
# Copyright (C) 2023 Red Hat, Inc. | ||
# | ||
# This program is free software; you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License as published by | ||
# the Free Software Foundation; either version 2 of the License, or | ||
# (at your option) any later version. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
# | ||
|
||
seq=$(basename "$0") | ||
echo "QA output created by $seq" | ||
|
||
status=1 # failure is the default! | ||
|
||
_cleanup() | ||
{ | ||
_cleanup_qemu | ||
rm -f "$TEST_DIR/fuse-export" | ||
} | ||
trap "_cleanup; exit \$status" 0 1 2 3 15 | ||
|
||
# get standard environment, filters and checks | ||
. ../common.rc | ||
. ../common.filter | ||
. ../common.qemu | ||
|
||
# Format-agnostic (we do not use any), but we do test the file protocol | ||
_supported_proto file | ||
_require_drivers blkdebug null-co | ||
|
||
if [ "$IMGOPTSSYNTAX" = "true" ]; then | ||
# We need `$QEMU_IO -f file` to work; IMGOPTSSYNTAX uses --image-opts, | ||
# breaking -f. | ||
_unsupported_fmt $IMGFMT | ||
fi | ||
|
||
# This is a regression test of a bug in which flie-posix would access zone | ||
# information in case of an I/O error even when there is no zone information, | ||
# resulting in a division by zero. | ||
# To reproduce the problem, we need to trigger an I/O error inside of | ||
# file-posix, which can be done (rootless) by providing a FUSE export that | ||
# presents only errors when accessed. | ||
|
||
_launch_qemu | ||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{'execute': 'qmp_capabilities'}" \ | ||
'return' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{'execute': 'blockdev-add', | ||
'arguments': { | ||
'driver': 'blkdebug', | ||
'node-name': 'node0', | ||
'inject-error': [{'event': 'none'}], | ||
'image': { | ||
'driver': 'null-co' | ||
} | ||
}}" \ | ||
'return' | ||
|
||
# FUSE mountpoint must exist and be a regular file | ||
touch "$TEST_DIR/fuse-export" | ||
|
||
# The grep -v to filter fusermount's (benign) error when /etc/fuse.conf does | ||
# not contain user_allow_other and the subsequent check for missing FUSE support | ||
# have both been taken from iotest 308. | ||
output=$(_send_qemu_cmd $QEMU_HANDLE \ | ||
"{'execute': 'block-export-add', | ||
'arguments': { | ||
'id': 'exp0', | ||
'type': 'fuse', | ||
'node-name': 'node0', | ||
'mountpoint': '$TEST_DIR/fuse-export', | ||
'writable': true | ||
}}" \ | ||
'return' \ | ||
| grep -v 'option allow_other only allowed if') | ||
|
||
if echo "$output" | grep -q "Parameter 'type' does not accept value 'fuse'"; then | ||
_notrun 'No FUSE support' | ||
fi | ||
echo "$output" | ||
|
||
echo | ||
# This should fail, but gracefully, i.e. just print an I/O error, not crash. | ||
$QEMU_IO -f file -c 'write 0 64M' "$TEST_DIR/fuse-export" | _filter_qemu_io | ||
echo | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{'execute': 'block-export-del', | ||
'arguments': {'id': 'exp0'}}" \ | ||
'return' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
'' \ | ||
'BLOCK_EXPORT_DELETED' | ||
|
||
_send_qemu_cmd $QEMU_HANDLE \ | ||
"{'execute': 'blockdev-del', | ||
'arguments': {'node-name': 'node0'}}" \ | ||
'return' | ||
|
||
# success, all done | ||
echo "*** done" | ||
rm -f $seq.full | ||
status=0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
QA output created by file-io-error | ||
{'execute': 'qmp_capabilities'} | ||
{"return": {}} | ||
{'execute': 'blockdev-add', | ||
'arguments': { | ||
'driver': 'blkdebug', | ||
'node-name': 'node0', | ||
'inject-error': [{'event': 'none'}], | ||
'image': { | ||
'driver': 'null-co' | ||
} | ||
}} | ||
{"return": {}} | ||
{'execute': 'block-export-add', | ||
'arguments': { | ||
'id': 'exp0', | ||
'type': 'fuse', | ||
'node-name': 'node0', | ||
'mountpoint': 'TEST_DIR/fuse-export', | ||
'writable': true | ||
}} | ||
{"return": {}} | ||
|
||
write failed: Input/output error | ||
|
||
{'execute': 'block-export-del', | ||
'arguments': {'id': 'exp0'}} | ||
{"return": {}} | ||
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "exp0"}} | ||
{'execute': 'blockdev-del', | ||
'arguments': {'node-name': 'node0'}} | ||
{"return": {}} | ||
*** done |