#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. # # FS QA Test No. 327 # # Create 100 reflinked files, CoW them all, and see if xfs_repair will # clear the reflink flag. There was a buffer handling bug in xfs_repair # that (fortunately) triggered asserts in the rmap code when clearing # the reflink flag. # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / _scratch_unmount > /dev/null 2>&1 rm -rf $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/reflink # real QA test starts here _supported_fs xfs _require_cp_reflink _require_scratch_reflink rm -f $seqres.full nr=128 # spanning at least one inode chunk tickles a bug in xfs_repair echo "Format filesystem" _scratch_mkfs >/dev/null 2>&1 _scratch_mount >> $seqres.full echo "Create files" _pwrite_byte 0x66 0 1 $SCRATCH_MNT/file.0 >> $seqres.full seq 1 $nr | while read i; do _cp_reflink $SCRATCH_MNT/file.0 $SCRATCH_MNT/file.$i done sync ino_0=$(stat -c '%i' $SCRATCH_MNT/file.0) ino_64=$(stat -c '%i' $SCRATCH_MNT/file.64) ino_128=$(stat -c '%i' $SCRATCH_MNT/file.128) echo "Check filesystem" _scratch_unmount _scratch_xfs_db -c "inode $ino_0" -c print \ -c "inode $ino_64" -c print \ -c "inode $ino_128" -c print | grep reflink | sed -e 's/^v[0-9]*/vX/g' _scratch_mount echo "Check files" for i in 0 $((nr / 2)) $nr; do md5sum $SCRATCH_MNT/file.$i | _filter_scratch $XFS_IO_PROG -c 'lsattr -v' $SCRATCH_MNT/file.$i >> $seqres.full done echo "CoW all files" seq 1 $nr | while read i; do echo m >> $SCRATCH_MNT/file.$i done echo "Repair filesystem" _scratch_unmount _repair_scratch_fs >> $seqres.full _scratch_xfs_db -c "inode $ino_0" -c print \ -c "inode $ino_64" -c print \ -c "inode $ino_128" -c print | grep reflink | sed -e 's/^v[0-9]*/vX/g' _scratch_mount echo "Check files again" for i in 0 $((nr / 2)) $nr; do md5sum $SCRATCH_MNT/file.$i | _filter_scratch $XFS_IO_PROG -c 'lsattr -v' $SCRATCH_MNT/file.$i >> $seqres.full done echo "Done" # success, all done status=0 exit