+
+reformat_external_journal() {
+ if [ ! -z ${EJOURNAL} ]; then
+ local rcmd="do_facet ${SINGLEMDS}"
+
+ echo "reformat external journal on ${SINGLEMDS}:${EJOURNAL}"
+ ${rcmd} mke2fs -O journal_dev ${EJOURNAL} || return 1
+ fi
+}
+
+# MDT file-level backup/restore
+mds_backup_restore() {
+ local devname=$(mdsdevname ${SINGLEMDS//mds/})
+ local mntpt=$(facet_mntpt brpt)
+ local rcmd="do_facet ${SINGLEMDS}"
+ local metaea=${TMP}/backup_restore.ea
+ local metadata=${TMP}/backup_restore.tgz
+ local opts=${MDS_MOUNT_OPTS}
+ local svc=${SINGLEMDS}_svc
+
+ if ! ${rcmd} test -b ${devname}; then
+ opts=$(csa_add "$opts" -o loop)
+ fi
+
+ echo "file-level backup/restore on ${SINGLEMDS}:${devname}"
+
+ # step 1: build mount point
+ ${rcmd} mkdir -p $mntpt
+ # step 2: cleanup old backup
+ ${rcmd} rm -f $metaea $metadata
+ # step 3: mount dev
+ ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 1
+ # step 4: backup metaea
+ echo "backup EA"
+ ${rcmd} "cd $mntpt && getfattr -R -d -m '.*' -P . > $metaea && cd -" ||
+ return 2
+ # step 5: backup metadata
+ echo "backup data"
+ ${rcmd} tar zcf $metadata -C $mntpt/ . > /dev/null 2>&1 || return 3
+ # step 6: umount
+ ${rcmd} umount -d $mntpt || return 4
+ # step 7: reformat external journal if needed
+ reformat_external_journal || return 5
+ # step 8: reformat dev
+ echo "reformat new device"
+ add ${SINGLEMDS} $(mkfs_opts ${SINGLEMDS}) --backfstype ldiskfs \
+ --reformat $devname > /dev/null || return 6
+ # step 9: mount dev
+ ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 7
+ # step 10: restore metadata
+ echo "restore data"
+ ${rcmd} tar zxfp $metadata -C $mntpt > /dev/null 2>&1 || return 8
+ # step 11: restore metaea
+ echo "restore EA"
+ ${rcmd} "cd $mntpt && setfattr --restore=$metaea && cd - " || return 9
+ # step 12: remove recovery logs
+ echo "remove recovery logs"
+ ${rcmd} rm -fv $mntpt/OBJECTS/* $mntpt/CATALOGS
+ # step 13: umount dev
+ ${rcmd} umount -d $mntpt || return 10
+ # step 14: cleanup tmp backup
+ ${rcmd} rm -f $metaea $metadata
+ # step 15: reset device label - it's not virgin on
+ ${rcmd} e2label $devname ${!svc}
+}
+
+# remove OI files
+mds_remove_ois() {
+ local devname=$(mdsdevname ${SINGLEMDS//mds/})
+ local mntpt=$(facet_mntpt brpt)
+ local rcmd="do_facet ${SINGLEMDS}"
+ local idx=$1
+ local opts=${MDS_MOUNT_OPTS}
+
+ if ! ${rcmd} test -b ${devname}; then
+ opts=$(csa_add "$opts" -o loop)
+ fi
+
+ echo "remove OI files: idx=${idx}"
+
+ # step 1: build mount point
+ ${rcmd} mkdir -p $mntpt
+ # step 2: mount dev
+ ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 1
+ if [ -z $idx ]; then
+ # step 3: remove all OI files
+ ${rcmd} rm -fv $mntpt/oi.16*
+ elif [ $idx -lt 2 ]; then
+ ${rcmd} rm -fv $mntpt/oi.16.${idx}
+ else
+ local i
+
+ # others, rm oi.16.[idx, idx * idx, idx ** ...]
+ for ((i=${idx}; i<64; i=$((i * idx)))); do
+ ${rcmd} rm -fv $mntpt/oi.16.${i}
+ done
+ fi
+ # step 4: umount
+ ${rcmd} umount -d $mntpt || return 2
+ # OI files will be recreated when mounted as lustre next time.
+}
+
+# generate maloo upload-able log file name
+# \param logname specify unique part of file name
+generate_logname() {
+ local logname=${1:-"default_logname"}
+
+ echo "$TESTLOG_PREFIX.$TESTNAME.$logname.$(hostname -s).log"
+}
+
+# mkdir directory on different MDTs
+test_mkdir() {
+ local option
+ local parent
+ local child
+ local path
+ local dir
+ local rc=0
+
+ if [ $# -eq 2 ]; then
+ option=$1
+ path=$2
+ else
+ path=$1
+ fi
+
+ child=${path##*/}
+ parent=${path%/*}
+
+ if [ "$parent" == "$child" ]; then
+ parent=$(pwd)
+ fi
+
+ if [ "$option" == "-p" -a -d ${parent}/${child} ]; then
+ return $rc
+ fi
+
+ # it needs to check whether there is further / in child
+ dir=$(echo $child | awk -F '/' '{print $2}')
+ if [ ! -z "$dir" ]; then
+ local subparent=$(echo $child | awk -F '/' '{ print $1 }')
+ parent=${parent}"/"${subparent}
+ child=$dir
+ fi
+
+ if [ ! -d ${parent} ]; then
+ if [ "$option" == "-p" ]; then
+ mkdir -p ${parent}
+ else
+ return 1
+ fi
+ fi
+
+ if [ $MDSCOUNT -le 1 ]; then
+ mkdir $option ${parent}/${child} || rc=$?
+ else
+ local mdt_idx=$($LFS getstripe -M $parent)
+
+ if [ "$mdt_idx" -ne 0 ]; then
+ mkdir $option ${parent}/${child} || rc=$?
+ return $rc
+ fi
+
+ local test_num=$(echo $testnum | sed -e 's/[^0-9]*//g')
+ local mdt_idx=$((test_num % MDSCOUNT))
+ echo "mkdir $mdt_idx for ${parent}/${child}"
+ $LFS setdirstripe -i $mdt_idx ${parent}/${child} || rc=$?
+ fi
+ return $rc
+}