. $LUSTRE/tests/test-framework.sh
init_test_env $@
. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
+init_logging
DIRECTIO=${DIRECTIO:-$LUSTRE/tests/directio}
[ $MDSCOUNT -gt 1 ] && skip "CMD case" && exit 0
-remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
-remote_ost_nodsh && skip "remote OST with nodsh" && exit 0
+require_dsh_mds || exit 0
+require_dsh_ost || exit 0
[ "$SLOW" = "no" ] && EXCEPT_SLOW="9 10 11 18b 21"
check_and_setup_lustre
-if [ x"$(som_check)" = x"enabled" ]; then
- echo "Som is enabled, Quota is temporary conflicts with it"
- check_and_cleanup_lustre
- export QUOTA_AUTO=$QUOTA_AUTO_OLD
- exit 0
-fi
-
LOVNAME=`lctl get_param -n llite.*.lov.common_name | tail -n 1`
OSTCOUNT=`lctl get_param -n lov.$LOVNAME.numobd`
fi
while [ $((count++)) -lt $timeout ]; do
- $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT
- RC=$?
+ local RC=0
+ OUTPUT=`$LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT 2>&1` || RC=${PIPESTATUS[0]}
if [ $RC -ne 0 ]; then
- if [ $RC -eq 240 ]; then # 240 means -EBUSY
- log "resetquota is blocked for quota master recovery, retry after 1 sec"
- sleep 1
+ if echo "$OUTPUT" | grep -q busy; then
+ log "resetquota is blocked for quota master recovery, retry after $((count * 3)) sec"
+ sleep 3
continue
else
- error "resetquota failed: $RC"
+ error "resetquota failed"
fi
fi
break
log "$*"
}
+#
+# get quota info for a user or a group
+# usage: getquota -u|-g <username>|<groupname> global|<obd_uuid> bhardlimit|bsoftlimit|bgrace|ihardlimit|isoftlimit|igrace
+#
+getquota() {
+ local spec
+ local uuid
+
+ [ "$#" != 4 ] && error "getquota: wrong number of arguments: $#"
+ [ "$1" != "-u" -a "$1" != "-g" ] && error "getquota: wrong u/g specifier $1 passed"
+
+ uuid="$3"
+
+ case "$4" in
+ curspace) spec=1;;
+ bsoftlimit) spec=2;;
+ bhardlimit) spec=3;;
+ bgrace) spec=4;;
+ curinodes) spec=5;;
+ isoftlimit) spec=6;;
+ ihardlimit) spec=7;;
+ igrace) spec=8;;
+ *) error "unknown quota parameter $4";;
+ esac
+
+ [ "$uuid" = "global" ] && uuid=$DIR
+
+ $LFS quota -v "$1" "$2" $DIR | awk 'BEGIN { num='$spec' } { if ($1 == "'$uuid'") { if (NF == 1) { getline } else { num++ } ; print $num;} }'
+}
+
quota_show_check() {
LOCAL_BF=$1
LOCAL_UG=$2
$LFS quota -v -$LOCAL_UG $LOCAL_ID $DIR
if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "b" ]; then
- USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $2 }'`"
+ USAGE=`getquota -$LOCAL_UG $LOCAL_ID global curspace`
if [ -z $USAGE ]; then
quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for block ($LOCAL_UG:$LOCAL_ID)."
else
fi
if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "f" ]; then
- USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $5 }'`"
+ USAGE=`getquota -$LOCAL_UG $LOCAL_ID global curinodes`
if [ -z $USAGE ]; then
quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for file ($LOCAL_UG:$LOCAL_ID)."
else
}
quota_init
+test_quota_performance() {
+ TESTFILE="$DIR/$tdir/$tfile-0"
+ local size=$1
+ local stime=`date +%s`
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=1M count=$size || quota_error u $TSTUSR "write failure"
+ local etime=`date +%s`
+ delta=$((etime - stime))
+ if [ $delta -gt 0 ]; then
+ rate=$((size * 1024 / delta))
+ [ $rate -gt 1024 ] || error "SLOW IO for $TSTUSR (user): $rate KB/sec"
+ fi
+ rm -f $TESTFILE
+}
+
+# test basic quota performance b=21696
+test_0() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+ MB=100
+ [ "$SLOW" = "no" ] && MB=10
+
+ test_quota_performance $MB
+
+ $LFS setquota -u $TSTUSR -b 0 -B $((1024*1024)) -i 0 -I 0 $DIR
+ test_quota_performance $MB
+
+ resetquota -u $TSTUSR
+}
+run_test_with_stat 0 "Test basic quota performance ==="
+
# test for specific quota limitation, qunit, qtune $1=block_quota_limit
test_1_sub() {
LIMIT=$1
chown $TSTUSR.$TSTUSR $TESTFILE
log " Write ..."
- stime=`date +%s`
$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || quota_error u $TSTUSR "(usr) write failure, but expect success"
- etime=`date +%s`
- delta=$((etime - stime))
- if [ $delta -gt 0 ]; then
- rate=$((BLK_SZ * LIMIT / 2 / delta / 1024))
- [ $rate -gt 1024 ] || error "SLOW IO for $TSTUSR (user): $rate KB/sec"
- fi
log " Done"
log " Write out of block quota ..."
# this time maybe cache write, ignore it's failure
rm -f $TESTFILE
sync; sleep 1; sync;
OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
- OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED=`getquota -u $TSTUSR $OST0_UUID curspace`
echo $OST0_QUOTA_USED
[ $OST0_QUOTA_USED -ne 0 ] && \
($SHOW_QUOTA_USER; quota_error u $TSTUSR "(usr) quota deleted isn't released")
chown $TSTUSR.$TSTUSR $TESTFILE
log " Write ..."
- stime=`date +%s`
$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || quota_error g $TSTUSR "(grp) write failure, but expect success"
- etime=`date +%s`
- delta=$((etime - stime))
- if [ $delta -gt 0 ]; then
- rate=$((BLK_SZ * LIMIT / 2 / delta / 1024))
- [ $rate -gt 1024 ] || error "SLOW IO for $TSTUSR (group): $rate KB/sec"
- fi
log " Done"
log " Write out of block quota ..."
# this time maybe cache write, ignore it's failure
rm -f $TESTFILE
sync; sleep 1; sync;
OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
- OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED=`getquota -g $TSTUSR $OST0_UUID curspace`
echo $OST0_QUOTA_USED
[ $OST0_QUOTA_USED -ne 0 ] && \
($SHOW_QUOTA_GROUP; quota_error g $TSTUSR "(grp) quota deleted isn't released")
sync; sleep 1; sync;
MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
- MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ MDS_QUOTA_USED=`getquota -u $TSTUSR $MDS_UUID curinodes`
echo $MDS_QUOTA_USED
[ $MDS_QUOTA_USED -ne 0 ] && \
($SHOW_QUOTA_USER; quota_error u $TSTUSR "(usr) quota deleted isn't released")
sync; sleep 1; sync;
MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
- MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ MDS_QUOTA_USED=`getquota -g $TSTUSR $MDS_UUID curinodes`
echo $MDS_QUOTA_USED
[ $MDS_QUOTA_USED -ne 0 ] && \
($SHOW_QUOTA_GROUP; quota_error g $TSTUSR "(grp) quota deleted isn't released")
while [ $((count--)) -gt 0 ]; do
sync && sleep 5
- OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
+ OST0_QUOTA_HOLD=`getquota -u $TSTUSR $OST0_UUID bhardlimit`
if [ -z $OST0_QUOTA_HOLD ]; then
error "System is error when query quota for block (U:$TSTUSR)."
else
while [ $((count--)) -gt 0 ]; do
sync && sleep 5
- OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
+ OST0_QUOTA_HOLD=`getquota -g $TSTUSR $OST0_UUID bhardlimit`
if [ -z $OST0_QUOTA_HOLD ]; then
error "System is error when query quota for block (G:$TSTUSR)."
else
# check limits
PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
- TOTAL_LIMIT="`$LFS quota -v -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
+ TOTAL_LIMIT=`getquota -u $TSTUSR global bhardlimit`
[ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
echo " total limits = $TOTAL_LIMIT"
OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
[ -z "$OST0_UUID" ] && OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
- OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
+ OST0_LIMIT=`getquota -u $TSTUSR $OST0_UUID bhardlimit`
[ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
echo " limits on $OST0_UUID = $OST0_LIMIT"
line=`$LFS quota -v -$1 $2 $DIR | wc -l`
for i in `seq 3 $line`; do
if [ $i -eq 3 ]; then
- field="3 4 6 7"
+ field="3 4 7 8"
else
- field="3 5"
+ field="3 6"
fi
for j in $field; do
tmp=`$LFS quota -v -$1 $2 $DIR | sed -n ${i}p |
# test for user
$LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
- TOTAL_LIMIT="`$LFS quota -v -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
+ TOTAL_LIMIT=`getquota -u $TSTUSR global bhardlimit`
[ $TOTAL_LIMIT -eq $LIMIT ] || error " (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
echo " (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
resetquota -u $TSTUSR
# test for group
$LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
- TOTAL_LIMIT="`$LFS quota -v -g $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
+ TOTAL_LIMIT=`getquota -g $TSTUSR global bhardlimit`
[ $TOTAL_LIMIT -eq $LIMIT ] || error " (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
echo " (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
resetquota -g $TSTUSR
# check if watchdog is triggered
do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log
watchdog=`awk '/test 18b/ {start = 1;}
- /Watchdog triggered/ {
+ /Service thread pid/ && /was inactive/ {
if (start) {
print;
}
--inode-hardlimit ${LSTR[3]} \
$MOUNT || error "could not set quota limits"
- ($LFS quota -v -u $TSTUSR $MOUNT | \
- grep -E '^ *'$MOUNT' *[0-9]+\** *'${LVAL[0]}' *'${LVAL[1]}' *[0-9]+\** *'${LVAL[2]}' *'${LVAL[3]}) \
- || error "lfs quota output is unexpected"
+ [ "`getquota -u $TSTUSR global bsoftlimit`" = "${LVAL[0]}" ] || error "bsoftlimit was not set properly"
+ [ "`getquota -u $TSTUSR global bhardlimit`" = "${LVAL[1]}" ] || error "bhardlimit was not set properly"
+ [ "`getquota -u $TSTUSR global isoftlimit`" = "${LVAL[2]}" ] || error "isoftlimit was not set properly"
+ [ "`getquota -u $TSTUSR global ihardlimit`" = "${LVAL[3]}" ] || error "ihardlimit was not set properly"
resetquota -u $TSTUSR
}
rm -f $TESTFILE
wait_delete_completed
OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
- OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED=`getquota -u $TSTUSR $OST0_UUID curspace`
echo $OST0_QUOTA_USED
[ $OST0_QUOTA_USED -ne 0 ] && \
($SHOW_QUOTA_USER; quota_error u $TSTUSR "quota deleted isn't released")
$LFS setstripe $DIR/$tdir -c 1 -i 0
MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
- MDS_QUOTA_USED_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
- OST0_QUOTA_USED_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
- MDS_QUOTA_USED2_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
- OST0_QUOTA_USED2_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ MDS_QUOTA_USED_OLD=`getquota $1 $TSTUSR $MDS_UUID curinodes`
+ OST0_QUOTA_USED_OLD=`getquota $1 $TSTUSR $OST0_UUID curspace`
+ MDS_QUOTA_USED2_OLD=`getquota $1 $TSTUSR2 $MDS_UUID curinodes`
+ OST0_QUOTA_USED2_OLD=`getquota $1 $TSTUSR2 $OST0_UUID curspace`
# TSTUSR write 4M
log "$TSTUSR write 4M to $TESTFILE"
sync
show_quota $1 $TSTUSR
show_quota $1 $TSTUSR2
- MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ MDS_QUOTA_USED_NEW=`getquota $1 $TSTUSR $MDS_UUID curinodes`
[ $MDS_QUOTA_USED_NEW -ne $((MDS_QUOTA_USED_OLD + 1)) ] && \
quota_error a $TSTUSR "$TSTUSR inode quota usage error: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
- OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED_NEW=`getquota $1 $TSTUSR $OST0_UUID curspace`
OST0_QUOTA_USED_DELTA=$((OST0_QUOTA_USED_NEW - OST0_QUOTA_USED_OLD))
[ $OST0_QUOTA_USED_DELTA -lt 4096 ] && \
quota_error a $TSTUSR "$TSTUSR block quota usage error: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
sync
show_quota $1 $TSTUSR
show_quota $1 $TSTUSR2
- MDS_QUOTA_USED2_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ MDS_QUOTA_USED2_NEW=`getquota $1 $TSTUSR2 $MDS_UUID curinodes`
[ $MDS_QUOTA_USED2_NEW -ne $((MDS_QUOTA_USED2_OLD + 1)) ] && \
quota_error a $TSTUSR2 "$TSTUSR2 inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED2_OLD|$MDS_QUOTA_USED2_NEW]"
- OST0_QUOTA_USED2_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED2_NEW=`getquota $1 $TSTUSR2 $OST0_UUID curspace`
# when chown, the quota on ost could be displayed out of quota temporarily. Delete the '*' in this situation. b=20433
OST0_QUOTA_USED2_NEW=${OST0_QUOTA_USED2_NEW%\*}
OST0_QUOTA_USED2_DELTA=$((OST0_QUOTA_USED2_NEW - OST0_QUOTA_USED2_OLD))
[ $OST0_QUOTA_USED2_DELTA -ne $OST0_QUOTA_USED_DELTA ] && \
quota_error a $TSTUSR2 "$TSTUSR2 block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED2_OLD|$OST0_QUOTA_USED2_NEW]"
- MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ MDS_QUOTA_USED_NEW=`getquota $1 $TSTUSR $MDS_UUID curinodes`
[ $MDS_QUOTA_USED_NEW -ne $MDS_QUOTA_USED_OLD ] && \
quota_error a $TSTUSR "$TSTUSR inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
- OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED_NEW=`getquota $1 $TSTUSR $OST0_UUID curspace`
[ $OST0_QUOTA_USED_NEW -ne $OST0_QUOTA_USED_OLD ] && \
quota_error a $TSTUSR "$TSTUSR block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
}
run_test_with_stat 28 "test for consistency for qunit when setquota (18574) ==========="
-test_30()
-{
- local output
- local LIMIT=1024
- local TESTFILE="$DIR/$tdir/$tfile"
- local GRACE=10
-
- mkdir -p $DIR/$tdir
- chmod 0777 $DIR/$tdir
-
- $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
- $LFS setquota -u $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
- $RUNAS dd if=/dev/zero of=$TESTFILE bs=1024 count=$((LIMIT * 2)) || true
- cancel_lru_locks osc
- sleep 5
- $LFS setquota -u $TSTUSR -B 0 $DIR
- $SHOW_QUOTA_USER
- output=`$SHOW_QUOTA_USER | grep $MOUNT | awk '{ print $5 }' | tr -d s`
- [ "$output" -le "$((GRACE - 5))" ] || error "grace times were reset or unexpectedly high latency"
- rm -f $TESTFILE
- resetquota -u $TSTUSR
- $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
-}
-run_test_with_stat 30 "hard limit updates should not reset grace times ================"
-
test_29()
{
local BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
local timeout
local pid
- local origin_resends
if at_is_enabled; then
timeout=$(at_max_get client)
lctl set_param timeout=10
fi
- origin_resends=$(lctl get_param -n mdc.${FSNAME}-*.quota_resend_count | head -1)
- lctl set_param -n mdc.${FSNAME}-*.quota_resend_count 0
-
#define OBD_FAIL_MDS_QUOTACTL_NET 0x12e
lustre_fail mds 0x12e
lctl set_param timeout=$timeout
fi
- lctl set_param -n mdc.${FSNAME}-*.quota_resend_count $origin_resends
resetquota -u $TSTUSR
}
run_test_with_stat 29 "unhandled quotactls must not hang lustre client (19778) ========"
+test_30()
+{
+ local output
+ local LIMIT=1024
+ local TESTFILE="$DIR/$tdir/$tfile"
+ local GRACE=10
+
+ set_blk_tunesz 512
+ set_blk_unitsz 1024
+
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
+ $LFS setstripe $TESTFILE -i 0 -c 1
+ chown $TSTUSR.$TSTUSR $TESTFILE
+
+ $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
+ $LFS setquota -u $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=1024 count=$((LIMIT * 2)) || true
+ cancel_lru_locks osc
+ sleep $GRACE
+ $LFS setquota -u $TSTUSR -B 0 $DIR
+ # over-quota flag has not yet settled since we do not trigger async events
+ # based on grace time period expiration
+ $SHOW_QUOTA_USER
+ $RUNAS dd if=/dev/zero of=$TESTFILE conv=notrunc oflag=append bs=1048576 count=1 || true
+ cancel_lru_locks osc
+ # now over-quota flag should be settled and further writes should fail
+ $SHOW_QUOTA_USER
+ $RUNAS dd if=/dev/zero of=$TESTFILE conv=notrunc oflag=append bs=1048576 count=1 && error "grace times were reset"
+ rm -f $TESTFILE
+ resetquota -u $TSTUSR
+ $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
+
+ set_blk_unitsz $((128 * 1024))
+ set_blk_tunesz $((128 * 1024 / 2))
+}
+run_test_with_stat 30 "hard limit updates should not reset grace times ================"
+
+# test duplicate quota releases b=18630
+test_31() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+
+ LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
+ TESTFILE="$DIR/$tdir/$tfile-0"
+ TESTFILE2="$DIR/$tdir/$tfile-1"
+
+ wait_delete_completed
+
+ log " User quota (limit: $LIMIT kbytes)"
+ $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
+
+ $LFS setstripe $TESTFILE -i 0 -c 1
+ chown $TSTUSR.$TSTUSR $TESTFILE
+ $LFS setstripe $TESTFILE2 -i 0 -c 1
+ chown $TSTUSR.$TSTUSR $TESTFILE2
+
+ log " step1: write out of block quota ..."
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=5120
+ $RUNAS dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=5120
+
+ #define OBD_FAIL_QUOTA_DELAY_SD 0xA04
+ #define OBD_FAIL_SOME 0x10000000 /* fail N times */
+ lustre_fail ost $((0x00000A04 | 0x10000000)) 1
+
+ log " step2: delete two files so that triggering duplicate quota release ..."
+ rm -f $TESTFILE $TESTFILE2
+ sync; sleep 5; sync # OBD_FAIL_QUOTA_DELAY_SD will delay for 5 seconds
+ wait_delete_completed
+
+ log " step3: verify if the ost failed"
+ do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log
+ watchdog=`awk '/test 31/ {start = 1;}
+ /release quota error/ {
+ if (start) {
+ print;
+ }
+ }' $TMP/lustre-log-${TESTNAME}.log`
+ [ "$watchdog" ] && error "$watchdog"
+ rm -f $TMP/lustre-log-${TESTNAME}.log
+
+ lustre_fail ost 0
+ resetquota -u $TSTUSR
+}
+run_test_with_stat 31 "test duplicate quota releases ==="
+
# turn off quota
quota_fini()
{