xfs: force file creation to the data device for certain layout tests
[xfstests-dev.git] / tests / xfs / 139
index bb5ea2c38e5dd420d33e5a6a8a3a9328d6ed84a9..58b717110af597deb80d4cd6880e7f73e543c542 100755 (executable)
@@ -1,31 +1,14 @@
 #! /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
-seqres=$RESULT_DIR/$seq
-seqres=$RESULT_DIR/$seq
 echo "QA output created by $seq"
 
 here=`pwd`
@@ -35,84 +18,53 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
 
 _cleanup()
 {
-    _cleanup_testdir
+    cd /
+    rm -rf $tmp.* $testdir
 }
 
 # get standard environment, filters and checks
-. ./common.rc
-. ./common.filter
+. ./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
 
-_setup_testdir
-_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