#! /bin/bash
# FSQA Test No. 179
#
# Test for NULL files problem
# test inode size is on disk after fsync
#
#-----------------------------------------------------------------------
# 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 fsync failed
		if [ -e $file ]
		then
			# if file size is not 32KB then fsync 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 - fsync failed
			fi
		else
			echo file $file missing - fsync failed
		fi
		let i=$i+1
	done
}

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

# shutdown immediately after, then remount and test
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
