#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2021 Chandan Babu R. All Rights Reserved. # # FS QA Test 537 # # Verify that XFS does not cause inode fork's extent count to overflow when # swapping forks between files . ./common/preamble _begin_fstest auto quick collapse swapext # Import common functions. . ./common/filter . ./common/inject # real QA test starts here _supported_fs xfs _require_scratch _require_xfs_debug _require_xfs_scratch_rmapbt _require_xfs_io_command "fcollapse" _require_xfs_io_command "swapext" _require_xfs_io_error_injection "reduce_max_iextents" echo "* Swap extent forks" echo "Format and mount fs" _scratch_mkfs >> $seqres.full _scratch_mount >> $seqres.full bsize=$(_get_file_block_size $SCRATCH_MNT) srcfile=${SCRATCH_MNT}/srcfile donorfile=${SCRATCH_MNT}/donorfile echo "Create \$donorfile having an extent of length 67 blocks" $XFS_IO_PROG -f -s -c "pwrite -b $((17 * bsize)) 0 $((17 * bsize))" $donorfile \ >> $seqres.full # After the for loop the donor file will have the following extent layout # | 0-4 | 5 | 6 | 7 | 8 | 9 | 10 | echo "Fragment \$donorfile" for i in $(seq 5 10); do start_offset=$((i * bsize)) $XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $donorfile >> $seqres.full done echo "Create \$srcfile having an extent of length 18 blocks" $XFS_IO_PROG -f -s -c "pwrite -b $((18 * bsize)) 0 $((18 * bsize))" $srcfile \ >> $seqres.full echo "Fragment \$srcfile" # After the for loop the src file will have the following extent layout # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7-10 | for i in $(seq 1 7); do start_offset=$((i * bsize)) $XFS_IO_PROG -f -c "fcollapse $start_offset $bsize" $srcfile >> $seqres.full done echo "Collect \$donorfile's extent count" donor_nr_exts=$(_xfs_get_fsxattr nextents $donorfile) echo "Collect \$srcfile's extent count" src_nr_exts=$(_xfs_get_fsxattr nextents $srcfile) echo "Inject reduce_max_iextents error tag" _scratch_inject_error reduce_max_iextents 1 echo "Swap \$srcfile's and \$donorfile's extent forks" $XFS_IO_PROG -f -c "swapext $donorfile" $srcfile >> $seqres.full 2>&1 echo "Check for \$donorfile's extent count overflow" nextents=$(_xfs_get_fsxattr nextents $donorfile) if (( $nextents == $src_nr_exts )); then echo "\$donorfile: Extent count overflow check failed" fi echo "Check for \$srcfile's extent count overflow" nextents=$(_xfs_get_fsxattr nextents $srcfile) if (( $nextents == $donor_nr_exts )); then echo "\$srcfile: Extent count overflow check failed" fi # success, all done status=0 exit