#! /bin/bash
# FS QA Test No. generic/320
#
# heavy rm workload
#
# Regression test for commit:
# 9a3a5da xfs: check for stale inode before acquiring iflock on push
#
# Based on generic/273
#
#-----------------------------------------------------------------------
# Copyright (c) 2011-2012 Fujitsu, Inc.  All Rights Reserved.
# Copyright (c) 2013 Red Hat, 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
#
#-----------------------------------------------------------------------
#

seq=`basename $0`
seqres=$RESULT_DIR/$seq
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()
{
	cd /
	rm -rf $tmp.*
}

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

# real QA test starts here
_supported_fs generic
_supported_os Linux
_require_scratch

threads=100
count=2
fs_size=$((2 * 1024 * 1024 * 1024))
ORIGIN=$SCRATCH_MNT/origin

threads_set()
{
	threads=$((LOAD_FACTOR * 100))
	if [ $threads -gt 200 ]
	then
		threads=200
	fi
}

file_create()
{
	i=0
	mkdir $ORIGIN

	disksize=$(($fs_size / 3))
	num=$(($disksize / $count / $threads / 4096))
	while [ $i -lt $num ]; do
		$XFS_IO_PROG -f -c "pwrite 0 $((4096*count))" \
			$ORIGIN/file_$i >>$seqres.full 2>&1
		i=$(($i + 1))
	done
}

worker()
{
	suffix=$1

	mkdir $SCRATCH_MNT/sub_$suffix

	cp -r $ORIGIN/* $SCRATCH_MNT/sub_$suffix >>$seqres.full 2>&1
	rm -rf $SCRATCH_MNT/sub_$suffix
}

do_workload()
{
	pids=""
	loop=1

	threads_set
	file_create

	while [ $loop -lt $threads ]; do
		worker $loop &
		pids="$pids $!"
		loop=$(($loop + 1))
	done

	wait $pids
}

echo "Silence is golden"

rm -f $seqres.full

_scratch_mkfs_sized $fs_size >>$seqres.full 2>&1
_scratch_mount >>$seqres.full 2>&1

do_workload

status=0
exit
