| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2021 Chandan Babu R. All Rights Reserved. |
| # |
| # FS QA Test 534 |
| # |
| # Verify that XFS does not cause inode fork's extent count to overflow when |
| # writing to an unwritten extent. |
| . ./common/preamble |
| _begin_fstest auto quick |
| |
| # Import common functions. |
| . ./common/filter |
| . ./common/inject |
| |
| # real QA test starts here |
| |
| _supported_fs xfs |
| _require_scratch |
| _require_xfs_debug |
| _require_xfs_io_command "falloc" |
| _require_xfs_io_error_injection "reduce_max_iextents" |
| |
| echo "Format and mount fs" |
| _scratch_mkfs_sized $((1024 * 1024 * 1024)) >> $seqres.full |
| _scratch_mount >> $seqres.full |
| |
| bsize=$(_get_file_block_size $SCRATCH_MNT) |
| |
| testfile=${SCRATCH_MNT}/testfile |
| |
| nr_blks=15 |
| |
| for io in Buffered Direct; do |
| echo "* $io write to unwritten extent" |
| |
| echo "Fallocate $nr_blks blocks" |
| $XFS_IO_PROG -f -c "falloc 0 $((nr_blks * bsize))" $testfile >> $seqres.full |
| |
| if [[ $io == "Buffered" ]]; then |
| xfs_io_flag="" |
| else |
| xfs_io_flag="-d" |
| fi |
| |
| echo "Inject reduce_max_iextents error tag" |
| _scratch_inject_error reduce_max_iextents 1 |
| |
| echo "$io write to every other block of fallocated space" |
| for i in $(seq 1 2 $((nr_blks - 1))); do |
| $XFS_IO_PROG -f -s $xfs_io_flag -c "pwrite $((i * bsize)) $bsize" \ |
| $testfile >> $seqres.full 2>&1 |
| [[ $? != 0 ]] && break |
| done |
| |
| echo "Verify \$testfile's extent count" |
| nextents=$(_xfs_get_fsxattr nextents $testfile) |
| if (( $nextents > 10 )); then |
| echo "Extent count overflow check failed: nextents = $nextents" |
| exit 1 |
| fi |
| |
| echo "Disable reduce_max_iextents error tag" |
| _scratch_inject_error reduce_max_iextents 0 |
| |
| rm $testfile |
| done |
| |
| # success, all done |
| status=0 |
| exit |