#! /bin/bash
# FSQA Test No. 182
#
# Test for NULL files problem
# test inode size is on disk after sync - expose log replay bug
#
#-----------------------------------------------------------------------
# Copyright (c) 2006 Silicon Graphics, Inc.  All Rights Reserved.
#
# 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
#
#-----------------------------------------------------------------------
#
# creator
owner=lachlan@sgi.com

seq=`basename $0`
echo "QA output created by $seq"

here=`pwd`
tmp=/tmp/$$
status=1    # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15

_cleanup()
{
    _cleanup_testdir
}

# get standard environment, filters and checks
. ./common.rc
. ./common.filter

# real QA test starts here
_supported_fs xfs
_supported_os Linux IRIX

_setup_testdir
_require_scratch
_scratch_mkfs_xfs >/dev/null 2>&1
_scratch_mount

_check_files()
{
	# check file size and contents
	i=1;
	while [ $i -lt 1000 ]
	do
		file=$SCRATCH_MNT/$i
		# if file is missing then sync failed
		if [ -e $file ]
		then
			# if file size is not 32KB then sync failed
			if [ `ls -l $file | tr -s ' ' | cut -d ' ' -f 5` -eq 32768 ]
			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
				else
					rm -f $file
				fi
			else
				echo file $file has incorrect size - sync failed
			fi
		else
			echo file $file missing - sync failed
		fi
		let i=$i+1
	done
}

# create files and sync them
i=1;
while [ $i -lt 1000 ]
do
	file=$SCRATCH_MNT/$i
	xfs_io -f -c "pwrite -b 32k -S 0xff 0 32k" $file > /dev/null
	if [ $? -ne 0 ]
	then
		echo error creating/writing file $file
		exit
	fi
	let i=$i+1
done

# sync, then shutdown immediately after, then remount and test
sync
src/godown $SCRATCH_MNT
umount $SCRATCH_MNT
_scratch_mount
umount $SCRATCH_MNT
if [ ! _check_scratch_fs ]
then
	echo error detected in filesystem
	exit
fi
_scratch_mount
_check_files

status=0
exit
