#!/bin/bash

# Check if scsi_debug module was built or not
export kernel=$(uname -r)

ls /lib/modules/$kernel/kernel/drivers/scsi | grep scsi_debug > /dev/null 2>&1
if [ $? -ne 0 ];
then
	echo "scsi_debug was not built in the kernel as a module"
	echo "Build scsi_debug as a module first before running the test"
fi

# Unload scsi_debug moudle if it was already loaded:
lsmod | grep scsi_debug > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "The scsi_debug module was already loaded, unload it before test..."
	rmmod -f scsi_debug
fi
lsmod | grep scsi_debug > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "The scsi_debug module was not unloaded - unload error"
else
        echo "The scsi_debug module was unloaded successfully"
	echo "start testing..."
fi

orig_count=$(cat /proc/partitions | wc -l)

echo " Load the scsi_debug module..."
modprobe scsi_debug
if [ $? -ne 0 ];
then
        echo "Can't load scsi_debug modules"
	exit
fi

echo "Check if scsi_debug was loaded..."
lsmod | grep scsi_debug > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "scsi_debug module was loaded successfully"
else
	echo "scsi_debug module was not loaded"
	exit
fi


echo "Remove the scsi_debug device..."
dev_name=$(ls /proc/scsi/scsi_debug)
# echo $dev_name
rm_dev=$dev_name:0:0:0
# echo $rm_dev
echo 1 > /sys/class/scsi_device/$rm_dev/device/delete

echo "Check if the scsi_debug device was removed..."
ls /sys/class/scsi_device | grep $rm_dev > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "The device was not removed - remove error"
else
	echo "The device $dev_name was removed successfully"
fi

echo "Add the device back..."
echo "0 0 0" > /sys/class/scsi_host/host$dev_name/scan
ls /sys/class/scsi_device | grep $rm_dev > /dev/null 2>&1
if [ $? -ne 0 ];
then
        echo "The device was not added - add device error"
else
        echo "The device $dev_name was added back successfully"
fi

echo "Add a new host..."
echo 1 > /sys/bus/pseudo/drivers/scsi_debug/add_host
num_host=$(cat /sys/bus/pseudo/drivers/scsi_debug/add_host)
if [ $num_host -ne 2 ];
then
	echo "The new host was not added - add host error"
else
	echo "The new host was added successfully"
fi

echo "Romove hosts..."
echo -2 > /sys/bus/pseudo/drivers/scsi_debug/add_host
num_host=$(cat /sys/bus/pseudo/drivers/scsi_debug/add_host)
if [ $num_host -ne 0 ];
then
        echo "The hosts were not removed - remove hosts error"
else
	echo "The hosts were removed successfully"
fi

echo "Unload scsi_debug moudle..."
rmmod -f scsi_debug
lsmod | grep scsi_debug > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "The scsi_debug module was not unloaded - unload error"
else
        echo "The scsi_debug module was unloaded successfully"
fi

echo "Load scsi_debug with multiple hosts..."
modprobe scsi_debug max_luns=2 num_tgts=2 add_host=2 dev_size_mb=20
lsmod | grep scsi_debug > /dev/null 2>&1
if [ $? -eq 0 ];
then
        echo "The multiple scsi_debug modules were loaded successfully"
else
        echo "The multiple scsi_debug modules were not loaded - load error"
fi

echo "Check if modules were loaded as required by premeters..."
max_luns=$(cat /sys/bus/pseudo/drivers/scsi_debug/max_luns)
add_host=$(cat /sys/bus/pseudo/drivers/scsi_debug/add_host)
num_tgts=$(cat /sys/bus/pseudo/drivers/scsi_debug/num_tgts)
# echo "max_lunx is $max_luns"
# echo "add_host is $add_host"
# echo "num_tgts is $num_tgts"

premeter_err_ct=0;

if [ $max_luns -ne 2 ];
then
	echo "max_luns was not correct"
	premeter_err_ct=$premeter_err_ct+1;
fi
if [ $add_host -ne 2 ];
then
        echo "add_host was not correct"
	premeter_err_ct=$premeter_err_ct+1;
fi
if [ $num_tgts -ne 2 ];
then
        echo "num_tgts was not correct"
	premeter_err_ct=$premeter_err_ct+1;
fi
if [ $premeter_err_ct -eq 0 ];
then
	echo "multiple scsi_debug was loaded as required premeters"
else
	echo "multip.e scsi_debug was not loaded as required premeters"
fi
echo "scsi_debug first part of test has been done."

echo "Now we are doing fs test for scsi_debug driver..."

cd `dirname $0`
export LTPROOT=${PWD}
echo $LTPROOT | grep testscripts > /dev/null 2>&1
if [ $? -eq 0 ]; then
 cd ..
 export LTPROOT=${PWD}
fi

export TMPBASE="/tmp"

# check if the newly created scsi_debug partitions are in /proc/partitions file
check_count=$(cat /proc/partitions | wc -l)
save_count=$(( $check_count - $orig_count ))
if [ $save_count -lt 4 ]; then
	echo "Not enough scsi_debug partitions to run the test"
	exit
fi

# Get the 4 partitions created by scsi_debug for testing
cat /proc/partitions | awk '{print $4}' | tail -n 4 > $TMPBASE/partition-test
echo "The 4 partitions used to run the test are:"
part1=$(cat $TMPBASE/partition-test | tail -n 1)
echo $part1
part2=$(cat $TMPBASE/partition-test | head -n 3 | tail -n 1)
echo $part2
part3=$(cat $TMPBASE/partition-test | head -n 2 | tail -n 1)
echo $part3
part4=$(cat $TMPBASE/partition-test | head -n 1)
echo $part4

export PATH="${PATH}:${LTPROOT}/testcases/bin"

mkdir /test                   >/dev/null 2>&1
mkdir /test/growfiles         >/dev/null 2>&1
mkdir /test/growfiles/ext2    >/dev/null 2>&1
mkdir /test/growfiles/ext3    >/dev/null 2>&1
mkdir /test/growfiles/reiser  >/dev/null 2>&1
mkdir /test/growfiles/msdos     >/dev/null 2>&1

echo "----- make ext3 fs -----"
mkfs -V -t ext3     /dev/$part1
echo "----- make ext2 fs -----"
mkfs -V -t ext2	    /dev/$part2
echo "----- make reiserfs fs -----"
mkreiserfs -f          /dev/$part3
echo "----- make msdos fs -----"
mkfs -V -t msdos -I     /dev/$part4

echo "----- Mount partitions -----"
mount /dev/$part1 /test/growfiles/ext3
mount /dev/$part2 /test/growfiles/ext2
mount /dev/$part3 /test/growfiles/reiser
mount /dev/$part4 /test/growfiles/msdos

echo "----- Running tests ----- "
echo "The test may take about 2 hours to finish..."
${LTPROOT}/bin/rand_lines -g ${LTPROOT}/runtest/scsi_debug.part1 > ${TMPBASE}/scsi_debug

${LTPROOT}/bin/ltp-pan -e -S -a scsi_debug -n scsi_debug -l ${TMPBASE}/fs-scsi_debug.log -o ${TMPBASE}/fs-scsi_debug.out -f ${TMPBASE}/scsi_debug

wait $!

umount -v /dev/$part1
umount -v /dev/$part2
umount -v /dev/$part3
umount -v /dev/$part4

echo "Look into /tmp/fs-scsi_debug.log and /tmp/fs-scsi_debug.out for detail results..."
