blob: 6b5d319675f741a824e46405ea1508ea2e70d2af [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015 Red Hat Inc. All Rights Reserved.
# Copyright (c) 2023 Christoph Hellwig
#
# Test proper file system shut down when the block device is removed underneath
# and there is dirty data.
#
. ./common/preamble
_begin_fstest auto quick
_cleanup()
{
cd /
_unmount $SCSI_DEBUG_MNT >>$seqres.full 2>&1
_put_scsi_debug_dev
rm -f $tmp.*
}
. ./common/filter
. ./common/scsi_debug
# We don't actually use the test device, but we need a block based fs
_require_test
_require_block_device $TEST_DEV
_require_scsi_debug
size=$(_small_fs_size_mb 256)
SCSI_DEBUG_DEV=`_get_scsi_debug_dev 512 512 0 $size`
test -b "$SCSI_DEBUG_DEV" || _notrun "Failed to initialize scsi debug device"
SCRATCH_DEV=$SCSI_DEBUG_DEV _require_scratch_shutdown
echo "SCSI debug device $SCSI_DEBUG_DEV" >>$seqres.full
run_check _mkfs_dev $SCSI_DEBUG_DEV
SCSI_DEBUG_MNT="$TEST_DIR/scsi_debug_$seq"
rm -rf $SCSI_DEBUG_MNT
mkdir $SCSI_DEBUG_MNT
run_check _mount $SCSI_DEBUG_DEV $SCSI_DEBUG_MNT
# create a test file
$XFS_IO_PROG -f -c "pwrite 0 1M" $SCSI_DEBUG_MNT/testfile >>$seqres.full
# open a file descriptor for reading the file
exec 3< $SCSI_DEBUG_MNT/testfile
# delete the scsi debug device while it still has dirty data
echo 1 > /sys/block/$(_short_dev $SCSI_DEBUG_DEV)/device/delete
# try to read from the file, which should give us -EIO
cat <&3 > /dev/null
# close the file descriptor to not block unmount
exec 3<&-
status=0
exit