| #! /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 |