| #! /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. |
| # |
| . ./common/preamble |
| _begin_fstest auto quick clone |
| |
| # Override the default cleanup function. |
| _cleanup() |
| { |
| cd / |
| _scratch_unmount > /dev/null 2>&1 |
| rm -rf $tmp.* |
| } |
| |
| # Import common functions. |
| . ./common/filter |
| . ./common/reflink |
| |
| _require_cp_reflink |
| _require_scratch_reflink |
| |
| 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 |
| _scratch_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 |