1*38044846SHanna Czenczek#!/usr/bin/env bash 2*38044846SHanna Czenczek# group: rw 3*38044846SHanna Czenczek# 4*38044846SHanna Czenczek# Produce an I/O error in file-posix, and hope that it is not catastrophic. 5*38044846SHanna Czenczek# Regression test for: https://bugzilla.redhat.com/show_bug.cgi?id=2234374 6*38044846SHanna Czenczek# 7*38044846SHanna Czenczek# Copyright (C) 2023 Red Hat, Inc. 8*38044846SHanna Czenczek# 9*38044846SHanna Czenczek# This program is free software; you can redistribute it and/or modify 10*38044846SHanna Czenczek# it under the terms of the GNU General Public License as published by 11*38044846SHanna Czenczek# the Free Software Foundation; either version 2 of the License, or 12*38044846SHanna Czenczek# (at your option) any later version. 13*38044846SHanna Czenczek# 14*38044846SHanna Czenczek# This program is distributed in the hope that it will be useful, 15*38044846SHanna Czenczek# but WITHOUT ANY WARRANTY; without even the implied warranty of 16*38044846SHanna Czenczek# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*38044846SHanna Czenczek# GNU General Public License for more details. 18*38044846SHanna Czenczek# 19*38044846SHanna Czenczek# You should have received a copy of the GNU General Public License 20*38044846SHanna Czenczek# along with this program. If not, see <http://www.gnu.org/licenses/>. 21*38044846SHanna Czenczek# 22*38044846SHanna Czenczek 23*38044846SHanna Czenczekseq=$(basename "$0") 24*38044846SHanna Czenczekecho "QA output created by $seq" 25*38044846SHanna Czenczek 26*38044846SHanna Czenczekstatus=1 # failure is the default! 27*38044846SHanna Czenczek 28*38044846SHanna Czenczek_cleanup() 29*38044846SHanna Czenczek{ 30*38044846SHanna Czenczek _cleanup_qemu 31*38044846SHanna Czenczek rm -f "$TEST_DIR/fuse-export" 32*38044846SHanna Czenczek} 33*38044846SHanna Czenczektrap "_cleanup; exit \$status" 0 1 2 3 15 34*38044846SHanna Czenczek 35*38044846SHanna Czenczek# get standard environment, filters and checks 36*38044846SHanna Czenczek. ../common.rc 37*38044846SHanna Czenczek. ../common.filter 38*38044846SHanna Czenczek. ../common.qemu 39*38044846SHanna Czenczek 40*38044846SHanna Czenczek# Format-agnostic (we do not use any), but we do test the file protocol 41*38044846SHanna Czenczek_supported_proto file 42*38044846SHanna Czenczek_require_drivers blkdebug null-co 43*38044846SHanna Czenczek 44*38044846SHanna Czenczekif [ "$IMGOPTSSYNTAX" = "true" ]; then 45*38044846SHanna Czenczek # We need `$QEMU_IO -f file` to work; IMGOPTSSYNTAX uses --image-opts, 46*38044846SHanna Czenczek # breaking -f. 47*38044846SHanna Czenczek _unsupported_fmt $IMGFMT 48*38044846SHanna Czenczekfi 49*38044846SHanna Czenczek 50*38044846SHanna Czenczek# This is a regression test of a bug in which flie-posix would access zone 51*38044846SHanna Czenczek# information in case of an I/O error even when there is no zone information, 52*38044846SHanna Czenczek# resulting in a division by zero. 53*38044846SHanna Czenczek# To reproduce the problem, we need to trigger an I/O error inside of 54*38044846SHanna Czenczek# file-posix, which can be done (rootless) by providing a FUSE export that 55*38044846SHanna Czenczek# presents only errors when accessed. 56*38044846SHanna Czenczek 57*38044846SHanna Czenczek_launch_qemu 58*38044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 59*38044846SHanna Czenczek "{'execute': 'qmp_capabilities'}" \ 60*38044846SHanna Czenczek 'return' 61*38044846SHanna Czenczek 62*38044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 63*38044846SHanna Czenczek "{'execute': 'blockdev-add', 64*38044846SHanna Czenczek 'arguments': { 65*38044846SHanna Czenczek 'driver': 'blkdebug', 66*38044846SHanna Czenczek 'node-name': 'node0', 67*38044846SHanna Czenczek 'inject-error': [{'event': 'none'}], 68*38044846SHanna Czenczek 'image': { 69*38044846SHanna Czenczek 'driver': 'null-co' 70*38044846SHanna Czenczek } 71*38044846SHanna Czenczek }}" \ 72*38044846SHanna Czenczek 'return' 73*38044846SHanna Czenczek 74*38044846SHanna Czenczek# FUSE mountpoint must exist and be a regular file 75*38044846SHanna Czenczektouch "$TEST_DIR/fuse-export" 76*38044846SHanna Czenczek 77*38044846SHanna Czenczek# The grep -v to filter fusermount's (benign) error when /etc/fuse.conf does 78*38044846SHanna Czenczek# not contain user_allow_other and the subsequent check for missing FUSE support 79*38044846SHanna Czenczek# have both been taken from iotest 308. 80*38044846SHanna Czenczekoutput=$(_send_qemu_cmd $QEMU_HANDLE \ 81*38044846SHanna Czenczek "{'execute': 'block-export-add', 82*38044846SHanna Czenczek 'arguments': { 83*38044846SHanna Czenczek 'id': 'exp0', 84*38044846SHanna Czenczek 'type': 'fuse', 85*38044846SHanna Czenczek 'node-name': 'node0', 86*38044846SHanna Czenczek 'mountpoint': '$TEST_DIR/fuse-export', 87*38044846SHanna Czenczek 'writable': true 88*38044846SHanna Czenczek }}" \ 89*38044846SHanna Czenczek 'return' \ 90*38044846SHanna Czenczek | grep -v 'option allow_other only allowed if') 91*38044846SHanna Czenczek 92*38044846SHanna Czenczekif echo "$output" | grep -q "Parameter 'type' does not accept value 'fuse'"; then 93*38044846SHanna Czenczek _notrun 'No FUSE support' 94*38044846SHanna Czenczekfi 95*38044846SHanna Czenczekecho "$output" 96*38044846SHanna Czenczek 97*38044846SHanna Czenczekecho 98*38044846SHanna Czenczek# This should fail, but gracefully, i.e. just print an I/O error, not crash. 99*38044846SHanna Czenczek$QEMU_IO -f file -c 'write 0 64M' "$TEST_DIR/fuse-export" | _filter_qemu_io 100*38044846SHanna Czenczekecho 101*38044846SHanna Czenczek 102*38044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 103*38044846SHanna Czenczek "{'execute': 'block-export-del', 104*38044846SHanna Czenczek 'arguments': {'id': 'exp0'}}" \ 105*38044846SHanna Czenczek 'return' 106*38044846SHanna Czenczek 107*38044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 108*38044846SHanna Czenczek '' \ 109*38044846SHanna Czenczek 'BLOCK_EXPORT_DELETED' 110*38044846SHanna Czenczek 111*38044846SHanna Czenczek_send_qemu_cmd $QEMU_HANDLE \ 112*38044846SHanna Czenczek "{'execute': 'blockdev-del', 113*38044846SHanna Czenczek 'arguments': {'node-name': 'node0'}}" \ 114*38044846SHanna Czenczek 'return' 115*38044846SHanna Czenczek 116*38044846SHanna Czenczek# success, all done 117*38044846SHanna Czenczekecho "*** done" 118*38044846SHanna Czenczekrm -f $seq.full 119*38044846SHanna Czenczekstatus=0 120