+ # of a partition > 1 GB
+ [ $size -gt 1 ] && partial_arg="-p"
+
+ llverdev --force $partial_arg $llverdev_opts $dev
+}
+
+run_llverfs()
+{
+ local dir=$1
+ local llverfs_opts=$2
+ local partial_arg=""
+ local size=$(df -B G $dir |tail -n 1 |awk '{print $2}' |sed 's/G//') #GB
+
+ # Run in partial (fast) mode if the size
+ # of a partition > 1 GB
+ [ $size -gt 1 ] && partial_arg="-p"
+
+ llverfs $partial_arg $llverfs_opts $dir
+}
+
+remove_mdt_files() {
+ local facet=$1
+ local mdtdev=$2
+ shift 2
+ local files="$@"
+ local mntpt=$(facet_mntpt $facet)
+
+ echo "removing files from $mdtdev on $facet: $files"
+ mount -t $FSTYPE $MDS_MOUNT_OPTS $mdtdev $mntpt || return $?
+ rc=0;
+ for f in $files; do
+ rm $mntpt/ROOT/$f || { rc=$?; break; }
+ done
+ umount -f $mntpt || return $?
+ return $rc
+}
+
+duplicate_mdt_files() {
+ local facet=$1
+ local mdtdev=$2
+ shift 2
+ local files="$@"
+ local mntpt=$(facet_mntpt $facet)
+
+ echo "duplicating files on $mdtdev on $facet: $files"
+ mkdir -p $mntpt || return $?
+ mount -t $FSTYPE $MDS_MOUNT_OPTS $mdtdev $mntpt || return $?
+
+ do_umount() {
+ trap 0
+ popd > /dev/null
+ rm $tmp
+ umount -f $mntpt
+ }
+ trap do_umount EXIT
+
+ tmp=$(mktemp $TMP/setfattr.XXXXXXXXXX)
+ pushd $mntpt/ROOT > /dev/null || return $?
+ rc=0
+ for f in $files; do
+ touch $f.bad || return $?
+ getfattr -n trusted.lov $f | sed "s#$f#&.bad#" > $tmp
+ rc=${PIPESTATUS[0]}
+ [ $rc -eq 0 ] || return $rc
+ setfattr --restore $tmp || return $?
+ done
+ do_umount
+}
+
+run_sgpdd () {
+ local devs=${1//,/ }
+ shift
+ local params=$@
+ local rslt=$TMP/sgpdd_survey
+
+ # sgpdd-survey cleanups ${rslt}.* files
+
+ local cmd="rslt=$rslt $params scsidevs=\"$devs\" $SGPDDSURVEY"
+ echo + $cmd
+ eval $cmd
+ cat ${rslt}.detail
+}
+
+# returns the canonical name for an ldiskfs device
+ldiskfs_canon() {
+ local dev="$1"
+ local facet="$2"
+
+ do_facet $facet "dv=\\\$(lctl get_param -n $dev);
+if foo=\\\$(lvdisplay -c \\\$dv 2>/dev/null); then
+ echo dm-\\\${foo##*:};
+else
+ echo \\\$(basename \\\$dv);
+fi;"
+}
+
+is_sanity_benchmark() {
+ local benchmarks="dbench bonnie iozone fsx"
+ local suite=$1
+ for b in $benchmarks; do
+ if [ "$b" == "$suite" ]; then
+ return 0
+ fi
+ done
+ return 1
+}
+
+min_ost_size () {
+ $LCTL get_param -n osc.*.kbytesavail | sort -n | head -n1
+}
+
+# Get the block size of the filesystem.
+get_block_size() {
+ local facet=$1
+ local device=$2
+ local size
+
+ size=$(do_facet $facet "$DUMPE2FS -h $device 2>&1" |
+ awk '/^Block size:/ {print $3}')
+ echo $size
+}
+
+# Check whether the "large_xattr" feature is enabled or not.
+large_xattr_enabled() {
+ local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
+
+ do_facet $SINGLEMDS "$DUMPE2FS -h $mds_dev 2>&1 | grep -q large_xattr"
+ return ${PIPESTATUS[0]}
+}
+
+# Get the maximum xattr size supported by the filesystem.
+max_xattr_size() {
+ local size
+
+ if large_xattr_enabled; then
+ # include/linux/limits.h: #define XATTR_SIZE_MAX 65536
+ size=65536
+ else
+ local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
+ local block_size=$(get_block_size $SINGLEMDS $mds_dev)
+
+ # maximum xattr size = size of block - size of header -
+ # size of 1 entry - 4 null bytes
+ size=$((block_size - 32 - 32 - 4))
+ fi
+
+ echo $size
+}
+
+# Dump the value of the named xattr from a file.
+get_xattr_value() {
+ local xattr_name=$1
+ local file=$2
+
+ echo "$(getfattr -n $xattr_name --absolute-names --only-values $file)"
+}
+
+# Generate a string with size of $size bytes.
+generate_string() {
+ local size=${1:-1024} # in bytes