138044846SHanna Czenczek#!/usr/bin/env bash 238044846SHanna Czenczek# group: rw 338044846SHanna Czenczek# 438044846SHanna Czenczek# Produce an I/O error in file-posix, and hope that it is not catastrophic. 538044846SHanna Czenczek# Regression test for: https://bugzilla.redhat.com/show_bug.cgi?id=2234374 638044846SHanna Czenczek# 738044846SHanna Czenczek# Copyright (C) 2023 Red Hat, Inc. 838044846SHanna Czenczek# 938044846SHanna Czenczek# This program is free software; you can redistribute it and/or modify 1038044846SHanna Czenczek# it under the terms of the GNU General Public License as published by 1138044846SHanna Czenczek# the Free Software Foundation; either version 2 of the License, or 1238044846SHanna Czenczek# (at your option) any later version. 1338044846SHanna Czenczek# 1438044846SHanna Czenczek# This program is distributed in the hope that it will be useful, 1538044846SHanna Czenczek# but WITHOUT ANY WARRANTY; without even the implied warranty of 1638044846SHanna Czenczek# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1738044846SHanna Czenczek# GNU General Public License for more details. 1838044846SHanna Czenczek# 1938044846SHanna Czenczek# You should have received a copy of the GNU General Public License 2038044846SHanna Czenczek# along with this program. If not, see <http://www.gnu.org/licenses/>. 2138044846SHanna Czenczek# 2238044846SHanna Czenczek 2338044846SHanna Czenczekseq=$(basename "$0") 2438044846SHanna Czenczekecho "QA output created by $seq" 2538044846SHanna Czenczek 2638044846SHanna Czenczekstatus=1 # failure is the default! 2738044846SHanna Czenczek 2838044846SHanna Czenczek_cleanup() 2938044846SHanna Czenczek{ 3038044846SHanna Czenczek _cleanup_qemu 3138044846SHanna Czenczek rm -f "$TEST_DIR/fuse-export" 3238044846SHanna Czenczek} 3338044846SHanna Czenczektrap "_cleanup; exit \$status" 0 1 2 3 15 3438044846SHanna Czenczek 3538044846SHanna Czenczek# get standard environment, filters and checks 3638044846SHanna Czenczek. ../common.rc 3738044846SHanna Czenczek. ../common.filter 3838044846SHanna Czenczek. ../common.qemu 3938044846SHanna Czenczek 4038044846SHanna Czenczek# Format-agnostic (we do not use any), but we do test the file protocol 4138044846SHanna Czenczek_supported_proto file 4238044846SHanna Czenczek_require_drivers blkdebug null-co 4338044846SHanna Czenczek 4438044846SHanna Czenczekif [ "$IMGOPTSSYNTAX" = "true" ]; then 4538044846SHanna Czenczek # We need `$QEMU_IO -f file` to work; IMGOPTSSYNTAX uses --image-opts, 4638044846SHanna Czenczek # breaking -f. 4738044846SHanna Czenczek _unsupported_fmt $IMGFMT 4838044846SHanna Czenczekfi 4938044846SHanna Czenczek 5038044846SHanna Czenczek# This is a regression test of a bug in which flie-posix would access zone 5138044846SHanna Czenczek# information in case of an I/O error even when there is no zone information, 5238044846SHanna Czenczek# resulting in a division by zero. 5338044846SHanna Czenczek# To reproduce the problem, we need to trigger an I/O error inside of 5438044846SHanna Czenczek# file-posix, which can be done (rootless) by providing a FUSE export that 5538044846SHanna Czenczek# presents only errors when accessed. 5638044846SHanna Czenczek 5738044846SHanna Czenczek_launch_qemu 5838044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 5938044846SHanna Czenczek "{'execute': 'qmp_capabilities'}" \ 6038044846SHanna Czenczek 'return' 6138044846SHanna Czenczek 6238044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 6338044846SHanna Czenczek "{'execute': 'blockdev-add', 6438044846SHanna Czenczek 'arguments': { 6538044846SHanna Czenczek 'driver': 'blkdebug', 6638044846SHanna Czenczek 'node-name': 'node0', 6738044846SHanna Czenczek 'inject-error': [{'event': 'none'}], 6838044846SHanna Czenczek 'image': { 6938044846SHanna Czenczek 'driver': 'null-co' 7038044846SHanna Czenczek } 7138044846SHanna Czenczek }}" \ 7238044846SHanna Czenczek 'return' 7338044846SHanna Czenczek 7438044846SHanna Czenczek# FUSE mountpoint must exist and be a regular file 7538044846SHanna Czenczektouch "$TEST_DIR/fuse-export" 7638044846SHanna Czenczek 7738044846SHanna Czenczek# The grep -v to filter fusermount's (benign) error when /etc/fuse.conf does 7838044846SHanna Czenczek# not contain user_allow_other and the subsequent check for missing FUSE support 7938044846SHanna Czenczek# have both been taken from iotest 308. 8038044846SHanna Czenczekoutput=$(_send_qemu_cmd $QEMU_HANDLE \ 8138044846SHanna Czenczek "{'execute': 'block-export-add', 8238044846SHanna Czenczek 'arguments': { 8338044846SHanna Czenczek 'id': 'exp0', 8438044846SHanna Czenczek 'type': 'fuse', 8538044846SHanna Czenczek 'node-name': 'node0', 8638044846SHanna Czenczek 'mountpoint': '$TEST_DIR/fuse-export', 8738044846SHanna Czenczek 'writable': true 8838044846SHanna Czenczek }}" \ 8938044846SHanna Czenczek 'return' \ 9038044846SHanna Czenczek | grep -v 'option allow_other only allowed if') 9138044846SHanna Czenczek 9238044846SHanna Czenczekif echo "$output" | grep -q "Parameter 'type' does not accept value 'fuse'"; then 9338044846SHanna Czenczek _notrun 'No FUSE support' 9438044846SHanna Czenczekfi 9538044846SHanna Czenczekecho "$output" 9638044846SHanna Czenczek 9738044846SHanna Czenczekecho 9838044846SHanna Czenczek# This should fail, but gracefully, i.e. just print an I/O error, not crash. 9938044846SHanna Czenczek$QEMU_IO -f file -c 'write 0 64M' "$TEST_DIR/fuse-export" | _filter_qemu_io 10038044846SHanna Czenczekecho 10138044846SHanna Czenczek 102*f389309dSStefan Hajnoczicapture_events=BLOCK_EXPORT_DELETED _send_qemu_cmd $QEMU_HANDLE \ 10338044846SHanna Czenczek "{'execute': 'block-export-del', 10438044846SHanna Czenczek 'arguments': {'id': 'exp0'}}" \ 10538044846SHanna Czenczek 'return' 10638044846SHanna Czenczek 107*f389309dSStefan Hajnoczi_wait_event $QEMU_HANDLE \ 10838044846SHanna Czenczek 'BLOCK_EXPORT_DELETED' 10938044846SHanna Czenczek 11038044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 11138044846SHanna Czenczek "{'execute': 'blockdev-del', 11238044846SHanna Czenczek 'arguments': {'node-name': 'node0'}}" \ 11338044846SHanna Czenczek 'return' 11438044846SHanna Czenczek 11538044846SHanna Czenczek# success, all done 11638044846SHanna Czenczekecho "*** done" 11738044846SHanna Czenczekrm -f $seq.full 11838044846SHanna Czenczekstatus=0 119