|  | #! /bin/bash | 
|  | # SPDX-License-Identifier: GPL-2.0 | 
|  | # Copyright (c) 2015, Oracle and/or its affiliates.  All Rights Reserved. | 
|  | # | 
|  | # FS QA Test No. 146 | 
|  | # | 
|  | # Ensure that punch-hole steps around reflinked ranges: | 
|  | #   - Create three reflink clones of a file | 
|  | #   - Punch the start, middle, and end of the reflink range of each | 
|  | #     of the three files, respectively | 
|  | #   - Check that the reflinked areas are still there. | 
|  | # | 
|  | . ./common/preamble | 
|  | _begin_fstest auto quick clone punch | 
|  |  | 
|  | # Override the default cleanup function. | 
|  | _cleanup() | 
|  | { | 
|  | cd / | 
|  | rm -rf $tmp.* $testdir | 
|  | } | 
|  |  | 
|  | # Import common functions. | 
|  | . ./common/filter | 
|  | . ./common/reflink | 
|  |  | 
|  | _require_test_reflink | 
|  | _require_cp_reflink | 
|  | _require_xfs_io_command "fpunch" | 
|  |  | 
|  | testdir=$TEST_DIR/test-$seq | 
|  | rm -rf $testdir | 
|  | mkdir $testdir | 
|  |  | 
|  | echo "Create the original files" | 
|  | blksz=65536 | 
|  | _pwrite_byte 0x61 0 $blksz $testdir/file1 >> $seqres.full | 
|  | _pwrite_byte 0x62 $blksz $blksz $testdir/file1 >> $seqres.full | 
|  | _pwrite_byte 0x63 $((blksz * 2)) $blksz $testdir/file1 >> $seqres.full | 
|  |  | 
|  | _cp_reflink $testdir/file1 $testdir/file2 | 
|  | _cp_reflink $testdir/file1 $testdir/file3 | 
|  | _cp_reflink $testdir/file1 $testdir/file4 | 
|  |  | 
|  | _pwrite_byte 0x00 0 $blksz $testdir/file2.chk >> $seqres.full | 
|  | _pwrite_byte 0x62 $blksz $blksz $testdir/file2.chk >> $seqres.full | 
|  | _pwrite_byte 0x63 $((blksz * 2)) $blksz $testdir/file2.chk >> $seqres.full | 
|  |  | 
|  | _pwrite_byte 0x61 0 $blksz $testdir/file3.chk >> $seqres.full | 
|  | _pwrite_byte 0x00 $blksz $blksz $testdir/file3.chk >> $seqres.full | 
|  | _pwrite_byte 0x63 $((blksz * 2)) $blksz $testdir/file3.chk >> $seqres.full | 
|  |  | 
|  | _pwrite_byte 0x61 0 $blksz $testdir/file4.chk >> $seqres.full | 
|  | _pwrite_byte 0x62 $blksz $blksz $testdir/file4.chk >> $seqres.full | 
|  | _pwrite_byte 0x00 $((blksz * 2)) $blksz $testdir/file4.chk >> $seqres.full | 
|  | _test_cycle_mount | 
|  |  | 
|  | md5sum $testdir/file1 | _filter_test_dir | 
|  | md5sum $testdir/file2 | _filter_test_dir | 
|  | md5sum $testdir/file3 | _filter_test_dir | 
|  | md5sum $testdir/file4 | _filter_test_dir | 
|  | md5sum $testdir/file2.chk | _filter_test_dir | 
|  | md5sum $testdir/file3.chk | _filter_test_dir | 
|  | md5sum $testdir/file4.chk | _filter_test_dir | 
|  |  | 
|  | c1=$(_md5_checksum $testdir/file1) | 
|  | c2=$(_md5_checksum $testdir/file2) | 
|  | c3=$(_md5_checksum $testdir/file3) | 
|  | c4=$(_md5_checksum $testdir/file4) | 
|  |  | 
|  | test ${c1} = ${c2} || echo "file1 and file2 should match" | 
|  | test ${c1} = ${c3} || echo "file1 and file3 should match" | 
|  | test ${c1} = ${c4} || echo "file1 and file4 should match" | 
|  | test ${c2} = ${c3} || echo "file2 and file3 should match" | 
|  | test ${c2} = ${c4} || echo "file2 and file4 should match" | 
|  | test ${c3} = ${c4} || echo "file3 and file4 should match" | 
|  |  | 
|  | echo "fpunch files" | 
|  | $XFS_IO_PROG -f -c "fpunch 0 $blksz" $testdir/file2 | 
|  | $XFS_IO_PROG -f -c "fpunch $blksz $blksz" $testdir/file3 | 
|  | $XFS_IO_PROG -f -c "fpunch $((blksz * 2)) $blksz" $testdir/file4 | 
|  | _test_cycle_mount | 
|  |  | 
|  | echo "Compare files" | 
|  | md5sum $testdir/file1 | _filter_test_dir | 
|  | md5sum $testdir/file2 | _filter_test_dir | 
|  | md5sum $testdir/file3 | _filter_test_dir | 
|  | md5sum $testdir/file4 | _filter_test_dir | 
|  | md5sum $testdir/file2.chk | _filter_test_dir | 
|  | md5sum $testdir/file3.chk | _filter_test_dir | 
|  | md5sum $testdir/file4.chk | _filter_test_dir | 
|  |  | 
|  | c1=$(_md5_checksum $testdir/file1) | 
|  | c2=$(_md5_checksum $testdir/file2) | 
|  | c3=$(_md5_checksum $testdir/file3) | 
|  | c4=$(_md5_checksum $testdir/file4) | 
|  |  | 
|  | test ${c1} != ${c2} || echo "file1 and file2 should not match" | 
|  | test ${c1} != ${c3} || echo "file1 and file3 should not match" | 
|  | test ${c1} != ${c4} || echo "file1 and file4 should not match" | 
|  | test ${c2} != ${c3} || echo "file2 and file3 should not match" | 
|  | test ${c2} != ${c4} || echo "file2 and file4 should not match" | 
|  | test ${c3} != ${c4} || echo "file3 and file4 should not match" | 
|  |  | 
|  | echo "Compare against check files" | 
|  | cmp -s $testdir/file2 $testdir/file2.chk || echo "file2 and file2.chk do not match" | 
|  | cmp -s $testdir/file3 $testdir/file3.chk || echo "file3 and file3.chk do not match" | 
|  | cmp -s $testdir/file4 $testdir/file4.chk || echo "file4 and file4.chk do not match" | 
|  |  | 
|  | # success, all done | 
|  | status=0 | 
|  | exit |