#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2019 SUSE Linux Products GmbH. All Rights Reserved. # # FSQA Test No. 562 # # Test that if we clone a file with some large extents into a file that has # many small extents, when the fs is nearly full, the clone operation does # not fail and produces the correct result. # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / rm -f $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/reflink # real QA test starts here _supported_fs generic _supported_os Linux _require_scratch_reflink _require_test_program "punch-alternating" _require_xfs_io_command "fpunch" rm -f $seqres.full _scratch_mkfs_sized $((512 * 1024 * 1024)) >>$seqres.full 2>&1 _scratch_mount file_size=$(( 200 * 1024 * 1024 )) # 200Mb # Create a file with many small extents. $XFS_IO_PROG -f -c "pwrite -S 0xe5 -b $file_size 0 $file_size" \ $SCRATCH_MNT/foo >>/dev/null $here/src/punch-alternating $SCRATCH_MNT/foo >> $seqres.full # Create file bar with the same size that file foo has but with large extents. $XFS_IO_PROG -f -c "pwrite -S 0xc7 -b $file_size 0 $file_size" \ $SCRATCH_MNT/bar >>/dev/null # Fill the fs (For btrfs we are interested in filling all unallocated space # and most of the existing metadata block group(s), so that after this there # will be no unallocated space and metadata space will be mostly full but with # more than enough free space for the clone operation below to succeed, we # create files with 2Kb because that results in extents inlined in the metadata # (btree leafs) and it's the fastest way to fill metadata space on btrfs, by # default btrfs inlines up to 2Kb of data). i=1 while true; do $XFS_IO_PROG -f -c "pwrite 0 2K" $SCRATCH_MNT/filler_$i &> /dev/null [ $? -ne 0 ] && break i=$(( i + 1 )) done # Now clone file bar into file foo. This is supposed to succeed and not fail # with ENOSPC for example. _reflink $SCRATCH_MNT/bar $SCRATCH_MNT/foo >>$seqres.full # Unmount and mount the filesystem again to verify the operation was durably # persisted. _scratch_cycle_mount echo "File foo data after cloning and remount:" od -A d -t x1 $SCRATCH_MNT/foo status=0 exit