diff --git a/lustre-iokit/mds-survey/mds-survey b/lustre-iokit/mds-survey/mds-survey
index dd3eaa0c32c11444fda029ff9514b13e50df6785..7bde56290da75b22f6d3943f93d70517fcd08e79 100755
--- a/lustre-iokit/mds-survey/mds-survey
+++ b/lustre-iokit/mds-survey/mds-survey
@@ -1,6 +1,4 @@
 #!/bin/bash
-# -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*-
-# vim:shiftwidth=4:softtabstop=4:tabstop=4:
 
 ######################################################################
 # customize per survey
@@ -9,12 +7,12 @@
 #
 # How to run test:
 # case 1 (stripe_count=0 default):
-#   $ thrhi=8 dir_count=4 sh mds-survey
-#   one can also run test with user defined targets as follows,
-#   $ thrhi=8 dir_count=4 file_count=50000 targets="lustre-MDT0000" sh mds-survey
+#  $ thrhi=8 dir_count=4 sh mds-survey
+#  one can also run test with user defined targets as follows,
+#  $ thrhi=8 dir_count=4 file_count=50000 targets="lustre-MDT0000" sh mds-survey
 # case 2 (stripe_count > 0, must have ost mounted):
-#   $ thrhi=8 dir_count=4 file_count=50000 stripe_count=2
-#   targets="lustre-MDT0000" sh mds-survey
+#  $ thrhi=8 dir_count=4 file_count=50000 stripe_count=2
+#  targets="lustre-MDT0000" sh mds-survey
 # [ NOTE: It is advised to have automated login (passwordless entry) on server ]
 
 # include library
@@ -58,159 +56,194 @@ basedir="tests"
 mdtbasedir="MDT%04x-"
 
 create_directories () {
-    local host=$1
-    local devno=$2
-    local ndir=$3
-    local rfile=$4
-    local mdtidx=$5
-    local idx
+	local host=$1
+	local devno=$2
+	local ndir=$3
+	local rfile=$4
+	local mdtidx=$5
+	local idx
 
-    for ((idx = 0; idx < $ndir; idx++)); do
-        if (( idx == 0 )); then
-            dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}"
-        else
-            dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}${idx}"
-        fi
-        remote_shell $host $lctl --device $devno test_mkdir /$dirname > $rfile 2>&1
-        while read line; do
-            echo "$line" | grep -q 'error: test_mkdir'
-            if [ $?  -eq 0 ]; then
-                cat $rfile >&2
-                echo "ERROR: fail test_mkdir" >&2
-                echo "ERROR"
-                return
-            fi
-        done < $rfile
-    done
-    echo $basedir
+	for ((idx = 0; idx < $ndir; idx++)); do
+		if (( idx == 0 )); then
+			dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}"
+		else
+			dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}${idx}"
+		fi
+		remote_shell $host $lctl --device $devno test_mkdir /$dirname > $rfile 2>&1
+		while read line; do
+			echo "$line" | grep -q 'error: test_mkdir'
+			if [ $?  -eq 0 ]; then
+				cat $rfile >&2
+				echo "ERROR: fail test_mkdir" >&2
+				echo "ERROR"
+				return
+			fi
+		done < $rfile
+	done
+	echo $basedir
 }
 
 destroy_directories () {
-    local host=$1
-    local devno=$2
-    local ndir=$3
-    local rfile=$4
-    local mdtidx=$5
-    local idx
+	local host=$1
+	local devno=$2
+	local ndir=$3
+	local rfile=$4
+	local mdtidx=$5
+	local idx
 
-    for ((idx = 0; idx < $ndir; idx++)); do
-        if (( idx == 0 )); then
-            dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}"
-        else
-            dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}${idx}"
-        fi
-        remote_shell $host $lctl --device $devno test_rmdir /$dirname > $rfile 2>&1
-    done
+	for ((idx = 0; idx < $ndir; idx++)); do
+		if (( idx == 0 )); then
+			dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}"
+		else
+			dirname="$(printf "${mdtbasedir}" $mdtidx)${basedir}${idx}"
+		fi
+		remote_shell $host $lctl --device $devno test_rmdir /$dirname > $rfile 2>&1
+	done
 }
 
 get_stats () {
-    local rfile=$1
-    gawk < $rfile                                                               \
-    '/starting/ { n=0; next }                                                   \
-     /error/ {n = -1; exit}                                                     \
-     /^Total: total [0-9]+ threads [0-9]+ sec [0-9\.]+ [0-9]+\.[0-9]+\/second$/ \
-     { ave = strtonum($8); n++; next}                                           \
-     /^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/                           \
-     {    n++; v = strtonum($3);                                                \
-          if (n == 1 || v < min) min = v;                                       \
-          if (n == 1 || v > max) max = v;                                       \
-          next;                                                                 \
-     }                                                                          \
-     {    if (n != 0) {n = -1; exit } }                                         \
-     END { if (n == 1) { min = ave; max = ave; }                                \
-           printf "%d %f %f %f\n", n, ave, min, max}'
+	local rfile=$1
+
+	gawk < $rfile							\
+	'/starting/ {							\
+		n = 0; next;						\
+	}								\
+	/error/ {							\
+		n = -1;							\
+		exit;							\
+	}								\
+	/^Total: total [0-9]+ threads [0-9]+ sec [0-9\.]+ [0-9]+\.[0-9]+\/second$/ { \
+		ave = strtonum($8);					\
+		n++;							\
+		next;							\
+	}								\
+	/^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/ {		\
+		n++; v = strtonum($3);					\
+		if (n == 1 || v < min) min = v;				\
+		if (n == 1 || v > max) max = v;				\
+		next;							\
+	}								\
+	{								\
+		if (n != 0) {						\
+			n = -1;						\
+			exit;						\
+		}							\
+	}								\
+	END {								\
+		if (n == 1) {						\
+			min = ave;					\
+			max = ave;					\
+		}							\
+		printf "%d %f %f %f\n", n, ave, min, max		\
+	}'
 }
 
 get_global_stats () {
-    local rfile=$1
-    awk < $rfile                                               \
-    'BEGIN {n = 0;}                                            \
-    {    n++;                                                  \
-         if (n == 1) { err = $1; ave = $2; min = $3; max = $4} \
-         else                                                  \
-         { if ($1 < err) err = $1;                             \
-           ave += $2;                                          \
-           if ($3 < min) min = $3;                             \
-           if ($4 > max) max = $4;                             \
-         }                                                     \
-    }                                                          \
-    END { if (n == 0) err = 0;                                 \
-          printf "%d %f %f %f\n", err, ave/n, min, max}'
+	local rfile=$1
+
+	awk < $rfile							\
+	'BEGIN {							\
+		n = 0;							\
+	}								\
+	{								\
+		n++;							\
+		if (n == 1) {						\
+			err = $1;					\
+			ave = $2;					\
+			min = $3;					\
+			max = $4;					\
+		} else {						\
+			if ($1 < err)					\
+				err = $1;				\
+			ave += $2;					\
+			if ($3 < min)					\
+				min = $3;				\
+			if ($4 > max)					\
+				max = $4;				\
+		}							\
+	}								\
+	END {								\
+		if (n == 0)						\
+			err = 0;					\
+		printf "%d %f %f %f\n", err, ave/n, min, max		\
+	}'
 }
 
 print_summary () {
-    if [ "$1" = "-n" ]; then
-        minusn=$1; shift
-    else
-        minusn=""
-    fi
-    echo $minusn "$*" >> $rsltf
-    echo $minusn "$*"
+	if [ "$1" = "-n" ]; then
+		minusn=$1; shift
+	else
+		minusn=""
+	fi
+	echo $minusn "$*" >> $rsltf
+	echo $minusn "$*"
 }
 
 declare -a tests
 count=0
 for name in $tests_str; do
-    tests[$count]=$name
-    count=$((count+1))
+	tests[$count]=$name
+	count=$((count+1))
 done
 
 # hide a little trick to unset this from the command line
 if [ "$lustre_root" == " " ]; then
-    unset lustre_root
+	unset lustre_root
 fi
 
 if [ -z "$lustre_root" ]; then
-    lctl=lctl
+	lctl=lctl
 else
-    lctl=${lustre_root}/utils/lctl
+	lctl=${lustre_root}/utils/lctl
 fi
 
 declare -a client_names
 declare -a host_names
 declare -a client_indexes
 if [ -z "$targets" ]; then
-    targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
-            \$3 == \"mdt\") {print \$4} }")
-    if [ -z "$targets" ]; then
-        echo "Can't find any MDT to test.  Please set targets=..."
-        exit 1
-    fi
+	targets=$($lctl device_list | awk "{if (\$2 == \"UP\" && \
+					       \$3 == \"mdt\") {print \$4} }")
+	if [ -z "$targets" ]; then
+		echo "Can't find any MDT to test.  Please set targets=..."
+		exit 1
+	fi
 fi
 
 # split out hostnames from mdt names
 ndevs=0
 for trgt in $targets; do
-    str=(`split_hostname $trgt`)
-    host_names[$ndevs]=${str[0]}
-    client_names[$ndevs]=${str[1]}
-    client_indexes[$ndevs]=0x$(echo ${str[1]} |
-            sed 's/.*MDT\([0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*/\1/')
-    ndevs=$((ndevs+1))
+	str=($(split_hostname $trgt))
+	host_names[$ndevs]=${str[0]}
+	client_names[$ndevs]=${str[1]}
+	client_indexes[$ndevs]=0x$(echo ${str[1]} |
+		sed 's/.*MDT\([0-9a-f][0-9a-f][0-9a-f][0-9a-f]\).*/\1/')
+	ndevs=$((ndevs+1))
 done
 
 # check for ost
 if (( $stripe_count > 0 )); then
-    for ((i=0; i < $ndevs; i++)); do
-        host=${host_names[$i]}
-        obd=$(remote_shell $host $lctl device_list | awk "{if (\$2 == \"UP\" &&
-            (\$3 == \"osc\" || \$3 == \"osp\")) { print \$4 } }")
-        if [ -z "$obd" ]; then
-            echo "Need obdfilter to test stripe_count"
-            exit 1
-        fi
-    done
+	for ((i=0; i < $ndevs; i++)); do
+		host=${host_names[$i]}
+		obd=$(remote_shell $host $lctl device_list |
+		      awk "{ if (\$2 == \"UP\" &&
+				 (\$3 == \"osc\" || \$3 == \"osp\"))
+				{ print \$4 } }")
+		if [ -z "$obd" ]; then
+			echo "Need obdfilter to test stripe_count"
+			exit 1
+		fi
+	done
 fi
 
 # check and insert obdecho module
 if ! lsmod | grep obdecho > /dev/null; then
-    modprobe obdecho
+	modprobe obdecho
 fi
 count=${#tests[@]}
 if [ $count -eq 0 -o "${tests[0]}" != "create" -o "${tests[(($count - 1))]}" != "destroy" ]; then
-    echo "tests: ${tests[@]}"
-    echo "First test must be 'create', and last test must be 'destroy'" 1>&2
-    exit 1
+	echo "tests: ${tests[@]}"
+	echo "First test must be 'create', and last test must be 'destroy'" 1>&2
+	exit 1
 fi
 
 rsltf="${rslt}.summary"
@@ -222,147 +255,150 @@ echo -n > $workf
 
 # get vmstat started
 # disable portals debug and get obdecho loaded on all relevant hosts
-unique_hosts=(`unique ${host_names[@]}`)
+unique_hosts=($(unique ${host_names[@]}))
 load_obdechos
 pidcount=0
 for host in ${unique_hosts[@]}; do
-    host_vmstatf=${vmstatf}_${host}
-    echo -n > $host_vmstatf
-    remote_shell $host "vmstat 5 >> $host_vmstatf" &> /dev/null &
-    pid=$!
-    vmstatpids[$pidcount]=$pid
-    pidcount=$((pidcount+1))
+	host_vmstatf=${vmstatf}_${host}
+	echo -n > $host_vmstatf
+	remote_shell $host "vmstat 5 >> $host_vmstatf" &> /dev/null &
+	pid=$!
+	vmstatpids[$pidcount]=$pid
+	pidcount=$((pidcount+1))
 done
 # get all the echo_client device numbers and names
 for ((i=0; i < $ndevs; i++)); do
-    host=${host_names[$i]}
-    devno=(`get_ec_devno $host "${client_names[$i]}" "${client_names[$i]}" "mdt" $layer`)
-    if ((${#devno[@]} != 3)); then
-        exit 1
-    fi
-    devnos[$i]=${devno[0]}
-    client_names[$i]=${devno[1]}
-    do_teardown_ec[$i]=${devno[2]}
+	host=${host_names[$i]}
+	devno=($(get_ec_devno $host "${client_names[$i]}" "${client_names[$i]}" "mdt" $layer))
+	if ((${#devno[@]} != 3)); then
+		exit 1
+	fi
+	devnos[$i]=${devno[0]}
+	client_names[$i]=${devno[1]}
+	do_teardown_ec[$i]=${devno[2]}
 done
 if (($ndevs <= 0 || ${#host_names[@]} <= 0)); then
-    echo "no devices or hosts specified"
-    cleanup 0
+	echo "no devices or hosts specified"
+	cleanup 0
 fi
 print_summary "$(date) $0 from $(hostname)"
 # create directories
 tmpf="${workf}_tmp"
 for ((idx = 0; idx < $ndevs; idx++)); do
-    host=${host_names[$idx]}
-    devno=${devnos[$idx]}
-    client_name="${host}:${client_names[$idx]}"
-    mdtidx=${client_indexes[$idx]}
-    echo "=============> Create $dir_count directories on $client_name" >> $workf
-    destroy_directories $host $devno $dir_count $tmpf $mdtidx
-    ret=`create_directories $host $devno $dir_count $tmpf $mdtidx`
-    cat $tmpf >> $workf
-    rm $tmpf
-    if [ $ret = "ERROR" ]; then
-        print_summary "created directories on $client_name failed"
-        cleanup 1
-    fi
+	host=${host_names[$idx]}
+	devno=${devnos[$idx]}
+	client_name="${host}:${client_names[$idx]}"
+	mdtidx=${client_indexes[$idx]}
+	echo "=======> Create $dir_count directories on $client_name" >> $workf
+	destroy_directories $host $devno $dir_count $tmpf $mdtidx
+	ret=$(create_directories $host $devno $dir_count $tmpf $mdtidx)
+	cat $tmpf >> $workf
+	rm $tmpf
+	if [ $ret = "ERROR" ]; then
+		print_summary "created directories on $client_name failed"
+		cleanup 1
+	fi
 done
 
 snap=1
 status=0
 for ((thr = $thrlo; thr <= $thrhi; thr*=2)); do
-    thr_per_dir=$((${thr}/${dir_count}))
-    # skip if no enough thread
-    if (( thr_per_dir <= 0 )); then
-        continue
-    fi
-    file_count_per_thread=$((${file_count}/${thr}))
-    str=`printf 'mdt %1d file %7d dir %4d thr %4d ' \
-    $ndevs $file_count $dir_count $thr`
-    echo "=======================> $str" >> $workf
-    print_summary -n "$str"
-    # run tests
-    for test in ${tests[@]}; do
-        declare -a pidarray
-        for host in ${unique_hosts[@]}; do
-            echo "starting run for config: $config test: $test file: \
-            $file_count threads: $thr directories: $dir_count" >> ${vmstatf}_${host}
-        done
-        print_summary -n "$test "
-        # create per-host script files
-        for host in ${unique_hosts[@]}; do
-            echo -n > ${cmdsf}_${host}
-        done
-        for ((idx = 0; idx < $ndevs; idx++)); do
-            host=${host_names[$idx]}
-            devno=${devnos[$idx]}
-            dirname="$(printf "${mdtbasedir}" ${client_indexes[$idx]})$basedir"
-            tmpfi="${tmpf}_$idx"
-            [ "$test" = "create" ] && test="create -c $stripe_count"
-            echo >> ${cmdsf}_${host}                                                     \
-                "$lctl > $tmpfi 2>&1                                                     \
-                 --threads $thr -$snap $devno test_$test -d /$dirname -D $dir_count      \
-                 -b $start_number -n $file_count_per_thread"
-        done
-        pidcount=0
-        for host in ${unique_hosts[@]}; do
-            echo "wait" >> ${cmdsf}_${host}
-            pidarray[$pidcount]=0
-            pidcount=$((pidcount+1))
-        done
-        pidcount=0
-        for host in ${unique_hosts[@]}; do
-            remote_shell $host bash < ${cmdsf}_${host} &
-            pidarray[$pidcount]=$!
-            pidcount=$((pidcount+1))
-        done
-        pidcount=0
-        for host in ${unique_hosts[@]}; do
-            wait ${pidarray[$pidcount]}
-            pidcount=$((pidcount+1))
-        done
-        #wait
-        # clean up per-host script files
-        for host in ${unique_hosts[@]}; do
-            rm ${cmdsf}_${host}
-        done
+	thr_per_dir=$((${thr}/${dir_count}))
+	# skip if no enough thread
+	if (( thr_per_dir <= 0 )); then
+		continue
+	fi
+	file_count_per_thread=$((${file_count}/${thr}))
+	str=$(printf 'mdt %1d file %7d dir %4d thr %4d ' \
+	      $ndevs $file_count $dir_count $thr)
+	echo "=======> $str" >> $workf
+	print_summary -n "$str"
+	# run tests
+	for test in ${tests[@]}; do
+		declare -a pidarray
+		for host in ${unique_hosts[@]}; do
+			echo "starting run for config: $config test: $test " \
+			     "file: $file_count threads: $thr " \
+			     "directories: $dir_count" >> ${vmstatf}_${host}
+		done
+		print_summary -n "$test "
+		# create per-host script files
+		for host in ${unique_hosts[@]}; do
+			echo -n > ${cmdsf}_${host}
+		done
+		for ((idx = 0; idx < $ndevs; idx++)); do
+			host=${host_names[$idx]}
+			devno=${devnos[$idx]}
+			dirname="$(printf "${mdtbasedir}" ${client_indexes[$idx]})$basedir"
+			tmpfi="${tmpf}_$idx"
+			[ "$test" = "create" ] && test="create -c $stripe_count"
+			echo >> ${cmdsf}_${host}			\
+				"$lctl > $tmpfi 2>&1			\
+				--threads $thr -$snap $devno test_$test \
+				-d /$dirname -D $dir_count		\
+				-b $start_number -n $file_count_per_thread"
+		done
+		pidcount=0
+		for host in ${unique_hosts[@]}; do
+			echo "wait" >> ${cmdsf}_${host}
+			pidarray[$pidcount]=0
+			pidcount=$((pidcount+1))
+		done
+		pidcount=0
+		for host in ${unique_hosts[@]}; do
+			remote_shell $host bash < ${cmdsf}_${host} &
+			pidarray[$pidcount]=$!
+			pidcount=$((pidcount+1))
+		done
+		pidcount=0
+		for host in ${unique_hosts[@]}; do
+			wait ${pidarray[$pidcount]}
+			pidcount=$((pidcount+1))
+		done
+		#wait
+		# clean up per-host script files
+		for host in ${unique_hosts[@]}; do
+			rm ${cmdsf}_${host}
+		done
 
-        # collect/check individual MDT stats
-        echo -n > $tmpf
-        for ((idx = 0; idx < $ndevs; idx++)); do
-            client_name="${host_names[$idx]}:${client_names[$idx]}"
-            tmpfi="${tmpf}_$idx"
-            echo "=============> $test $client_name" >> $workf
-            host="${host_names[$idx]}"
-            remote_shell $host cat $tmpfi > ${tmpfi}_local
-            cat ${tmpfi}_local >> $workf
-            get_stats ${tmpfi}_local >> $tmpf
-            rm -f $tmpfi ${tmpfi}_local
-        done
-        # compute/display global min/max stats
-        echo "=============> $test global" >> $workf
-        cat $tmpf >> $workf
-        stats=(`get_global_stats $tmpf`)
-        rm $tmpf
-        if ((stats[0] <= 0)); then
-            str=`printf "%17s " ERROR`
-            status=1
-        else
-            str=`awk "BEGIN {printf \"%7.2f [ %7.2f, %7.2f] \", \
-            ${stats[1]}, ${stats[2]}, ${stats[3]}; exit}"`
-        fi
-        print_summary -n "$str"
-    done
-    print_summary ""
+		# collect/check individual MDT stats
+		echo -n > $tmpf
+		for ((idx = 0; idx < $ndevs; idx++)); do
+			client_name="${host_names[$idx]}:${client_names[$idx]}"
+			tmpfi="${tmpf}_$idx"
+			echo "=============> $test $client_name" >> $workf
+			host="${host_names[$idx]}"
+			remote_shell $host cat $tmpfi > ${tmpfi}_local
+			cat ${tmpfi}_local >> $workf
+			get_stats ${tmpfi}_local >> $tmpf
+			rm -f $tmpfi ${tmpfi}_local
+		done
+		# compute/display global min/max stats
+		echo "=============> $test global" >> $workf
+		cat $tmpf >> $workf
+		stats=($(get_global_stats $tmpf))
+		rm $tmpf
+		if ((stats[0] <= 0)); then
+			str=$(printf "%17s " ERROR)
+			status=1
+		else
+			str=$(awk "BEGIN {printf \"%7.2f [ %7.2f, %7.2f] \", \
+			      ${stats[1]}, ${stats[2]}, ${stats[3]}; exit}")
+		fi
+		print_summary -n "$str"
+	done
+	print_summary ""
 done
+
 # destroy directories
 tmpf="${workf}_tmp"
 for ((idx = 0; idx < $ndevs; idx++)); do
-    host=${host_names[$idx]}
-    devno=${devnos[$idx]}
-    mdtidx=${client_indexes[$idx]}
-    client_name="${host}:${client_names[$idx]}"
-    echo "=============> Destroy $dir_count directories on $client_name" >> $workf
-    destroy_directories $host $devno $dir_count $tmpf $mdtidx
+	host=${host_names[$idx]}
+	devno=${devnos[$idx]}
+	mdtidx=${client_indexes[$idx]}
+	client_name="${host}:${client_names[$idx]}"
+	echo "====> Destroy $dir_count directories on $client_name" >> $workf
+	destroy_directories $host $devno $dir_count $tmpf $mdtidx
 done
 
 cleanup $status
diff --git a/lustre-iokit/obdfilter-survey/obdfilter-survey b/lustre-iokit/obdfilter-survey/obdfilter-survey
index c65193ed29bc13e06af32a58fb2869b9b264caed..1dc00db8f776428c6a9cf319565a2f94b53d2a78 100755
--- a/lustre-iokit/obdfilter-survey/obdfilter-survey
+++ b/lustre-iokit/obdfilter-survey/obdfilter-survey
@@ -11,12 +11,12 @@ set -e
 # ... use 'host:name' for obd instances on other nodes.
 # allow these to be passed in via string...
 # OR
-# one can specify only case=disk or case=network or case=netdisk through 
+# one can specify only case=disk or case=network or case=netdisk through
 # command line.
 
 # Perquisite: For "disk" case and "netdisk" case you need to have lustre setup
 #             with one or more ost's. For "network" case  you need to have all
-#             modules (those llmount.sh loades) loaded in kernel. And the 
+#             modules (those llmount.sh loades) loaded in kernel. And the
 #             'lctl dl' output must be blank.
 
 # How to run test:
@@ -26,16 +26,16 @@ set -e
 #   $ nobjhi=2 thrhi=2 size=1024 targets="lustre-OST0000 lustre-OST0001 ..." sh obdfilter-survey
 # case 2 (network):
 #   $ nobjhi=2 thrhi=2 size=1024 targets="<name/ip_of_server>" case=network sh obdfilter-survey
-#   where, targets is name or ip address of system, which you want to 
+#   where, targets is name or ip address of system, which you want to
 #   set as server.
 # case 3 (network and disk):
 #   $ nobjhi=2 thrhi=2 size=1024 case=netdisk sh obdfilter-survey
 #   one can also run test with user defined targets as follows,
 #   $ nobjhi=2 thrhi=2 size=1024 targets="<osc_name> ..." sh obdfilter-survey
-#[ NOTE: It is advised to have automated login (passwordless entry) between server and 
+#[ NOTE: It is advised to have automated login (passwordless entry) between server and
 #  client systems on which this test runs.]
 
-# include library 
+# include library
 source $(dirname $0)/iokit-libecho
 
 # The following variables can be set in the environment, or on the
@@ -43,7 +43,7 @@ source $(dirname $0)/iokit-libecho
 # result file prefix (date/time + hostname makes unique)
 # NB ensure path to it exists
 rslt_loc=${rslt_loc:-"/tmp"}
-rslt=${rslt:-"$rslt_loc/obdfilter_survey_`date +%F@%R`_`uname -n`"}
+rslt=${rslt:-"$rslt_loc/obdfilter_survey_$(date +%F@%R)_$(uname -n)"}
 
 # Set this true to check file contents
 verify=${verify:-0}
@@ -54,7 +54,7 @@ targets=${targets:-""}
 case=${case:-"disk"}
 
 # total size (MBytes) per obd instance
-# large enough to avoid cache effects 
+# large enough to avoid cache effects
 # and to make test startup/shutdown overhead insignificant
 size=${size:-16384}
 
@@ -83,116 +83,157 @@ export LC_ALL=POSIX
 #	     3. number of object to be created (specified by user)
 #	     4. tempfile name
 create_objects () {
-    local host=$1
-    local devno=$2
-    local nobj=$3
-    local rfile=$4
-    remote_shell $host $lctl --device $devno create $nobj > $rfile 2>&1
-    first=0
-    prev=0
-    count=0
-    error=0
-
-    # Count number of objects (lines containing " is object id "), and
-    # ensure that the objects numbers are sequential.
-    #
-    exec 3< $rfile
-    while read -u3 line; do
-        case "$line" in
-        ( *' is object id '* )
-            set -- $line
-            if test $(( count += 1 )) -gt 1 ; then
-                (( $6 != prev + 1 )) && error=1
-            else
-                first=$(( $6 + 0 ))
-            fi
-            prev=$6
-            ;;
-        esac
-    done
-    exec 3<&-
-
-    if [ $nobj -ne $count ]; then 
-        echo "ERROR: $nobj != $count" >&2 
-        cat $rfile >&2 
-        echo "ERROR" 
-    elif [ $error -ne 0 ]; then 
-        echo "ERROR: non contiguous objs found" >&2
-        echo ERROR
-    else 
-        echo $first 
-    fi
-    return $error
+	local host=$1
+	local devno=$2
+	local nobj=$3
+	local rfile=$4
+
+	remote_shell $host $lctl --device $devno create $nobj > $rfile 2>&1
+	first=0
+	prev=0
+	count=0
+	error=0
+
+	# Count number of objects (lines containing " is object id "), and
+	# ensure that the objects numbers are sequential.
+	#
+	exec 3< $rfile
+	while read -u3 line; do
+		case "$line" in
+		( *' is object id '* )
+		set -- $line
+		if test $(( count += 1 )) -gt 1 ; then
+			(( $6 != prev + 1 )) && error=1
+		else
+			first=$(( $6 + 0 ))
+		fi
+		prev=$6
+		;;
+		esac
+	done
+	exec 3<&-
+
+	if [ $nobj -ne $count ]; then
+		echo "ERROR: $nobj != $count" >&2
+		cat $rfile >&2
+		echo "ERROR"
+	elif [ $error -ne 0 ]; then
+		echo "ERROR: non contiguous objs found" >&2
+		echo ERROR
+	else
+		echo $first
+	fi
+	return $error
 }
 
 # destroys all objects created in create_objects routine
 # parameter: 3. start obj id.
 destroy_objects () {
-    local host=$1
-    local devno=$2
-    local obj0=$3
-    local nobj=$4
-    local rfile=$5
-    remote_shell $host $lctl --device $devno destroy $obj0 $nobj > $rfile 2>&1
+	local host=$1
+	local devno=$2
+	local obj0=$3
+	local nobj=$4
+	local rfile=$5
+
+	remote_shell $host $lctl --device $devno destroy $obj0 $nobj > $rfile 2>&1
 }
 
 get_stats () {
-    local rfile=$1
-    gawk < $rfile \
-	'/^Selected device [0-9]+$/ {n = 0; next}\
-	/error/ {n = -1; exit}\
-	/^Total/ {next}\
-	/^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/ {n++; v=strtonum($3); \
-	                                                  if (n == 1 || v < min) min = v;\
-	                                                  if (n == 1 || v > max) max = v;\
-	                                                  next}\
-        {if (n != 0) {n = -1; exit}}\
-	END {printf "%d %f %f\n", n, min, max}'
+	local rfile=$1
+
+	gawk < $rfile							\
+	'/^Selected device [0-9]+$/ {					\
+		n = 0;							\
+		next;							\
+	}								\
+	/error/ {							\
+		n = -1;							\
+		exit;							\
+	}								\
+	/^Total/ {							\
+		next;							\
+	}								\
+	/^[0-9]+\/[0-9]+ Total: [0-9]+\.[0-9]+\/second$/ {		\
+		n++;							\
+		v=strtonum($3);						\
+		if (n == 1 || v < min)					\
+			min = v;					\
+		if (n == 1 || v > max)					\
+			max = v;					\
+		next;							\
+	}								\
+	{								\
+		if (n != 0) {						\
+			n = -1;						\
+			exit;						\
+		}							\
+	}								\
+	END {								\
+		printf "%d %f %f\n", n, min, max			\
+	}'
 }
 
 get_global_stats () {
-    local rfile=$1
-    awk < $rfile 'BEGIN {n = 0;}\
-	          {n++; if (n == 1) {err = $1; min = $2; max = $3} else\
-	                            {if ($1 < err) err = $1;\
-                                     if ($2 < min) min = $2;\
-				     if ($3 > max) max = $3}}\
-	          END {if (n == 0) err = 0;\
-		       printf "%d %f %f\n", err, min, max}'
+	local rfile=$1
+
+	awk < $rfile							\
+	'BEGIN {							\
+		n = 0;							\
+	}								\
+	{								\
+		n++;							\
+		if (n == 1) {						\
+			err = $1;					\
+			min = $2;					\
+			max = $3;					\
+		} else {						\
+			if ($1 < err)					\
+				err = $1;				\
+			if ($2 < min)					\
+				min = $2;				\
+			if ($3 > max)					\
+				max = $3;				\
+		}							\
+	}								\
+	END {								\
+		if (n == 0)						\
+			err = 0;					\
+		printf "%d %f %f\n", err, min, max			\
+	}'
 }
 
 # enable or disable data check.
 # parameter: 1. read/write
 testname2type () {
-    # 'x' disables data check
-    if ((verify)); then
-	x=""
-    else
-	x="x"
-    fi
-    case $1 in
+	# 'x' disables data check
+	if ((verify)); then
+		x=""
+	else
+		x="x"
+	fi
+	case $1 in
 	*write*)  echo "w$x";;
 	*)        echo "r$x";;
-    esac
+	esac
 }
 
 # for "echo_client + obdfilter" case, "prep + commit" mode should be used
 # for "echo_client + osc" case, "BRW" mode should be used
 testcase2mode() {
-    case $case in
-    disk) echo "p";;
-    *)    echo "g";;
-    esac
+	case $case in
+	disk)	echo "p";;
+	*)	echo "g";;
+	esac
 }
 
 print_summary () {
-    if [ "$1" = "-n" ]; then
-        minusn=$1; shift
-    else
-        minusn=""
-    fi
-    echo $minusn "$*" >> $rsltf
-    echo $minusn "$*"
+	if [ "$1" = "-n" ]; then
+		minusn=$1; shift
+	else
+		minusn=""
+	fi
+	echo $minusn "$*" >> $rsltf
+	echo $minusn "$*"
 }
 
 version_code() {
@@ -226,31 +267,31 @@ check_record_size() {
 # One can change variable values in this section as per requirements
 
 if [ -n "$targets" ]; then
-    declare -a ost_names
-    declare -a client_names
-    count=0
-    for name in $targets; do
-        if [ $case == "disk" ]; then
-            ost_names[$count]=$name
-        else
-            client_names[$count]=$name
-        fi
-        count=$((count+1))
-    done
+	declare -a ost_names
+	declare -a client_names
+	count=0
+	for name in $targets; do
+		if [ $case == "disk" ]; then
+		ost_names[$count]=$name
+		else
+		client_names[$count]=$name
+		fi
+		count=$((count + 1))
+	done
 fi
 
 # what tests to run (first must be write)
 tests_str=${tests_str:-""}
 if [ -n "$tests_str" ]; then
-    declare -a tests
-    count=0
-    for name in $tests_str; do
-        tests[$count]=$name
-        count=$((count+1))
-    done
+	declare -a tests
+	count=0
+	for name in $tests_str; do
+		tests[$count]=$name
+		count=$((count + 1))
+	done
 else
-    #tests=(write rewrite read reread rewrite_again)
-    tests=(write rewrite read)
+	#tests=(write rewrite read reread rewrite_again)
+	tests=(write rewrite read)
 fi
 
 # restart from here iff all are defined
@@ -258,12 +299,8 @@ restart_rsz=
 restart_thr=1
 restart_nobj=1
 
-# machine's page size (K)
-if [ -z "$PAGE_SIZE" ]; then
-    if which python >/dev/null; then
-	PAGE_SIZE=`echo 'import resource; print resource.getpagesize()/1024;' |python`
-    fi
-fi
+# machine's page size (KB)
+PAGE_SIZE=${PAGE_SIZE:-$(($(getconf PAGE_SIZE) / 1024))}
 PAGE_SIZE=${PAGE_SIZE:-4}
 
 # max buffer_mem (total_threads * buffer size)
@@ -271,18 +308,18 @@ PAGE_SIZE=${PAGE_SIZE:-4}
 max_buffer_mem=$((1024 * 1024))
 snap=1
 clean_srv_OSS=0
-# Customisation variables ends here. 
+# Customisation variables ends here.
 #####################################################################
 # leave the rest of this alone unless you know what you're doing...
 
 # check and insert obdecho module
 if ! lsmod | grep obdecho > /dev/null; then
-    modprobe obdecho
+	modprobe obdecho
 fi
 if [ ${#tests[@]} -eq 0 -o "${tests[0]}" != "write" ]; then
-    echo "tests: ${tests[@]}"
-    echo "First test must be 'write'" 1>&2
-    exit 1
+	echo "tests: ${tests[@]}"
+	echo "First test must be 'write'" 1>&2
+	exit 1
 fi
 
 rsltf="${rslt}.summary"
@@ -294,115 +331,118 @@ echo -n > $workf
 
 # hide a little trick to unset this from the command line
 if [ "$lustre_root" == " " ]; then
-    unset lustre_root
+	unset lustre_root
 fi
 
 if [ -z "$lustre_root" ]; then
-    lctl=lctl
+	lctl=lctl
 else
-    lctl=${lustre_root}/utils/lctl
+	lctl=${lustre_root}/utils/lctl
 fi
 
 # split out hostnames from client/ost names
 ndevs=0
 for trgt in $targets; do
-    str=(`split_hostname $trgt`)
-    host_names[$ndevs]=${str[0]}
-    client_names[$ndevs]=${str[1]}
-    ndevs=$((ndevs+1))
+	str=($(split_hostname $trgt))
+	host_names[$ndevs]=${str[0]}
+	client_names[$ndevs]=${str[1]}
+	ndevs=$((ndevs + 1))
 done
 if [ $case == "disk" ]; then
-    for ((i = 0; i < $ndevs; i++)); do
-        ost_names[$i]=${client_names[$i]}
-    done
+	for ((i = 0; i < $ndevs; i++)); do
+		ost_names[$i]=${client_names[$i]}
+	done
 fi
 if [ $case == "netdisk" ]; then
-        if [ "$targets" ]; then
-            for ((i = 0; i < $ndevs; i++)); do
-                setup_osc_for_remote_ost ${host_names[$i]} \
-                                         ${client_names[$i]} $i
-                osc_name=${client_names[$i]}_osc
-                ec_using_osc $osc_name
-	        cleanup_oscs="$cleanup_oscs $osc_name"
-            done
-        else
-            client_names_str=$($lctl dl | grep -v mdt | \
-                awk '{if ($2 == "UP" && $3 == "osc") {print $4} }')
-            count=0;
-            for name in $client_names_str; do
-                client_names[$count]=`echo $name | sed 's/-osc-.*$//'`
-                count=$((count+1))
-            done
-
-            host_names_str=$($lctl dl -t | grep -v mdt | \
-                awk '{if ($2 == "UP" && $3 == "osc") {print $7} }')
-            count=0;
-            for name in $host_names_str; do
-                host_names[$count]=`echo $name | sed 's/@.*$//'`
-                count=$((count+1))
-            done
-
-            for (( i = 0; i < $count; i++ )) do
-                setup_osc_for_remote_ost ${host_names[$i]} \
-                                         ${client_names[$i]} $i
-                osc_name=${client_names[$i]}_osc
-                ec_using_osc $osc_name
-	        cleanup_oscs="$cleanup_oscs $osc_name"
-            done
-        fi
-
-        echo_clients=$($lctl dl | grep echo_client | awk "{if (\$2 == \"UP\" && \$3 == \"echo_client\") {print \$4} }")
-        cnt=0;
-        for name in $echo_clients; do
-            client_names[$cnt]=$name
-            host_names[$cnt]=localhost
-            cnt=$((cnt+1))
-        done
-        ndevs=${#client_names[@]}
+	if [ "$targets" ]; then
+		for ((i = 0; i < $ndevs; i++)); do
+			setup_osc_for_remote_ost ${host_names[$i]} \
+						 ${client_names[$i]} $i
+			osc_name=${client_names[$i]}_osc
+			ec_using_osc $osc_name
+			cleanup_oscs="$cleanup_oscs $osc_name"
+		done
+	else
+		client_names_str=$($lctl dl | grep -v mdt |
+			awk '{if ($2 == "UP" && $3 == "osc") {print $4} }')
+		count=0;
+		for name in $client_names_str; do
+			client_names[$count]=$(echo $name | sed 's/-osc-.*$//')
+			count=$((count + 1))
+		done
+
+		host_names_str=$($lctl dl -t | grep -v mdt |
+			awk '{if ($2 == "UP" && $3 == "osc") {print $7} }')
+		count=0;
+		for name in $host_names_str; do
+			host_names[$count]=$(echo $name | sed 's/@.*$//')
+			count=$((count + 1))
+		done
+
+		for (( i = 0; i < $count; i++ )) do
+			setup_osc_for_remote_ost ${host_names[$i]} \
+						 ${client_names[$i]} $i
+			osc_name=${client_names[$i]}_osc
+			ec_using_osc $osc_name
+			cleanup_oscs="$cleanup_oscs $osc_name"
+		done
+	fi
+
+	echo_clients=$($lctl dl | grep echo_client |
+		       awk "{if (\$2 == \"UP\" && \$3 == \"echo_client\") { \
+		       		print \$4} }")
+	cnt=0;
+	for name in $echo_clients; do
+		client_names[$cnt]=$name
+		host_names[$cnt]=localhost
+		cnt=$((cnt + 1))
+	done
+	ndevs=${#client_names[@]}
 fi
 if [ $case == "network" ]; then
-    server_nid=$targets
-    if [ -z "$server_nid" ]; then
-	echo "Specify hostname or ip-address of server"
-	exit 1;
-    fi
-    # check for obdecho module on server
-    if ! dsh $server_nid root "lsmod | grep obdecho > /dev/null"; then
-        dsh $server_nid root "modprobe obdecho"
-    fi
-    # Now do the server setup
-    setup_srv_obd $server_nid "echo_srv"
-    oss_on_srv=`dsh $server_nid root "$lctl dl | grep OSS" | awk '{ print $4 }'`
-    if [ -z $oss_on_srv ]; then
-        setup_OSS $server_nid
-        clean_srv_OSS=1
-    fi
-    if ! dsh $server_nid root "$lctl dl | grep obdecho > /dev/null 2>&1"; then
-        echo "obdecho not setup on server"
-        exit 1
-    fi
-    if ! dsh $server_nid root "$lctl dl | grep ost > /dev/null 2>&1"; then
-        echo "ost not setup on server"
-        exit 1
-    fi
-    # Now start client setup
-    osc_names_str=$($lctl dl| grep osc | grep -v mdt | grep UP)
-    if [ -n "$osc_names_str" ]; then
-        echo "The existing setup must be cleaned";
-        exit 0;
-    fi
-    ec_using_srv_nid $server_nid "echotmp" "echotmp_UUID"
-    client_names[0]="echotmp_ecc"
+	server_nid=$targets
+	if [ -z "$server_nid" ]; then
+		echo "Specify hostname or ip-address of server"
+		exit 1;
+	fi
+	# check for obdecho module on server
+	if ! dsh $server_nid root "lsmod | grep obdecho > /dev/null"; then
+		dsh $server_nid root "modprobe obdecho"
+	fi
+	# Now do the server setup
+	setup_srv_obd $server_nid "echo_srv"
+	oss_on_srv=$(dsh $server_nid root "$lctl dl | grep OSS" |
+		     awk '{ print $4 }')
+	if [ -z $oss_on_srv ]; then
+		setup_OSS $server_nid
+		clean_srv_OSS=1
+	fi
+	if ! dsh $server_nid root "$lctl dl | grep obdecho > /dev/null 2>&1"; then
+		echo "obdecho not setup on server"
+		exit 1
+	fi
+	if ! dsh $server_nid root "$lctl dl | grep ost > /dev/null 2>&1"; then
+		echo "ost not setup on server"
+		exit 1
+	fi
+	# Now start client setup
+	osc_names_str=$($lctl dl| grep osc | grep -v mdt | grep UP)
+	if [ -n "$osc_names_str" ]; then
+		echo "The existing setup must be cleaned";
+		exit 0;
+	fi
+	ec_using_srv_nid $server_nid "echotmp" "echotmp_UUID"
+	client_names[0]="echotmp_ecc"
 fi
 if [ -z "$targets" ]; then
-    if [ $case == "disk" ]; then
-	get_targets
-        ndevs=${#ost_names[@]}	
-    fi	
+	if [ $case == "disk" ]; then
+		get_targets
+		ndevs=${#ost_names[@]}
+	fi
 fi
 # get vmstat started
 # disable portals debug and get obdecho loaded on all relevant hosts
-unique_hosts=(`unique ${host_names[@]}`)
+unique_hosts=($(unique ${host_names[@]}))
 load_obdechos
 
 if [ $case == "disk" ]; then
@@ -411,179 +451,187 @@ fi
 
 pidcount=0
 for host in ${unique_hosts[@]}; do
-    host_vmstatf=${vmstatf}_${host}
-    echo -n > $host_vmstatf
-    remote_shell $host "vmstat 5 >> $host_vmstatf" &> /dev/null &
-    pid=$!
-    vmstatpids[$pidcount]=$pid
-    pidcount=$((pidcount+1))
+	host_vmstatf=${vmstatf}_${host}
+	echo -n > $host_vmstatf
+	remote_shell $host "vmstat 5 >> $host_vmstatf" &> /dev/null &
+	pid=$!
+	vmstatpids[$pidcount]=$pid
+	pidcount=$((pidcount + 1))
 done
 # get all the echo_client device numbers and names
 for ((i=0; i < $ndevs; i++)); do
-    host=${host_names[$i]}
-    devno=(`get_ec_devno $host "${client_names[$i]}" "${ost_names[$i]}"`)
-    if ((${#devno[@]} != 3)); then
-        exit 1
-    fi
-    devnos[$i]=${devno[0]}
-    client_names[$i]=${devno[1]}
-    do_teardown_ec[$i]=${devno[2]}
+	host=${host_names[$i]}
+	devno=($(get_ec_devno $host "${client_names[$i]}" "${ost_names[$i]}"))
+	if ((${#devno[@]} != 3)); then
+		exit 1
+	fi
+	devnos[$i]=${devno[0]}
+	client_names[$i]=${devno[1]}
+	do_teardown_ec[$i]=${devno[2]}
 done
 if (($ndevs <= 0 || ${#host_names[@]} <= 0)); then
-    echo "no devices or hosts specified"
-    cleanup 0 $clean_srv_OSS $cleanup_oscs
+	echo "no devices or hosts specified"
+	cleanup 0 $clean_srv_OSS $cleanup_oscs
 fi
 # Buffers will be spread out among all hosts, so allow for that
 max_buffer_mem=$(( ${max_buffer_mem} * ${#unique_hosts[@]} ))
 print_summary "$(date) Obdfilter-survey for case=$case from $(hostname)"
 for ((rsz = $rszlo; rsz <= $rszhi; rsz*=2)); do
-    for ((nobj = $nobjlo; nobj <= $nobjhi; nobj*=2)); do 
-	for ((thr = $thrlo; thr <= $thrhi; thr*=2)); do
-	    if ((thr % nobj)); then
-		continue
-	    fi
-	    # restart?
-	    if [ -n "$restart_rsz" -a\
-		 -n "$restart_nobj" -a\
-		 -n "$restart_thr" ]; then
-		if ((rsz < restart_rsz ||\
-		     (rsz == restart_rsz &&\
-		      (nobj < restart_nobj ||\
-		       (nobj == restart_nobj &&\
-			thr < restart_thr))))); then
-		    continue;
-		fi
-	    fi
-	    # compute parameters
-	    total_thr=$((ndevs*thr))
-	    total_nobj=$((ndevs*nobj))
-	    pages=$((rsz/PAGE_SIZE))
-	    actual_rsz=$((pages*PAGE_SIZE))
-	    count=$((size*1024/(actual_rsz*thr)))
-	    actual_size=$((actual_rsz*count*thr))
-            total_size=$((actual_size*ndevs))
-	    # show computed parameters
-	    str=`printf 'ost %2d sz %8dK rsz %4dK obj %4d thr %4d ' \
-		     $ndevs $total_size $actual_rsz $total_nobj $total_thr`
-	    echo "=======================> $str" >> $workf
-	    print_summary -n "$str"
-	    if ((total_thr * actual_rsz > max_buffer_mem)); then
-		print_summary "Too much buffer space"
-		continue
-	    fi
-	    # create the objects
-	    tmpf="${workf}_tmp"
-	    for ((idx = 0; idx < $ndevs; idx++)); do
-		host=${host_names[$idx]}
-		devno=${devnos[$idx]}
-		client_name="${host}:${client_names[$idx]}"
-		echo "=============> Create $nobj on $client_name" >> $workf
-		first_obj=`create_objects $host $devno $nobj $tmpf`
-		cat $tmpf >> $workf
-		rm $tmpf
-		if [ $first_obj = "ERROR" ]; then
-		    print_summary "created object #s on $client_name not contiguous"
-		    exit 1
-		fi
-		first_objs[$idx]=$first_obj
-	    done
-	    # run tests
-	    for test in ${tests[@]}; do
-                declare -a pidarray
-                for host in ${unique_hosts[@]}; do
-                    echo "starting run for test: $test rsz: $rsz threads: $thr objects: $nobj" >> ${vmstatf}_${host}
-                done
-		print_summary -n "$test "
-		# create per-host script files
-		for host in ${unique_hosts[@]}; do
-		    echo -n > ${cmdsf}_${host}
-		done
-		for ((idx = 0; idx < $ndevs; idx++)); do
-		    host=${host_names[$idx]}
-		    devno=${devnos[$idx]}
-		    tmpfi="${tmpf}_$idx"
-		    first_obj=${first_objs[$idx]}
-		    thr_per_obj=$((${thr}/${nobj}))
-		    echo >> ${cmdsf}_${host} \
-		        "$lctl > $tmpfi 2>&1 \\
-                         --threads $thr -$snap $devno \\
-                         test_brw $count `testname2type $test` q $pages \\
-                         ${thr_per_obj}t${first_obj} `testcase2mode`$pages &"
-                done
-                pidcount=0
-                for host in ${unique_hosts[@]}; do
-                    echo "wait" >> ${cmdsf}_${host}
-                    pidarray[$pidcount]=0
-                    pidcount=$((pidcount+1))
-                done
-                # timed run of all the per-host script files
-                t0=`date +%s.%N`
-                pidcount=0
-                for host in ${unique_hosts[@]}; do
-                    remote_shell $host bash < ${cmdsf}_${host} &
-                    pidarray[$pidcount]=$!
-                    pidcount=$((pidcount+1))
-                done
-                pidcount=0
-                for host in ${unique_hosts[@]}; do
-                    wait ${pidarray[$pidcount]}
-                    pidcount=$((pidcount+1))
-                done
-                #wait
-                t1=`date +%s.%N`
-                # clean up per-host script files
-                for host in ${unique_hosts[@]}; do
-                    rm ${cmdsf}_${host}
-                done
-
-		# compute bandwidth from total data / elapsed time
-		str=`awk "BEGIN {printf \"%7.2f \",\
-		         $total_size / (( $t1 - $t0 ) * 1024)}"`
-		print_summary -n "$str"
-		# collect/check individual OST stats
-		echo -n > $tmpf
-		for ((idx = 0; idx < $ndevs; idx++)); do
-		    client_name="${host_names[$idx]}:${client_names[$idx]}"
-		    tmpfi="${tmpf}_$idx"
-		    echo "=============> $test $client_name" >> $workf
-		    host="${host_names[$idx]}"
-		    remote_shell $host cat $tmpfi > ${tmpfi}_local
-		    cat ${tmpfi}_local >> $workf
-		    get_stats ${tmpfi}_local >> $tmpf
-		    rm -f $tmpfi ${tmpfi}_local
-		done
-		# compute/display global min/max stats
-		echo "=============> $test global" >> $workf
-		cat $tmpf >> $workf
-		stats=(`get_global_stats $tmpf`)
-		rm $tmpf
-		if ((stats[0] <= 0)); then
-		    if ((stats[0] < 0)); then
-			str=`printf "%17s " ERROR`
-		    else
-			str=`printf "%17s " SHORT`
-		    fi
-		else
-		    str=`awk "BEGIN {printf \"[%7.2f,%7.2f] \",\
-			     (${stats[1]} * $actual_rsz)/1024,\
-			     (${stats[2]} * $actual_rsz)/1024; exit}"`
-		fi
-		print_summary -n "$str"
-	    done
-	    print_summary ""
-	    # destroy objects we created
-	    for ((idx = 0; idx < $ndevs; idx++)); do
-		host=${host_names[$idx]}
-		devno=${devnos[$idx]}
-		client_name="${host}:${client_names[$idx]}"
-		first_obj=${first_objs[$idx]}
-		echo "=============> Destroy $nobj on $client_name" >> $workf
-		destroy_objects $host $devno $first_obj $nobj $tmpf
-		cat $tmpf >> $workf
-		rm $tmpf
-	    done
-	done
-    done
-done
+	for ((nobj = $nobjlo; nobj <= $nobjhi; nobj*=2)); do
+		for ((thr = $thrlo; thr <= $thrhi; thr*=2)); do
+			if ((thr % nobj)); then
+				continue
+			fi
+			# restart?
+			if [ -n "$restart_rsz" -a \
+			     -n "$restart_nobj" -a \
+			     -n "$restart_thr" ]; then
+				if ((rsz < restart_rsz ||
+				     (rsz == restart_rsz &&
+				      (nobj < restart_nobj ||
+				       (nobj == restart_nobj &&
+					thr < restart_thr))))); then
+					continue;
+				fi
+			fi
+
+			# compute parameters
+			total_thr=$((ndevs * thr))
+			total_nobj=$((ndevs * nobj))
+			pages=$((rsz / PAGE_SIZE))
+			actual_rsz=$((pages * PAGE_SIZE))
+			count=$((size * 1024 / (actual_rsz * thr)))
+			actual_size=$((actual_rsz * count * thr))
+			total_size=$((actual_size * ndevs))
+
+			# show computed parameters
+			str=$(printf 'ost %2d sz %8dK rsz %4dK obj %4d thr %4d ' \
+			      $ndevs $total_size $actual_rsz $total_nobj $total_thr)
+			echo "=======================> $str" >> $workf
+			print_summary -n "$str"
+			if ((total_thr * actual_rsz > max_buffer_mem)); then
+				print_summary "Too much buffer space"
+				continue
+			fi
+
+			# create the objects
+			tmpf="${workf}_tmp"
+			for ((idx = 0; idx < $ndevs; idx++)); do
+				host=${host_names[$idx]}
+				devno=${devnos[$idx]}
+				client_name="${host}:${client_names[$idx]}"
+				echo "=============> Create $nobj on $client_name" >> $workf
+				first_obj=$(create_objects $host $devno $nobj $tmpf)
+				cat $tmpf >> $workf
+				rm $tmpf
+				if [ $first_obj = "ERROR" ]; then
+					print_summary "created object #s on $client_name not contiguous"
+					exit 1
+				fi
+				first_objs[$idx]=$first_obj
+			done # $ndevs
+
+			# run tests
+			for test in ${tests[@]}; do
+				declare -a pidarray
+				for host in ${unique_hosts[@]}; do
+					echo "starting run for test: $test rsz: $rsz " \
+					"threads: $thr objects: $nobj" >> ${vmstatf}_${host}
+				done
+				print_summary -n "$test "
+
+				# create per-host script files
+				for host in ${unique_hosts[@]}; do
+					echo -n > ${cmdsf}_${host}
+				done
+				for ((idx = 0; idx < $ndevs; idx++)); do
+					host=${host_names[$idx]}
+					devno=${devnos[$idx]}
+					tmpfi="${tmpf}_$idx"
+					first_obj=${first_objs[$idx]}
+					thr_per_obj=$((${thr}/${nobj}))
+					echo >> ${cmdsf}_${host} \
+					"$lctl > $tmpfi 2>&1 \\
+					--threads $thr -$snap $devno \\
+					test_brw $count $(testname2type $test) q $pages \\
+					${thr_per_obj}t${first_obj} $(testcase2mode)$pages &"
+				done # $ndevs
+				pidcount=0
+				for host in ${unique_hosts[@]}; do
+					echo "wait" >> ${cmdsf}_${host}
+					pidarray[$pidcount]=0
+					pidcount=$((pidcount + 1))
+				done
+				# timed run of all the per-host script files
+				t0=$(date +%s.%N)
+				pidcount=0
+				for host in ${unique_hosts[@]}; do
+					remote_shell $host bash < ${cmdsf}_${host} &
+					pidarray[$pidcount]=$!
+					pidcount=$((pidcount + 1))
+				done
+				pidcount=0
+				for host in ${unique_hosts[@]}; do
+					wait ${pidarray[$pidcount]}
+					pidcount=$((pidcount + 1))
+				done
+				#wait
+				t1=$(date +%s.%N)
+				# clean up per-host script files
+				for host in ${unique_hosts[@]}; do
+					rm ${cmdsf}_${host}
+				done
+
+				# compute bandwidth from total data / elapsed time
+				str=$(awk "BEGIN {printf \"%7.2f \",\
+				$total_size / (( $t1 - $t0 ) * 1024)}")
+				print_summary -n "$str"
+				# collect/check individual OST stats
+				echo -n > $tmpf
+				for ((idx = 0; idx < $ndevs; idx++)); do
+					client_name="${host_names[$idx]}:${client_names[$idx]}"
+					tmpfi="${tmpf}_$idx"
+					echo "=============> $test $client_name" >> $workf
+					host="${host_names[$idx]}"
+					remote_shell $host cat $tmpfi > ${tmpfi}_local
+					cat ${tmpfi}_local >> $workf
+					get_stats ${tmpfi}_local >> $tmpf
+					rm -f $tmpfi ${tmpfi}_local
+				done # $ndevs
+
+				# compute/display global min/max stats
+				echo "=============> $test global" >> $workf
+				cat $tmpf >> $workf
+				stats=($(get_global_stats $tmpf))
+				rm $tmpf
+				if ((stats[0] <= 0)); then
+					if ((stats[0] < 0)); then
+						str=$(printf "%17s " ERROR)
+					else
+						str=$(printf "%17s " SHORT)
+					fi
+				else
+					str=$(awk "BEGIN {printf \"[%7.2f,%7.2f] \",\
+					(${stats[1]} * $actual_rsz)/1024,\
+					(${stats[2]} * $actual_rsz)/1024; exit}")
+				fi
+				print_summary -n "$str"
+			done # $tests[]
+			print_summary ""
+
+			# destroy objects we created
+			for ((idx = 0; idx < $ndevs; idx++)); do
+				host=${host_names[$idx]}
+				devno=${devnos[$idx]}
+				client_name="${host}:${client_names[$idx]}"
+				first_obj=${first_objs[$idx]}
+				echo "=============> Destroy $nobj on $client_name" >> $workf
+				destroy_objects $host $devno $first_obj $nobj $tmpf
+				cat $tmpf >> $workf
+				rm $tmpf
+			done # $ndevs
+		done # $thr
+	done # $nobj
+done # $rsz
 cleanup 0 $clean_srv_OSS $cleanup_oscs
 exit 0