Whamcloud - gitweb
LU-14707 tests: Bashify scripts for Ubuntu et. al.
[fs/lustre-release.git] / lustre / tests / test-framework.sh
index e337b9d..636a7ca 100755 (executable)
@@ -299,8 +299,11 @@ init_test_env() {
        [ ! -f "$LCTL" ] && export LCTL=$(which lctl)
        export LFS=${LFS:-"$LUSTRE/utils/lfs"}
        [ ! -f "$LFS" ] && export LFS=$(which lfs)
+       export KSOCKLND_CONFIG=${KSOCKLND_CONFIG:-"$LUSTRE/scripts/ksocklnd-config"}
+       [ ! -f "$KSOCKLND_CONFIG" ] &&
+               export KSOCKLND_CONFIG=$(which ksocklnd-config 2> /dev/null)
 
-       export PERM_CMD=${PERM_CMD:-"$LCTL conf_param"}
+       export PERM_CMD=$(echo ${PERM_CMD:-"$LCTL conf_param"})
 
        export L_GETIDENTITY=${L_GETIDENTITY:-"$LUSTRE/utils/l_getidentity"}
        if [ ! -f "$L_GETIDENTITY" ]; then
@@ -750,6 +753,7 @@ load_modules_local() {
        fi
        load_module ../lnet/klnds/$LNETLND
        load_module obdclass/obdclass
+       MODOPTS_PTLRPC=${MODOPTS_PTLRPC:-"lbug_on_grant_miscount=1"}
        load_module ptlrpc/ptlrpc
        load_module ptlrpc/gss/ptlrpc_gss
        load_module fld/fld
@@ -813,12 +817,24 @@ load_modules_local() {
 }
 
 load_modules () {
+       local facets
+       local facet
+       local failover
        load_modules_local
        # bug 19124
        # load modules on remote nodes optionally
        # lustre-tests have to be installed on these nodes
        if $LOAD_MODULES_REMOTE; then
                local list=$(comma_list $(remote_nodes_list))
+
+               # include failover nodes in case they are not in the list yet
+               facets=$(get_facets)
+               for facet in ${facets//,/ }; do
+                       failover=$(facet_failover_host $facet)
+                       [ -n "$list" ] && [[ ! "$list" =~ "$failover" ]] &&
+                               list="$list,$failover"
+               done
+
                if [ -n "$list" ]; then
                        echo "loading modules on: '$list'"
                        do_rpc_nodes "$list" load_modules_local
@@ -1566,8 +1582,7 @@ get_osd_param() {
        local device=${2:-$FSNAME-OST*}
        local name=$3
 
-       do_nodes $nodes "$LCTL get_param -n obdfilter.$device.$name \
-               osd-*.$device.$name 2>&1" | grep -v 'error:'
+       do_nodes $nodes "$LCTL get_param -n osd-*.$device.$name"
 }
 
 set_osd_param() {
@@ -1576,8 +1591,7 @@ set_osd_param() {
        local name=$3
        local value=$4
 
-       do_nodes $nodes "$LCTL set_param -n obdfilter.$device.$name=$value \
-               osd-*.$device.$name=$value 2>&1" | grep -v 'error:'
+       do_nodes $nodes "$LCTL set_param -n osd-*.$device.$name=$value"
 }
 
 set_debug_size () {
@@ -2046,6 +2060,9 @@ mount_facet() {
        local devicelabel
        local dm_dev=${!dev}
 
+       [[ $dev == "mgsfailover_dev" ]] && combined_mgs_mds &&
+               dev=mds1failover_dev
+
        module_loaded lustre || load_modules
 
        case $fstype in
@@ -2138,11 +2155,17 @@ start() {
        eval export ${dev_alias}_dev=${device}
        eval export ${facet}_opt=\"$@\"
 
+       combined_mgs_mds && [[ ${dev_alias} == mds1 ]] &&
+               eval export mgs_dev=${device}
+
        local varname=${dev_alias}failover_dev
        if [ -n "${!varname}" ] ; then
                eval export ${dev_alias}failover_dev=${!varname}
        else
                eval export ${dev_alias}failover_dev=$device
+               combined_mgs_mds && [[ ${dev_alias} == mds1 ]] &&
+                       eval export mgsfailover_dev=${device}
+
        fi
 
        local mntpt=$(facet_mntpt $facet)
@@ -2727,11 +2750,12 @@ remount_facet() {
 reboot_facet() {
        local facet=$1
        local node=$(facet_active_host $facet)
+       local sleep_time=${2:-10}
 
        if [ "$FAILURE_MODE" = HARD ]; then
                boot_node $node
        else
-               sleep 10
+               sleep $sleep_time
        fi
 }
 
@@ -3374,8 +3398,11 @@ wait_recovery_complete () {
     fi
     echo affected facets: $facets
 
-       # we can use "for" here because we are waiting the slowest
-       for facet in ${facets//,/ }; do
+       facets=${facets//,/ }
+       # We can use "for" here because we are waiting the slowest.
+       # The mgs not having the recovery_status proc entry, exclude it
+       # from the facet list.
+       for facet in ${facets//mgs/ }; do
                local var_svc=${facet}_svc
                local param="*.${!var_svc}.recovery_status"
 
@@ -3661,7 +3688,7 @@ facet_failover() {
                facet=$(echo ${affecteds[index]} | tr -s " " | cut -d"," -f 1)
                echo reboot facets: ${affecteds[index]}
 
-               reboot_facet $facet
+               reboot_facet $facet $sleep_time
 
                change_active ${affecteds[index]}
 
@@ -3674,11 +3701,14 @@ facet_failover() {
                if ! combined_mgs_mds &&
                        list_member ${affecteds[index]} mgs; then
                        mount_facet mgs || error "Restart of mgs failed"
+                       affecteds[index]=$(exclude_items_from_list \
+                               ${affecteds[index]} mgs)
                fi
                # FIXME; has to be changed to mount all facets concurrently
-               affected=$(exclude_items_from_list ${affecteds[index]} mgs)
-               echo mount facets: ${affecteds[index]}
-               mount_facets ${affecteds[index]}
+               if [ -n "${affecteds[index]}" ]; then
+                       echo mount facets: ${affecteds[index]}
+                       mount_facets ${affecteds[index]}
+               fi
                if $GSS_SK; then
                        do_nodes $(comma_list $(all_nodes)) \
                                "keyctl show | grep lustre | cut -c1-11 |
@@ -3962,7 +3992,14 @@ facet_host() {
                elif [ "${facet:0:3}" == "mdt" -o \
                        "${facet:0:3}" == "mds" -o \
                        "${facet:0:3}" == "mgs" ]; then
-                       eval export ${facet}_HOST=${mds_HOST}
+                       local temp
+                       if [ "${facet}" == "mgsfailover" ] &&
+                          [ -n "$mds1failover_HOST" ]; then
+                               temp=$mds1failover_HOST
+                       else
+                               temp=${mds_HOST}
+                       fi
+                       eval export ${facet}_HOST=$temp
                fi
        fi
        echo -n ${!varname}
@@ -3978,6 +4015,13 @@ facet_failover_host() {
                return
        fi
 
+       if combined_mgs_mds && [ $facet == "mgs" ] &&
+               [ -z $mds1failover_HOST ]; then
+               temp=mds1failover_HOST
+               echo ${!temp}
+               return
+       fi
+
        if [ "${facet:0:3}" == "mdt" -o "${facet:0:3}" == "mds" -o \
             "${facet:0:3}" == "mgs" ]; then
 
@@ -4035,8 +4079,6 @@ change_active() {
     local facetlist=$1
     local facet
 
-    facetlist=$(exclude_items_from_list $facetlist mgs)
-
     for facet in ${facetlist//,/ }; do
     local failover=${facet}failover
     local host=`facet_host $failover`
@@ -4090,23 +4132,31 @@ do_node() {
                eval $myPDSH $HOST "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests;
                                     PATH=\$PATH:/sbin:/usr/sbin;
                                     cd $RPWD;
-                                    LUSTRE=\"$RLUSTRE\" sh -c \"$@\") ||
+                                    LUSTRE=\"$RLUSTRE\" bash -c \"$@\") ||
                                     echo command failed >$command_status"
                [[ -n "$($myPDSH $HOST cat $command_status)" ]] && return 1 ||
                        return 0
        fi
 
-    if [[ -n "$verbose" ]]; then
-        # print HOSTNAME for myPDSH="no_dsh"
-        if [[ $myPDSH = no_dsh ]]; then
-            $myPDSH $HOST "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" sh -c \"$@\")" | sed -e "s/^/${HOSTNAME}: /"
-        else
-            $myPDSH $HOST "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" sh -c \"$@\")"
-        fi
-    else
-        $myPDSH $HOST "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" sh -c \"$@\")" | sed "s/^${HOST}: //"
-    fi
-    return ${PIPESTATUS[0]}
+       if [[ -n "$verbose" ]]; then
+               # print HOSTNAME for myPDSH="no_dsh"
+               if [[ $myPDSH = no_dsh ]]; then
+                       $myPDSH $HOST \
+                       "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin;\
+                       cd $RPWD; LUSTRE=\"$RLUSTRE\" bash -c \"$@\")" |
+                       sed -e "s/^/${HOSTNAME}: /"
+               else
+                       $myPDSH $HOST \
+                       "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin;\
+                       cd $RPWD; LUSTRE=\"$RLUSTRE\" bash -c \"$@\")"
+               fi
+       else
+               $myPDSH $HOST \
+               "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin;\
+               cd $RPWD; LUSTRE=\"$RLUSTRE\" bash -c \"$@\")" |
+               sed "s/^${HOST}: //"
+       fi
+       return ${PIPESTATUS[0]}
 }
 
 single_local_node () {
@@ -4187,9 +4237,9 @@ do_nodes() {
        # do not replace anything from pdsh output if -N is used
        # -N     Disable hostname: prefix on lines of output.
        if [[ -n "$verbose" || $myPDSH = *-N* ]]; then
-               $myPDSH $rnodes "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" $(get_env_vars) sh -c \"$@\")"
+               $myPDSH $rnodes "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" $(get_env_vars) bash -c \"$@\")"
        else
-               $myPDSH $rnodes "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" $(get_env_vars) sh -c \"$@\")" | sed -re "s/^[^:]*: //g"
+               $myPDSH $rnodes "(PATH=\$PATH:$RLUSTRE/utils:$RLUSTRE/tests:/sbin:/usr/sbin; cd $RPWD; LUSTRE=\"$RLUSTRE\" $(get_env_vars) bash -c \"$@\")" | sed -re "s/^[^:]*: //g"
        fi
        return ${PIPESTATUS[0]}
 }
@@ -5153,7 +5203,14 @@ init_facet_vars () {
 
        local varname=${facet}failover_HOST
        if [ -z "${!varname}" ]; then
-               eval export $varname=$(facet_host $facet)
+               local temp
+               if combined_mgs_mds && [ $facet == "mgs" ] &&
+                  [ -n "$mds1failover_HOST" ]; then
+                       temp=$mds1failover_HOST
+               else
+                       temp=$(facet_host $facet)
+               fi
+               eval export $varname=$temp
        fi
 
        varname=${facet}_HOST
@@ -5186,12 +5243,12 @@ init_facets_vars () {
 
        if ! remote_mds_nodsh; then
                for num in $(seq $MDSCOUNT); do
-                       DEVNAME=`mdsdevname $num`
+                       DEVNAME=$(mdsdevname $num)
                        init_facet_vars mds$num $DEVNAME $MDS_MOUNT_OPTS
                done
        fi
 
-       combined_mgs_mds || init_facet_vars mgs $(mgsdevname) $MGS_MOUNT_OPTS
+       init_facet_vars mgs $(mgsdevname) $MGS_MOUNT_OPTS
 
        if ! remote_ost_nodsh; then
                for num in $(seq $OSTCOUNT); do
@@ -5355,9 +5412,7 @@ init_param_vars () {
        fi
 
        (( MDS1_VERSION <= $(version_code 2.13.52) )) ||
-               do_nodes $(comma_list $(mdts_nodes)) \
-                       "$LCTL set_param lod.*.mdt_hash=crush"
-       do_node $(mgs_node) "$LCTL set_param -P *.*.lbug_on_grant_miscount=1"
+               do_facet mgs "$LCTL set_param -P lod.*.mdt_hash=crush"
        return 0
 }
 
@@ -5840,30 +5895,30 @@ check_and_cleanup_lustre() {
 # General functions
 
 wait_for_function () {
-    local quiet=""
-
-    # suppress fn both stderr and stdout
-    if [ "$1" = "--quiet" ]; then
-        shift
-        quiet=" > /dev/null 2>&1"
+       local quiet=""
 
-    fi
+       # suppress fn both stderr and stdout
+       if [ "$1" = "--quiet" ]; then
+               shift
+               quiet=" > /dev/null 2>&1"
+       fi
 
-    local fn=$1
-    local max=${2:-900}
-    local sleep=${3:-5}
+       local fn=$1
+       local max=${2:-900}
+       local sleep=${3:-5}
 
-    local wait=0
+       local wait=0
 
-    while true; do
+       while true; do
 
-        eval $fn $quiet && return 0
+               eval $fn $quiet && return 0
 
-        wait=$((wait + sleep))
-        [ $wait -lt $max ] || return 1
-        echo waiting $fn, $((max - wait)) secs left ...
-        sleep $sleep
-    done
+               [ $wait -lt $max ] || return 1
+               echo waiting $fn, $((max - wait)) secs left ...
+               wait=$((wait + sleep))
+               [ $wait -gt $max ] && ((sleep -= wait - max))
+               sleep $sleep
+       done
 }
 
 check_network() {
@@ -6820,7 +6875,7 @@ ostuuid_from_index()
 }
 
 ostname_from_index() {
-    local uuid=$(ostuuid_from_index $1)
+    local uuid=$(ostuuid_from_index $1 $2)
     echo ${uuid/_UUID/}
 }
 
@@ -7454,48 +7509,49 @@ get_osc_import_name() {
 }
 
 _wait_import_state () {
-    local expected=$1
-    local CONN_PROC=$2
-    local maxtime=${3:-$(max_recovery_time)}
-    local error_on_failure=${4:-1}
-    local CONN_STATE
-    local i=0
+       local expected="$1"
+       local CONN_PROC="$2"
+       local maxtime=${3:-$(max_recovery_time)}
+       local err_on_fail=${4:-1}
+       local CONN_STATE
+       local i=0
 
        CONN_STATE=$($LCTL get_param -n $CONN_PROC 2>/dev/null | cut -f2 | uniq)
-    while ! echo "${CONN_STATE}" | egrep -q "^${expected}\$" ; do
-        if [ "${expected}" == "DISCONN" ]; then
-            # for disconn we can check after proc entry is removed
-            [ "x${CONN_STATE}" == "x" ] && return 0
-            #  with AT enabled, we can have connect request timeout near of
-            # reconnect timeout and test can't see real disconnect
-            [ "${CONN_STATE}" == "CONNECTING" ] && return 0
-        fi
-       if [ $i -ge $maxtime ]; then
-           [ $error_on_failure -ne 0 ] && \
-               error "can't put import for $CONN_PROC into ${expected}" \
-                     "state after $i sec, have ${CONN_STATE}"
-            return 1
-       fi
-        sleep 1
-       # Add uniq for multi-mount case
-       CONN_STATE=$($LCTL get_param -n $CONN_PROC 2>/dev/null | cut -f2 | uniq)
-        i=$(($i + 1))
-    done
+       while ! echo "${CONN_STATE}" | egrep -q "^${expected}\$" ; do
+               if [[ "${expected}" == "DISCONN" ]]; then
+                       # for disconn we can check after proc entry is removed
+                       [[ -z "${CONN_STATE}" ]] && return 0
+                       # with AT, we can have connect request timeout near
+                       # reconnect timeout and test can't see real disconnect
+                       [[ "${CONN_STATE}" == "CONNECTING" ]] && return 0
+               fi
+               if (( $i >= $maxtime )); then
+                       (( $err_on_fail != 0 )) &&
+                               error "can't put import for $CONN_PROC into ${expected} state after $i sec, have ${CONN_STATE}"
+                       return 1
+               fi
+               sleep 1
+               # Add uniq for multi-mount case
+               CONN_STATE=$($LCTL get_param -n $CONN_PROC 2>/dev/null |
+                            cut -f2 | uniq)
+               i=$((i + 1))
+       done
 
-    log "$CONN_PROC in ${CONN_STATE} state after $i sec"
-    return 0
+       log "$CONN_PROC in ${CONN_STATE} state after $i sec"
+       return 0
 }
 
 wait_import_state() {
-    local state=$1
-    local params=$2
-    local maxtime=${3:-$(max_recovery_time)}
-    local error_on_failure=${4:-1}
-    local param
-
-    for param in ${params//,/ }; do
-       _wait_import_state $state $param $maxtime $error_on_failure || return
-    done
+       local expected="$1"
+       local params="$2"
+       local maxtime=${3:-$(max_recovery_time)}
+       local err_on_fail=${4:-1}
+       local param
+
+       for param in ${params//,/ }; do
+               _wait_import_state "$expected" "$param" $maxtime $err_on_fail ||
+               return
+       done
 }
 
 wait_import_state_mount() {
@@ -7503,7 +7559,7 @@ wait_import_state_mount() {
                return 0
        fi
 
-       wait_import_state $*
+       wait_import_state "$@"
 }
 
 # One client request could be timed out because server was not ready
@@ -7702,11 +7758,10 @@ do_rpc_nodes () {
 }
 
 wait_clients_import_state () {
-       local list=$1
-       local facet=$2
-       local expected=$3
-
-       local facets=$facet
+       local list="$1"
+       local facet="$2"
+       local expected="$3"
+       local facets="$facet"
 
        if [ "$FAILURE_MODE" = HARD ]; then
                facets=$(facets_on_host $(facet_active_host $facet))
@@ -7717,11 +7772,11 @@ wait_clients_import_state () {
                local proc_path
                case $facet in
                ost* ) proc_path="osc.$(get_clientosc_proc_path \
-                                 $label).ost_server_uuid" ;;
+                                       $label).ost_server_uuid" ;;
                mds* ) proc_path="mdc.$(get_clientmdc_proc_path \
-                                 $label).mds_server_uuid" ;;
+                                       $label).mds_server_uuid" ;;
                mgs* ) proc_path="mgc.$(get_clientmgc_proc_path \
-                                 $label).mgs_server_uuid" ;;
+                                       $label).mgs_server_uuid" ;;
                *) error "unknown facet!" ;;
                esac
 
@@ -8647,7 +8702,7 @@ get_block_count() {
 # ldiskfs xattrs over one block in size.  Allow both the historical
 # Lustre feature name (large_xattr) and the upstream name (ea_inode).
 large_xattr_enabled() {
-       [[ $(facet_fstype $SINGLEMDS) == zfs ]] && return 1
+       [[ $(facet_fstype $SINGLEMDS) == zfs ]] && return 0
 
        local mds_dev=$(mdsdevname ${SINGLEMDS//mds/})
 
@@ -8696,7 +8751,6 @@ mds_backup_restore() {
        local devname=$(mdsdevname $(facet_number $facet))
        local mntpt=$(facet_mntpt brpt)
        local rcmd="do_facet $facet"
-       local metaea=${TMP}/backup_restore.ea
        local metadata=${TMP}/backup_restore.tgz
        local opts=${MDS_MOUNT_FS_OPTS}
        local svc=${facet}_svc
@@ -8710,41 +8764,36 @@ mds_backup_restore() {
        # step 1: build mount point
        ${rcmd} mkdir -p $mntpt
        # step 2: cleanup old backup
-       ${rcmd} rm -f $metaea $metadata
+       ${rcmd} rm -f $metadata
        # step 3: mount dev
-       ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 1
+       ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 3
        if [ ! -z $igif ]; then
                # step 3.5: rm .lustre
-               ${rcmd} rm -rf $mntpt/ROOT/.lustre || return 1
+               ${rcmd} rm -rf $mntpt/ROOT/.lustre || return 3
        fi
-       # step 4: backup metaea
-       echo "backup EA"
-       ${rcmd} "cd $mntpt && getfattr -R -d -m '.*' -P . > $metaea && cd -" ||
-               return 2
-       # step 5: backup metadata
+       # step 4: backup metadata
        echo "backup data"
-       ${rcmd} tar zcf $metadata -C $mntpt/ . > /dev/null 2>&1 || return 3
-       # step 6: umount
-       ${rcmd} $UMOUNT $mntpt || return 4
-       # step 8: reformat dev
+       ${rcmd} tar zcf $metadata --xattrs --xattrs-include="trusted.*" \
+               --sparse -C $mntpt/ . > /dev/null 2>&1 || return 4
+       # step 5: umount
+       ${rcmd} $UMOUNT $mntpt || return 5
+       # step 6: reformat dev
        echo "reformat new device"
        format_mdt $(facet_number $facet)
-       # step 9: mount dev
+       # step 7: mount dev
        ${rcmd} mount -t ldiskfs $opts $devname $mntpt || return 7
-       # step 10: restore metadata
+       # step 8: 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
+       ${rcmd} tar zxfp $metadata --xattrs --xattrs-include="trusted.*" \
+               --sparse -C $mntpt > /dev/null 2>&1 || return 8
+       # step 9: remove recovery logs
        echo "remove recovery logs"
        ${rcmd} rm -fv $mntpt/OBJECTS/* $mntpt/CATALOGS
-       # step 13: umount dev
+       # step 10: umount dev
        ${rcmd} $UMOUNT $mntpt || return 10
-       # step 14: cleanup tmp backup
+       # step 11: cleanup tmp backup
        ${rcmd} rm -f $metaea $metadata
-       # step 15: reset device label - it's not virgin on
+       # step 12: reset device label - it's not virgin on
        ${rcmd} e2label $devname ${!svc}
 }
 
@@ -10676,3 +10725,59 @@ wait_nm_sync() {
        fi
        echo "waited $((i - 1)) seconds for sync"
 }
+
+consume_precreations() {
+       local dir=$1
+       local mfacet=$2
+       local OSTIDX=$3
+       local extra=${4:-2}
+       local OST=$(ostname_from_index $OSTIDX $dir)
+
+       test_mkdir -p $dir/${OST}
+       $LFS setstripe -i $OSTIDX -c 1 ${dir}/${OST}
+
+       # on the mdt's osc
+       local mdtosc_proc=$(get_mdtosc_proc_path $mfacet $OST)
+       local last_id=$(do_facet $mfacet $LCTL get_param -n \
+                       osp.$mdtosc_proc.prealloc_last_id)
+       local next_id=$(do_facet $mfacet $LCTL get_param -n \
+                       osp.$mdtosc_proc.prealloc_next_id)
+       echo "Creating to objid $last_id on ost $OST..."
+       createmany -o $dir/${OST}/f $next_id $((last_id - next_id + extra))
+}
+
+__exhaust_precreations() {
+       local OSTIDX=$1
+       local FAILLOC=$2
+       local FAILIDX=${3:-$OSTIDX}
+       local ofacet=ost$((OSTIDX + 1))
+
+       mkdir_on_mdt0 $DIR/$tdir
+       local mdtidx=$($LFS getstripe -m $DIR/$tdir)
+       local mfacet=mds$((mdtidx + 1))
+       echo OSTIDX=$OSTIDX MDTIDX=$mdtidx
+
+       local mdtosc_proc=$(get_mdtosc_proc_path $mfacet)
+       do_facet $mfacet $LCTL get_param osp.$mdtosc_proc.prealloc*
+
+#define OBD_FAIL_OST_ENOSPC              0x215
+       do_facet $ofacet $LCTL set_param fail_val=$FAILIDX fail_loc=0x215
+
+       consume_precreations $DIR/$tdir $mfacet $OSTIDX
+
+       do_facet $mfacet $LCTL get_param osp.$mdtosc_proc.prealloc*
+       do_facet $ofacet $LCTL set_param fail_loc=$FAILLOC
+}
+
+exhaust_precreations() {
+       __exhaust_precreations $1 $2 $3
+       sleep_maxage
+}
+
+exhaust_all_precreations() {
+       local i
+       for (( i=0; i < OSTCOUNT; i++ )) ; do
+               __exhaust_precreations $i $1 -1
+       done
+       sleep_maxage
+}