#! /bin/bash
-# FSQA Test No. 139
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved.
#
-# Test for NULL files problem
+# FS QA Test No. 139
#
-#-----------------------------------------------------------------------
-# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
+# Try to ENOSPC while expanding the refcntbt by CoWing every block
+# of a file that eats the whole AG.
#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it would be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-#
-#-----------------------------------------------------------------------
-#
-
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
-trap "exit \$status" 0 1 2 3 15
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+ cd /
+ rm -rf $tmp.* $testdir
+}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
+. ./common/reflink
# real QA test starts here
-_supported_fs xfs
-_supported_os Linux IRIX
+# Below agsize (16384 * $blksz) is too small for a large fs, and it's not
+# necessary to test on large fs
+_require_no_large_scratch_dev
+_require_scratch_reflink
+_require_cp_reflink
+
+rm -f $seqres.full
-_require_scratch
-_scratch_mkfs_xfs >/dev/null 2>&1
+_scratch_mkfs >/dev/null 2>&1
_scratch_mount
+_xfs_force_bdev data $SCRATCH_MNT
+blksz=$(_get_file_block_size $SCRATCH_MNT)
+_scratch_unmount
-# create files
-i=1;
-while [ $i -lt 1000 ]
-do
- file=$SCRATCH_MNT/$i
- xfs_io -f -c "pwrite -b 64k -S 0xff 0 64k" $file > /dev/null
- if [ $? -ne 0 ]
- then
- echo error creating/writing file $file
- exit
- fi
- xfs_io -c "truncate 32k" $file > /dev/null
- if [ $? -ne 0 ]
- then
- echo error truncating file $file
- exit
- fi
- let i=$i+1
-done
+echo "Format and mount"
+_scratch_mkfs -d agsize=$((16384 * $blksz)) > $seqres.full 2>&1
+_scratch_mount >> $seqres.full 2>&1
+_xfs_force_bdev data $SCRATCH_MNT
-# give the system a chance to write something out
-sleep 10
+testdir=$SCRATCH_MNT/test-$seq
+mkdir $testdir
-src/godown $SCRATCH_MNT
+echo "Create the original files"
+sz=$((20480 * $blksz))
+_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
+_cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
+_scratch_cycle_mount
-umount $SCRATCH_MNT
-_scratch_mount
-umount $SCRATCH_MNT
-if [ ! _check_scratch_fs ]
-then
- echo error detected in filesystem
- exit
-fi
-_scratch_mount
+echo "CoW every other block"
+_pwrite_byte 0x62 0 $sz $testdir/file1 >> $seqres.full
+_scratch_cycle_mount
-# check file size and contents
-i=1;
-while [ $i -lt 1000 ]
-do
- file=$SCRATCH_MNT/$i
- # if file does not exist, the create was not logged, skip it
- if [ -e $file ]
- then
- # if file size is zero it cannot be corrupt, skip it
- if [ -s $file ]
- then
- # if file has non-zero size but no extents then it's contents will be NULLs, bad.
- if xfs_bmap $file | grep 'no extents' > /dev/null
- then
- echo corrupt file $file - non-zero size but no extents
- elif xfs_bmap $file | grep 'hole' > /dev/null
- then
- echo corrupt file $file - contains holes
- else
- rm -f $file
- fi
- else
- rm -f $file
- fi
- fi
- let i=$i+1
-done
+echo "Compare files"
+od -t x1 $testdir/file1 | _filter_od
+od -t x1 $testdir/file2 | _filter_od
+#filefrag -v $testdir/file1 $testdir/file2
+# success, all done
status=0
-exit
+exit