#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2022 Oracle. All Rights Reserved. # # FS QA Test 548 # # Test to verify upgrade of an existing V5 filesystem to support large extent # counters. # . ./common/preamble _begin_fstest auto quick metadata # Import common functions. . ./common/filter . ./common/attr . ./common/inject . ./common/populate # real QA test starts here _supported_fs xfs _require_scratch _require_xfs_nrext64 _require_attrs _require_xfs_debug _require_xfs_db_command path _require_test_program "punch-alternating" _require_xfs_io_error_injection "bmap_alloc_minlen_extent" _scratch_mkfs -d size=$((512 * 1024 * 1024)) >> $seqres.full _scratch_mount >> $seqres.full bsize=$(_get_file_block_size $SCRATCH_MNT) testfile=$SCRATCH_MNT/testfile nr_blks=20 echo "Add blocks to file's data fork" $XFS_IO_PROG -f -c "pwrite 0 $((nr_blks * bsize))" $testfile \ >> $seqres.full $here/src/punch-alternating $testfile echo "Consume free space" fillerdir=$SCRATCH_MNT/fillerdir nr_free_blks=$(stat -f -c '%f' $SCRATCH_MNT) nr_free_blks=$((nr_free_blks * 90 / 100)) _fill_fs $((bsize * nr_free_blks)) $fillerdir $bsize 0 \ >> $seqres.full 2>&1 echo "Create fragmented filesystem" for dentry in $(ls -1 $fillerdir/); do $here/src/punch-alternating $fillerdir/$dentry >> $seqres.full done echo "Inject bmap_alloc_minlen_extent error tag" _scratch_inject_error bmap_alloc_minlen_extent 1 echo "Add blocks to file's attr fork" nr_blks=10 attr_len=255 nr_attrs=$((nr_blks * bsize / attr_len)) for i in $(seq 1 $nr_attrs); do attr="$(printf "trusted.%0247d" $i)" $SETFATTR_PROG -n "$attr" $testfile >> $seqres.full 2>&1 [[ $? != 0 ]] && break done echo "Unmount filesystem" _scratch_unmount >> $seqres.full orig_dcnt=$(_scratch_xfs_get_metadata_field core.nextents \ "path /$(basename $testfile)") orig_acnt=$(_scratch_xfs_get_metadata_field core.naextents \ "path /$(basename $testfile)") echo "Upgrade filesystem to support large extent counters" _scratch_xfs_admin -O nrext64=1 >> $seqres.full 2>&1 if [[ $? != 0 ]]; then _notrun "Filesystem geometry is not suitable for upgrading" fi echo "Mount filesystem" _scratch_mount >> $seqres.full echo "Modify inode core" touch $testfile echo "Unmount filesystem" _scratch_unmount >> $seqres.full dcnt=$(_scratch_xfs_get_metadata_field core.nextents \ "path /$(basename $testfile)") acnt=$(_scratch_xfs_get_metadata_field core.naextents \ "path /$(basename $testfile)") echo "Verify inode extent counter values after fs upgrade" if [[ $orig_dcnt != $dcnt ]]; then echo "Corrupt data extent counter" exit 1 fi if [[ $orig_acnt != $acnt ]]; then echo "Corrupt attr extent counter" exit 1 fi # success, all done status=0 exit