Whamcloud - gitweb
b=18630 avoid the race of acquiring/releasing quota
[fs/lustre-release.git] / lustre / tests / sanity-quota.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6 # Run test by setting NOSETUP=true when ltest has setup env for us
7 set -e
8
9 #kernel 2.4.x doesn't support quota
10 K_VER=`uname --kernel-release | cut -b 1-3`
11 if [ $K_VER = "2.4" ]; then
12     echo "Kernel 2.4 doesn't support quota"
13     exit 0
14 fi
15
16 SRCDIR=`dirname $0`
17 export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/../utils:$PATH:/sbin
18
19 ONLY=${ONLY:-"$*"}
20 # test_11 has been used to protect a kernel bug(bz10912), now it isn't
21 # useful any more. Then add it to ALWAYS_EXCEPT. b=19835
22 ALWAYS_EXCEPT="10 $SANITY_QUOTA_EXCEPT"
23 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
24
25 case `uname -r` in
26 2.6*) FSTYPE=${FSTYPE:-ldiskfs};;
27 *) error "unsupported kernel" ;;
28 esac
29
30 [ "$ALWAYS_EXCEPT$EXCEPT" ] && \
31         echo "Skipping tests: `echo $ALWAYS_EXCEPT $EXCEPT`"
32
33 TMP=${TMP:-/tmp}
34
35 ORIG_PWD=${PWD}
36 TSTID=${TSTID:-60000}
37 TSTID2=${TSTID2:-60001}
38 TSTUSR=${TSTUSR:-"quota_usr"}
39 TSTUSR2=${TSTUSR2:-"quota_2usr"}
40 BLK_SZ=1024
41 BUNIT_SZ=${BUNIT_SZ:-1024}      # min block quota unit(kB)
42 IUNIT_SZ=${IUNIT_SZ:-10}        # min inode quota unit
43 MAX_DQ_TIME=604800
44 MAX_IQ_TIME=604800
45
46 TRACE=${TRACE:-""}
47 LUSTRE=${LUSTRE:-`dirname $0`/..}
48 . $LUSTRE/tests/test-framework.sh
49 init_test_env $@
50 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
51 DIRECTIO=${DIRECTIO:-$LUSTRE/tests/directio}
52
53 [ $MDSCOUNT -gt 1 ] && skip "CMD case" && exit 0
54
55 remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0
56 remote_ost_nodsh && skip "remote OST with nodsh" && exit 0
57
58 [ "$SLOW" = "no" ] && EXCEPT_SLOW="9 10 11 18b 21"
59
60 QUOTALOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log}
61
62 [ "$QUOTALOG" ] && rm -f $QUOTALOG || true
63
64 DIR=${DIR:-$MOUNT}
65 DIR2=${DIR2:-$MOUNT2}
66
67 QUOTA_AUTO_OLD=$QUOTA_AUTO
68 export QUOTA_AUTO=0
69
70 check_and_setup_lustre
71
72 if [ x"$(som_check)" = x"enabled" ]; then
73         echo "Som is enabled, Quota is temporary conflicts with it"
74         check_and_cleanup_lustre
75         export QUOTA_AUTO=$QUOTA_AUTO_OLD
76         exit 0
77 fi
78
79 LOVNAME=`lctl get_param -n llite.*.lov.common_name | tail -n 1`
80 OSTCOUNT=`lctl get_param -n lov.$LOVNAME.numobd`
81
82 SHOW_QUOTA_USER="$LFS quota -v -u $TSTUSR $DIR"
83 SHOW_QUOTA_USERID="$LFS quota -v -u $TSTID $DIR"
84 SHOW_QUOTA_USER2="$LFS quota -v -u $TSTUSR2 $DIR"
85 SHOW_QUOTA_GROUP="$LFS quota -v -g $TSTUSR $DIR"
86 SHOW_QUOTA_GROUPID="$LFS quota -v -g $TSTID $DIR"
87 SHOW_QUOTA_GROUP2="$LFS quota -v -g $TSTUSR2 $DIR"
88 SHOW_QUOTA_INFO_USER="$LFS quota -t -u $DIR"
89 SHOW_QUOTA_INFO_GROUP="$LFS quota -t -g $DIR"
90
91 # control the time of tests
92 cycle=30
93 [ "$SLOW" = "no" ] && cycle=10
94
95 build_test_filter
96
97 # set_blk_tunables(btune_sz)
98 set_blk_tunesz() {
99         local btune=$(($1 * BLK_SZ))
100         # set btune size on all obdfilters
101         do_facet ost1 "lctl set_param lquota.${FSNAME}-OST*.quota_btune_sz=$btune"
102         # set btune size on mds
103         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.quota_btune_sz=$btune"
104 }
105
106 # set_blk_unitsz(bunit_sz)
107 set_blk_unitsz() {
108         local bunit=$(($1 * BLK_SZ))
109         # set bunit size on all obdfilters
110         do_facet ost1 "lctl set_param lquota.${FSNAME}-OST*.quota_bunit_sz=$bunit"
111         # set bunit size on mds
112         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.quota_bunit_sz=$bunit"
113 }
114
115 # set_file_tunesz(itune_sz)
116 set_file_tunesz() {
117         local itune=$1
118         # set itune size on all obdfilters
119         do_facet ost1 "lctl set_param lquota.${FSNAME}-OST*.quota_itune_sz=$itune"
120         # set itune size on mds
121         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.quota_itune_sz=$itune"
122 }
123
124 # set_file_unitsz(iunit_sz)
125 set_file_unitsz() {
126         local iunit=$1
127         # set iunit size on all obdfilters
128         do_facet ost1 "lctl set_param lquota.${FSNAME}-OST*.quota_iunit_sz=$iunit"
129         # set iunit size on mds
130         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.quota_iunit_sz=$iunit"
131 }
132
133 lustre_fail() {
134         local fail_node=$1
135         local fail_loc=$2
136         local fail_val=${3:-0}
137
138         if [ $fail_node == "mds" ] || [ $fail_node == "mds_ost" ]; then
139             if [ $((fail_loc & 0x10000000)) -ne 0  -a $fail_val -gt 0 ] || \
140                 [ $((fail_loc)) -eq 0 ]; then
141                 do_facet $SINGLEMDS "lctl set_param fail_val=$fail_val"
142             fi
143             do_facet $SINGLEMDS "lctl set_param fail_loc=$fail_loc"
144         fi
145         if [ $fail_node == "ost" ] || [ $fail_node == "mds_ost" ]; then
146             for num in `seq $OSTCOUNT`; do
147                 if [ $((fail_loc & 0x10000000)) -ne 0 -a $fail_val -gt 0 ] || \
148                     [ $((fail_loc)) -eq 0 ]; then
149                     do_facet ost$num "lctl set_param fail_val=$fail_val"
150                 fi
151                 do_facet ost$num "lctl set_param fail_loc=$fail_loc"
152             done
153         fi
154 }
155
156 RUNAS="runas -u $TSTID -g $TSTID"
157 RUNAS2="runas -u $TSTID2 -g $TSTID2"
158 FAIL_ON_ERROR=true check_runas_id $TSTID $TSTID $RUNAS
159 FAIL_ON_ERROR=true check_runas_id $TSTID2 $TSTID2 $RUNAS2
160
161 FAIL_ON_ERROR=false
162
163 run_test_with_stat() {
164         (($# != 2)) && error "the number of arguments is wrong"
165
166         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.stats=0" > /dev/null
167         for j in `seq $OSTCOUNT`; do
168             do_facet ost$j "lctl set_param lquota.${FSNAME}-OST*.stats=0" > /dev/null
169         done
170         run_test "$@"
171         if [ ${STAT:-"yes"} != "no" -a -z "$LAST_SKIPPED" ]; then
172             echo "statistics info begin ***************************************"
173             do_facet $SINGLEMDS "lctl get_param lquota.mdd_obd-${FSNAME}-MDT*.stats"
174             for j in `seq $OSTCOUNT`; do
175                 do_facet ost$j "lctl get_param lquota.${FSNAME}-OST*.stats"
176             done
177             echo "statistics info end   ***************************************"
178         fi
179 }
180
181 #
182 # clear quota limits for a user or a group
183 # usage: resetquota -u username
184 #        resetquota -g groupname
185
186 resetquota() {
187         [ "$#" != 2 ] && error "resetquota: wrong number of arguments: $#"
188         [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed"
189
190         count=0
191         if at_is_enabled; then
192             timeout=$(at_max_get mds)
193         else
194             timeout=$(lctl get_param -n timeout)
195         fi
196
197         while [ $((count++)) -lt $timeout ]; do
198                 $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT
199                 RC=$?
200                 if [ $RC -ne 0 ]; then
201                         if [ $RC -eq 240 ]; then # 240 means -EBUSY
202                                 log "resetquota is blocked for quota master recovery, retry after 1 sec"
203                                 sleep 1
204                                 continue
205                         else
206                                 error "resetquota failed: $RC"
207                         fi
208                 fi
209                 break
210         done
211
212         [ $count -lt $timeout ] || error "resetquota timeout: $timeout"
213 }
214
215 quota_scan() {
216         LOCAL_UG=$1
217         LOCAL_ID=$2
218
219         if [ "$LOCAL_UG" == "a" -o "$LOCAL_UG" == "u" ]; then
220                 log "Files for user ($LOCAL_ID):"
221                 ($LFS find -user $LOCAL_ID $DIR | xargs stat 2>/dev/null)
222         fi
223
224         if [ "$LOCAL_UG" == "a" -o "$LOCAL_UG" == "g" ]; then
225                 log "Files for group ($LOCAL_ID):"
226                 ($LFS find -group $LOCAL_ID $DIR | xargs stat 2>/dev/null)
227         fi
228 }
229
230 quota_error() {
231         quota_scan $1 $2
232         shift 2
233         error "$*"
234 }
235
236 quota_log() {
237         quota_scan $1 $2
238         shift 2
239         log "$*"
240 }
241
242 quota_show_check() {
243         LOCAL_BF=$1
244         LOCAL_UG=$2
245         LOCAL_ID=$3
246         PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
247
248         $LFS quota -v -$LOCAL_UG $LOCAL_ID $DIR
249
250         if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "b" ]; then
251                 USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $2 }'`"
252                 if [ -z $USAGE ]; then
253                         quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for block ($LOCAL_UG:$LOCAL_ID)."
254                 else
255                         [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for block ($LOCAL_UG:$LOCAL_ID:$USAGE)."
256                 fi
257         fi
258
259         if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "f" ]; then
260                 USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $5 }'`"
261                 if [ -z $USAGE ]; then
262                         quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for file ($LOCAL_UG:$LOCAL_ID)."
263                 else
264                         [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for file ($LOCAL_UG:$LOCAL_ID:$USAGE)."
265                 fi
266         fi
267 }
268
269 # set quota
270 quota_init() {
271         $LFS quotacheck -ug $DIR
272
273         resetquota -u $TSTUSR
274         resetquota -g $TSTUSR
275
276         do_nodes $(comma_list $(nodes_list)) "lctl set_param debug=+quota"
277 }
278 quota_init
279
280 # test for specific quota limitation, qunit, qtune $1=block_quota_limit
281 test_1_sub() {
282         LIMIT=$1
283         mkdir -p $DIR/$tdir
284         chmod 0777 $DIR/$tdir
285         TESTFILE="$DIR/$tdir/$tfile-0"
286
287         wait_delete_completed
288
289         # test for user
290         log "  User quota (limit: $LIMIT kbytes)"
291         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
292         sleep 3
293         quota_show_check b u $TSTUSR
294
295         $LFS setstripe $TESTFILE -c 1
296         chown $TSTUSR.$TSTUSR $TESTFILE
297
298         log "    Write ..."
299         stime=`date +%s`
300         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || quota_error u $TSTUSR "(usr) write failure, but expect success"
301         etime=`date +%s`
302         delta=$((etime - stime))
303         if [ $delta -gt 0 ]; then
304                 rate=$((BLK_SZ * LIMIT / 2 / delta / 1024))
305                 [ $rate -gt 1024 ] || error "SLOW IO for $TSTUSR (user): $rate KB/sec"
306         fi
307         log "    Done"
308         log "    Write out of block quota ..."
309         # this time maybe cache write,  ignore it's failure
310         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true
311         # flush cache, ensure noquota flag is setted on client
312         cancel_lru_locks osc
313         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && quota_error u $TSTUSR "(usr) write success, but expect EDQUOT"
314
315         rm -f $TESTFILE
316         sync; sleep 1; sync;
317         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
318         OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
319         echo $OST0_QUOTA_USED
320         [ $OST0_QUOTA_USED -ne 0 ] && \
321             ($SHOW_QUOTA_USER; quota_error u $TSTUSR "(usr) quota deleted isn't released")
322         $SHOW_QUOTA_USER
323         resetquota -u $TSTUSR
324
325         # test for group
326         log "--------------------------------------"
327         log "  Group quota (limit: $LIMIT kbytes)"
328         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
329         sleep 3
330         quota_show_check b g $TSTUSR
331         TESTFILE="$DIR/$tdir/$tfile-1"
332
333         $LFS setstripe $TESTFILE -c 1
334         chown $TSTUSR.$TSTUSR $TESTFILE
335
336         log "    Write ..."
337         stime=`date +%s`
338         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || quota_error g $TSTUSR "(grp) write failure, but expect success"
339         etime=`date +%s`
340         delta=$((etime - stime))
341         if [ $delta -gt 0 ]; then
342                 rate=$((BLK_SZ * LIMIT / 2 / delta / 1024))
343                 [ $rate -gt 1024 ] || error "SLOW IO for $TSTUSR (group): $rate KB/sec"
344         fi
345         log "    Done"
346         log "    Write out of block quota ..."
347         # this time maybe cache write, ignore it's failure
348         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true
349         cancel_lru_locks osc
350         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && quota_error g $TSTUSR "(grp) write success, but expect EDQUOT"
351
352         # cleanup
353         rm -f $TESTFILE
354         sync; sleep 1; sync;
355         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
356         OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
357         echo $OST0_QUOTA_USED
358         [ $OST0_QUOTA_USED -ne 0 ] && \
359             ($SHOW_QUOTA_GROUP; quota_error g $TSTUSR "(grp) quota deleted isn't released")
360         $SHOW_QUOTA_GROUP
361         resetquota -g $TSTUSR
362 }
363
364 # block hard limit (normal use and out of quota)
365 test_1() {
366         for i in `seq 1 $cycle`; do
367             # define blk_qunit is between 1M and 4M
368             blk_qunit=$(( $RANDOM % 3072 + 1024 ))
369             blk_qtune=$(( $RANDOM % $blk_qunit ))
370             # other osts and mds will occupy at 1M blk quota
371             b_limit=$(( ($RANDOM - 16384) / 8 +  ($OSTCOUNT + 1) * $blk_qunit * 4 ))
372             set_blk_tunesz $blk_qtune
373             set_blk_unitsz $blk_qunit
374             echo "cycle: $i(total $cycle) bunit:$blk_qunit, btune:$blk_qtune, blimit:$b_limit"
375             test_1_sub $b_limit
376             echo "=================================================="
377             set_blk_unitsz $((128 * 1024))
378             set_blk_tunesz $((128 * 1024 / 2))
379         done
380 }
381 run_test_with_stat 1 "Block hard limit (normal use and out of quota) ==="
382
383 # test for specific quota limitation, qunit, qtune $1=block_quota_limit
384 test_2_sub() {
385         LIMIT=$1
386         mkdir -p $DIR/$tdir
387         chmod 0777 $DIR/$tdir
388         TESTFILE="$DIR/$tdir/$tfile-0"
389
390         wait_delete_completed
391
392         # test for user
393         log "  User quota (limit: $LIMIT files)"
394         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR
395         sleep 3
396         quota_show_check f u $TSTUSR
397
398         log "    Create $LIMIT files ..."
399         $RUNAS createmany -m ${TESTFILE} $LIMIT || \
400                 quota_error u $TSTUSR "(usr) create failure, but expect success"
401         log "    Done"
402         log "    Create out of file quota ..."
403         $RUNAS touch ${TESTFILE}_xxx && \
404                 quota_error u $TSTUSR "(usr) touch success, but expect EDQUOT"
405
406         unlinkmany ${TESTFILE} $LIMIT
407         rm -f ${TESTFILE}_xxx
408         sync; sleep 1; sync;
409
410         MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
411         MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
412         echo $MDS_QUOTA_USED
413         [ $MDS_QUOTA_USED -ne 0 ] && \
414             ($SHOW_QUOTA_USER; quota_error u $TSTUSR "(usr) quota deleted isn't released")
415         $SHOW_QUOTA_USER
416         resetquota -u $TSTUSR
417
418         # test for group
419         log "--------------------------------------"
420         log "  Group quota (limit: $LIMIT FILE)"
421         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR
422         sleep 3
423         quota_show_check f g $TSTUSR
424         TESTFILE=$DIR/$tdir/$tfile-1
425
426         log "    Create $LIMIT files ..."
427         $RUNAS createmany -m ${TESTFILE} $LIMIT || \
428                 quota_error g $TSTUSR "(grp) create failure, but expect success"
429         log "    Done"
430         log "    Create out of file quota ..."
431         $RUNAS touch ${TESTFILE}_xxx && \
432                 quota_error g $TSTUSR "(grp) touch success, but expect EDQUOT"
433
434         unlinkmany ${TESTFILE} $LIMIT
435         rm -f ${TESTFILE}_xxx
436         sync; sleep 1; sync;
437
438         MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
439         MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
440         echo $MDS_QUOTA_USED
441         [ $MDS_QUOTA_USED -ne 0 ] && \
442             ($SHOW_QUOTA_GROUP; quota_error g $TSTUSR "(grp) quota deleted isn't released")
443         $SHOW_QUOTA_GROUP
444         resetquota -g $TSTUSR
445 }
446
447 # file hard limit (normal use and out of quota)
448 test_2() {
449         for i in `seq 1 $cycle`; do
450             if [ $i -eq 1 ]; then
451                 ino_qunit=52
452                 ino_qtune=41
453                 i_limit=11
454             else
455                 # define ino_qunit is between 10 and 100
456                 ino_qunit=$(( $RANDOM % 90 + 10 ))
457                 ino_qtune=$(( $RANDOM % $ino_qunit ))
458                 # RANDOM's maxium is 32767
459                 i_limit=$(( $RANDOM % 990 + 10 ))
460             fi
461
462             set_file_tunesz $ino_qtune
463             set_file_unitsz $ino_qunit
464             echo "cycle: $i(total $cycle) iunit:$ino_qunit, itune:$ino_qtune, ilimit:$i_limit"
465             test_2_sub $i_limit
466             echo "=================================================="
467             set_file_unitsz 5120
468             set_file_tunesz 2560
469         done
470 }
471 run_test_with_stat 2 "File hard limit (normal use and out of quota) ==="
472
473 test_block_soft() {
474         TESTFILE=$1
475         TIMER=$(($2 * 3 / 2))
476         OFFSET=0
477
478         wait_delete_completed
479
480         echo "    Write to exceed soft limit"
481         RUNDD="$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ"
482         $RUNDD count=$((BUNIT_SZ+1)) || \
483                 quota_error a $TSTUSR "write failure, but expect success"
484         OFFSET=$((OFFSET + BUNIT_SZ + 1))
485         cancel_lru_locks osc
486
487         $SHOW_QUOTA_USER
488         $SHOW_QUOTA_GROUP
489         $SHOW_QUOTA_INFO_USER
490         $SHOW_QUOTA_INFO_GROUP
491
492         echo "    Write before timer goes off"
493         $RUNDD count=$BUNIT_SZ seek=$OFFSET || \
494                 quota_error a $TSTUSR "write failure, but expect success"
495         OFFSET=$((OFFSET + BUNIT_SZ))
496         cancel_lru_locks osc
497         echo "    Done"
498
499         echo "    Sleep $TIMER seconds ..."
500         sleep $TIMER
501
502         $SHOW_QUOTA_USER
503         $SHOW_QUOTA_GROUP
504         $SHOW_QUOTA_INFO_USER
505         $SHOW_QUOTA_INFO_GROUP
506
507         echo "    Write after timer goes off"
508         # maybe cache write, ignore.
509         $RUNDD count=$BUNIT_SZ seek=$OFFSET || true
510         OFFSET=$((OFFSET + BUNIT_SZ))
511         cancel_lru_locks osc
512         $RUNDD count=$BUNIT_SZ seek=$OFFSET && \
513                 quota_error a $TSTUSR "write success, but expect EDQUOT"
514
515         $SHOW_QUOTA_USER
516         $SHOW_QUOTA_GROUP
517         $SHOW_QUOTA_INFO_USER
518         $SHOW_QUOTA_INFO_GROUP
519
520         echo "    Unlink file to stop timer"
521         rm -f $TESTFILE
522         sync; sleep 1; sync
523         echo "    Done"
524
525         $SHOW_QUOTA_USER
526         $SHOW_QUOTA_GROUP
527         $SHOW_QUOTA_INFO_USER
528         $SHOW_QUOTA_INFO_GROUP
529
530         echo "    Write ..."
531         $RUNDD count=$BUNIT_SZ || quota_error a $TSTUSR "write failure, but expect success"
532         echo "    Done"
533
534         # cleanup
535         rm -f $TESTFILE
536         sync; sleep 3; sync;
537 }
538
539 # block soft limit (start timer, timer goes off, stop timer)
540 test_3() {
541         mkdir -p $DIR/$tdir
542         chmod 0777 $DIR/$tdir
543
544         # 1 bunit on mds and 1 bunit on every ost
545         LIMIT=$(( $BUNIT_SZ * ($OSTCOUNT + 1) ))
546         GRACE=10
547
548         echo "  User quota (soft limit: $LIMIT kbytes  grace: $GRACE seconds)"
549         TESTFILE=$DIR/$tdir/$tfile-0
550
551         $LFS setstripe $TESTFILE -c 1
552         chown $TSTUSR.$TSTUSR $TESTFILE
553
554         $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
555         $LFS setquota -u $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
556
557         test_block_soft $TESTFILE $GRACE
558         resetquota -u $TSTUSR
559
560         echo "  Group quota (soft limit: $LIMIT kbytes  grace: $GRACE seconds)"
561         TESTFILE=$DIR/$tdir/$tfile-1
562
563         $LFS setstripe $TESTFILE -c 1
564         chown $TSTUSR.$TSTUSR $TESTFILE
565
566         $LFS setquota -t -g --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
567         $LFS setquota -g $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
568
569         test_block_soft $TESTFILE $GRACE
570         resetquota -g $TSTUSR
571 }
572 run_test_with_stat 3 "Block soft limit (start timer, timer goes off, stop timer) ==="
573
574 test_file_soft() {
575         TESTFILE=$1
576         LIMIT=$2
577         TIMER=$(($3 * 3 / 2))
578
579         wait_delete_completed
580
581         echo "    Create files to exceed soft limit"
582         $RUNAS createmany -m ${TESTFILE}_ $((LIMIT + 1)) || \
583                 quota_error a $TSTUSR "create failure, but expect success"
584         sync; sleep 1; sync
585         echo "    Done"
586
587         echo "    Create file before timer goes off"
588         $RUNAS touch ${TESTFILE}_before || \
589                 quota_error a $TSTUSR "failed create before timer expired, but expect success"
590         sync; sleep 1; sync
591         echo "    Done"
592
593         echo "    Sleep $TIMER seconds ..."
594         sleep $TIMER
595
596         $SHOW_QUOTA_USER
597         $SHOW_QUOTA_GROUP
598         $SHOW_QUOTA_INFO_USER
599         $SHOW_QUOTA_INFO_GROUP
600
601         echo "    Create file after timer goes off"
602         # the least of inode qunit is 2, so there are at most 3(qunit:2+qtune:1)
603         # inode quota left here
604         $RUNAS touch ${TESTFILE}_after ${TESTFILE}_after1 ${TESTFILE}_after2 || true
605         sync; sleep 1; sync
606         $RUNAS touch ${TESTFILE}_after3 && \
607                 quota_error a $TSTUSR "create after timer expired, but expect EDQUOT"
608         sync; sleep 1; sync
609
610         $SHOW_QUOTA_USER
611         $SHOW_QUOTA_GROUP
612         $SHOW_QUOTA_INFO_USER
613         $SHOW_QUOTA_INFO_GROUP
614
615         echo "    Unlink files to stop timer"
616         find `dirname $TESTFILE` -name "`basename ${TESTFILE}`*" | xargs rm -f
617         echo "    Done"
618
619         echo "    Create file"
620         $RUNAS touch ${TESTFILE}_xxx || \
621                 quota_error a $TSTUSR "touch after timer stop failure, but expect success"
622         sync; sleep 1; sync
623         echo "    Done"
624
625         # cleanup
626         rm -f ${TESTFILE}_xxx
627         sync; sleep 3; sync;
628 }
629
630 # file soft limit (start timer, timer goes off, stop timer)
631 test_4a() {     # was test_4
632         mkdir -p $DIR/$tdir
633         chmod 0777 $DIR/$tdir
634         LIMIT=$(($IUNIT_SZ * 10))       # 10 iunits on mds
635         TESTFILE=$DIR/$tdir/$tfile-0
636
637         GRACE=5
638
639         echo "  User quota (soft limit: $LIMIT files  grace: $GRACE seconds)"
640         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR
641         $LFS setquota -u $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR
642         quota_show_check f u $TSTUSR
643
644         test_file_soft $TESTFILE $LIMIT $GRACE
645         resetquota -u $TSTUSR
646
647         echo "  Group quota (soft limit: $LIMIT files  grace: $GRACE seconds)"
648         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR
649         $LFS setquota -g $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR
650         quota_show_check f g $TSTUSR
651         TESTFILE=$DIR/$tdir/$tfile-1
652
653         test_file_soft $TESTFILE $LIMIT $GRACE
654         resetquota -g $TSTUSR
655
656         # cleanup
657         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
658         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
659 }
660 run_test_with_stat 4a "File soft limit (start timer, timer goes off, stop timer) ==="
661
662 test_4b() {     # was test_4a
663         GR_STR1="1w3d"
664         GR_STR2="1000s"
665         GR_STR3="5s"
666         GR_STR4="1w2d3h4m5s"
667         GR_STR5="5c"
668         GR_STR6="1111111111111111"
669
670         wait_delete_completed
671
672         # test of valid grace strings handling
673         echo "  Valid grace strings test"
674         $LFS setquota -t -u --block-grace $GR_STR1 --inode-grace $GR_STR2 $DIR
675         $LFS quota -u -t $DIR | grep "Block grace time: $GR_STR1"
676         $LFS setquota -t -g --block-grace $GR_STR3 --inode-grace $GR_STR4 $DIR
677         $LFS quota -g -t $DIR | grep "Inode grace time: $GR_STR4"
678
679         # test of invalid grace strings handling
680         echo "  Invalid grace strings test"
681         ! $LFS setquota -t -u --block-grace $GR_STR4 --inode-grace $GR_STR5 $DIR
682         ! $LFS setquota -t -g --block-grace $GR_STR4 --inode-grace $GR_STR6 $DIR
683
684         # cleanup
685         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
686         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
687 }
688 run_test_with_stat 4b "Grace time strings handling ==="
689
690 # chown & chgrp (chown & chgrp successfully even out of block/file quota)
691 test_5() {
692         mkdir -p $DIR/$tdir
693         BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
694         ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
695
696         wait_delete_completed
697
698         echo "  Set quota limit (0 $BLIMIT 0 $ILIMIT) for $TSTUSR.$TSTUSR"
699         $LFS setquota -u $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $DIR
700         $LFS setquota -g $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $DIR
701         quota_show_check a u $TSTUSR
702         quota_show_check a g $TSTUSR
703
704         echo "  Create more than $ILIMIT files and more than $BLIMIT kbytes ..."
705         createmany -m $DIR/$tdir/$tfile-0_ $((ILIMIT + 1)) || \
706                 error "touch failure, expect success"
707         dd if=/dev/zero of=$DIR/$tdir/$tfile-0_1 bs=$BLK_SZ count=$((BLIMIT+1)) || error "write failure, expect success"
708
709         echo "  Chown files to $TSTUSR.$TSTUSR ..."
710         for i in `seq 0 $ILIMIT`; do
711         chown $TSTUSR.$TSTUSR $DIR/$tdir/$tfile-0_$i || \
712                         quota_error a $TSTUSR "chown failure, but expect success"
713         done
714
715         # cleanup
716         unlinkmany $DIR/$tdir/$tfile-0_ $((ILIMIT + 1))
717         sync; sleep 3; sync;
718
719         resetquota -u $TSTUSR
720         resetquota -g $TSTUSR
721 }
722 run_test_with_stat 5 "Chown & chgrp successfully even out of block/file quota ==="
723
724 # block quota acquire & release
725 test_6() {
726         if [ $OSTCOUNT -lt 2 ]; then
727                 skip_env "$OSTCOUNT < 2, too few osts"
728                 return 0;
729         fi
730
731         wait_delete_completed
732
733         mkdir -p $DIR/$tdir
734         chmod 0777 $DIR/$tdir
735
736         LIMIT=$((BUNIT_SZ * (OSTCOUNT + 1) * 5)) # 5 bunits per server
737         FILEA="$DIR/$tdir/$tfile-0_a"
738         FILEB="$DIR/$tdir/$tfile-0_b"
739
740         echo "  Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR"
741         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
742         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
743         quota_show_check b u $TSTUSR
744         quota_show_check b g $TSTUSR
745
746         echo "  Create filea on OST0 and fileb on OST1"
747         $LFS setstripe $FILEA -i 0 -c 1
748         $LFS setstripe $FILEB -i 1 -c 1
749         chown $TSTUSR.$TSTUSR $FILEA
750         chown $TSTUSR.$TSTUSR $FILEB
751
752         echo "  Exceed quota limit ..."
753         RUNDD="$RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ"
754         $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
755                 quota_error a $TSTUSR "write filea failure, but expect success"
756
757         cancel_lru_locks osc
758         $SHOW_QUOTA_USER
759         $SHOW_QUOTA_GROUP
760         $RUNDD seek=$LIMIT count=$((BUNIT_SZ * OSTCOUNT)) && \
761                 quota_error a $TSTUSR "write filea success, but expect EDQUOT"
762         cancel_lru_locks osc
763         echo "  Write to OST1 return EDQUOT"
764         # this write maybe cache write, ignore it's failure
765         RUNDD="$RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ"
766         $RUNDD count=$(($BUNIT_SZ * 2)) || true
767         cancel_lru_locks osc
768         $SHOW_QUOTA_USER
769         $SHOW_QUOTA_GROUP
770         $RUNDD count=$((BUNIT_SZ * 2)) seek=$((BUNIT_SZ *2)) && \
771                 quota_error a $TSTUSR "write fileb success, but expect EDQUOT"
772
773         echo "  Remove filea to let OST0 release quota"
774         rm -f $FILEA
775
776         if at_is_enabled; then
777             timeout=$(at_max_get mds)
778         else
779             timeout=$(lctl get_param -n timeout)
780         fi
781         count=$((timeout / 5))
782         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
783
784         while [ $((count--)) -gt 0 ]; do
785                 sync && sleep 5
786
787                 OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
788                 if [ -z $OST0_QUOTA_HOLD ]; then
789                         error "System is error when query quota for block (U:$TSTUSR)."
790                 else
791                         [ $OST0_QUOTA_HOLD -gt $BUNIT_SZ ] && continue
792                 fi
793
794                 break
795         done
796
797         [ ! $count -gt 0 ] && error "Release quota for block timeout (U:$TSTUSR)."
798         $SHOW_QUOTA_USER
799
800         while [ $((count--)) -gt 0 ]; do
801                 sync && sleep 5
802
803                 OST0_QUOTA_HOLD=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`
804                 if [ -z $OST0_QUOTA_HOLD ]; then
805                         error "System is error when query quota for block (G:$TSTUSR)."
806                 else
807                         [ $OST0_QUOTA_HOLD -gt $BUNIT_SZ ] && continue
808                 fi
809
810                 break
811         done
812
813         [ ! $count -gt 0 ] && error "Release quota for block timeout (G:$TSTUSR)."
814         $SHOW_QUOTA_GROUP
815
816         echo "  Write to OST1"
817         $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
818                 quota_error a $TSTUSR "write fileb failure, expect success"
819         echo "  Done"
820
821         # cleanup
822         rm -f $FILEB
823         sync; sleep 3; sync;
824
825         resetquota -u $TSTUSR
826         resetquota -g $TSTUSR
827         return 0
828 }
829 run_test_with_stat 6 "Block quota acquire & release ========="
830
831 # quota recovery (block quota only by now)
832 test_7()
833 {
834         mkdir -p $DIR/$tdir
835         chmod 0777 $DIR/$tdir
836
837         wait_delete_completed
838
839         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) ))
840         TESTFILE="$DIR/$tdir/$tfile-0"
841
842         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
843
844         $LFS setstripe $TESTFILE -c 1
845         chown $TSTUSR.$TSTUSR $TESTFILE
846
847         echo "  Write to OST0..."
848         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ || \
849                 quota_error u $TSTUSR "write failure, but expect success"
850
851         #define OBD_FAIL_OBD_DQACQ               0x604
852         lustre_fail mds  0x604
853         echo "  Remove files on OST0"
854         rm -f $TESTFILE
855         lustre_fail mds  0
856
857         echo "  Trigger recovery..."
858         OSC0_UUID="`$LCTL dl | awk '$3 ~ /osc/ { print $1 }'`"
859         for i in $OSC0_UUID; do
860                 $LCTL --device $i activate || error "activate osc failed!"
861         done
862
863         # sleep a while to wait for recovery done
864         sleep 20
865
866         # check limits
867         PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
868         TOTAL_LIMIT="`$LFS quota -v -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
869         [ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
870         echo "  total limits = $TOTAL_LIMIT"
871
872         OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
873         [ -z "$OST0_UUID" ] && OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
874         OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
875         [ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
876         echo "  limits on $OST0_UUID = $OST0_LIMIT"
877
878         # cleanup
879         resetquota -u $TSTUSR
880 }
881 run_test_with_stat 7 "Quota recovery (only block limit) ======"
882
883 # run dbench with quota enabled
884 test_8() {
885         mkdir -p $DIR/$tdir
886         BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
887         FILE_LIMIT=1000000
888
889         wait_delete_completed
890
891         echo "  Set enough high limit for user: $TSTUSR"
892         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
893         echo "  Set enough high limit for group: $TSTUSR"
894         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
895
896         chmod 0777 $DIR/$tdir
897         local duration=""
898         [ "$SLOW" = "no" ] && duration=" -t 120"
899         $RUNAS bash rundbench -D $DIR/$tdir 3 $duration || quota_error a $TSTUSR "dbench failed!"
900
901         rm -rf $DIR/$tdir
902         sync; sleep 3; sync;
903
904         return 0
905 }
906 run_test_with_stat 8 "Run dbench with quota enabled ==========="
907
908 # run for fixing bug10707, it needs a big room. test for 64bit
909 KB=1024
910 GB=$((KB * 1024 * 1024))
911 # Use this as dd bs to decrease time
912 # inode->i_blkbits = min(PTLRPC_MAX_BRW_BITS+1, LL_MAX_BLKSIZE_BITS);
913 blksize=$((1 << 21)) # 2Mb
914 size_file=$((GB * 9 / 2))
915 # this check is just for test9 and test10
916 OST0_MIN=4900000 #4.67G
917 check_whether_skip () {
918     OST0_SIZE=`$LFS df $DIR | awk '/\[OST:0\]/ {print $4}'`
919     log "OST0_SIZE: $OST0_SIZE  required: $OST0_MIN"
920     if [ $OST0_SIZE -lt $OST0_MIN ]; then
921         echo "WARN: OST0 has less than $OST0_MIN free, skip this test."
922         return 0
923     else
924         return 1
925     fi
926 }
927
928 test_9() {
929         check_whether_skip && return 0
930
931         wait_delete_completed
932
933         set_blk_tunesz 512
934         set_blk_unitsz 1024
935
936         mkdir -p $DIR/$tdir
937         chmod 0777 $DIR/$tdir
938         TESTFILE="$DIR/$tdir/$tfile-0"
939
940         BLK_LIMIT=$((100 * KB * KB)) # 100G
941         FILE_LIMIT=1000000
942         echo "  Set block limit $BLK_LIMIT kbytes to $TSTUSR.$TSTUSR"
943
944         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
945         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
946         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
947         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
948
949         quota_show_check a u $TSTUSR
950         quota_show_check a g $TSTUSR
951
952         echo "  Set stripe"
953         $LFS setstripe $TESTFILE -c 1
954         touch $TESTFILE
955         chown $TSTUSR.$TSTUSR $TESTFILE
956
957         log "    Write the big file of 4.5G ..."
958         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$blksize count=$((size_file / blksize)) || \
959                quota_error a $TSTUSR "(usr) write 4.5G file failure, but expect success"
960
961         $SHOW_QUOTA_USER
962         $SHOW_QUOTA_GROUP
963
964         log "    delete the big file of 4.5G..."
965         $RUNAS rm -f $TESTFILE
966         sync; sleep 3; sync;
967
968         $SHOW_QUOTA_USER
969         $SHOW_QUOTA_GROUP
970
971         RC=$?
972
973         set_blk_unitsz $((128 * 1024))
974         set_blk_tunesz $((128 * 1024 / 2))
975
976         return $RC
977 }
978 run_test_with_stat 9 "run for fixing bug10707(64bit) ==========="
979
980 # run for fixing bug10707, it need a big room. test for 32bit
981 # 2.0 version does not support 32 bit qd_count, so such test is obsolete.
982 test_10() {
983         mkdir -p $DIR/$tdir
984         chmod 0777 $DIR/$tdir
985         check_whether_skip && return 0
986
987         wait_delete_completed
988
989         set_blk_tunesz 512
990         set_blk_unitsz 1024
991
992         # make qd_count 32 bit
993         lustre_fail mds_ost 0xA00
994
995         TESTFILE="$DIR/$tdir/$tfile-0"
996
997         BLK_LIMIT=$((100 * KB * KB)) # 100G
998         FILE_LIMIT=1000000
999
1000         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
1001         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
1002         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
1003         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
1004
1005         quota_show_check a u $TSTUSR
1006         quota_show_check a g $TSTUSR
1007
1008         echo "  Set stripe"
1009         $LFS setstripe $TESTFILE -c 1
1010         touch $TESTFILE
1011         chown $TSTUSR.$TSTUSR $TESTFILE
1012
1013         log "    Write the big file of 4.5 G ..."
1014         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$blksize count=$((size_file / blksize)) || \
1015                 quota_error a $TSTUSR "(usr) write 4.5 G file failure, but expect success"
1016
1017         $SHOW_QUOTA_USER
1018         $SHOW_QUOTA_GROUP
1019
1020         log "    delete the big file of 4.5 G..."
1021         $RUNAS rm -f $TESTFILE
1022         sync; sleep 3; sync;
1023
1024         $SHOW_QUOTA_USER
1025         $SHOW_QUOTA_GROUP
1026
1027         RC=$?
1028
1029         # make qd_count 64 bit
1030         lustre_fail mds_ost 0
1031
1032         set_blk_unitsz $((128 * 1024))
1033         set_blk_tunesz $((128 * 1024 / 2))
1034
1035         return $RC
1036 }
1037 #run_test_with_stat 10 "run for fixing bug10707(32bit) ==========="
1038
1039 # test a deadlock between quota and journal b=11693
1040 test_12() {
1041         mkdir -p $DIR/$tdir
1042         chmod 0777 $DIR/$tdir
1043
1044         [ "$(grep $DIR2 /proc/mounts)" ] || mount_client $DIR2 || \
1045                 { skip_env "Need lustre mounted on $MOUNT2 " && retutn 0; }
1046
1047         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
1048         TESTFILE="$DIR/$tdir/$tfile-0"
1049         TESTFILE2="$DIR2/$tdir/$tfile-1"
1050
1051         wait_delete_completed
1052
1053         echo "   User quota (limit: $LIMIT kbytes)"
1054         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1055
1056         $LFS setstripe $TESTFILE -i 0 -c 1
1057         chown $TSTUSR.$TSTUSR $TESTFILE
1058         $LFS setstripe $TESTFILE2 -i 0 -c 1
1059         chown $TSTUSR2.$TSTUSR2 $TESTFILE2
1060
1061         #define OBD_FAIL_OST_HOLD_WRITE_RPC      0x21f
1062         #define OBD_FAIL_SOME        0x10000000 /* fail N times */
1063         lustre_fail ost $((0x0000021f | 0x10000000)) 1
1064
1065         echo "   step1: write out of block quota ..."
1066         $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 &
1067         DDPID1=$!
1068         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT*2)) &
1069         DDPID=$!
1070
1071         echo  "   step2: testing ......"
1072         local last_size=$(stat -c %s $TESTFILE2) 
1073         local stall_secs=0
1074         local start_secs=$SECONDS
1075         while [ -d /proc/${DDPID1} ]; do
1076             local size=$(stat -c %s $TESTFILE2) 
1077             if [ $size -eq $last_size ]; then
1078                 stall_secs=$[stall_secs+1]
1079             else
1080                 stall_secs=0
1081             fi
1082             if [ $stall_secs -gt 30 ]; then
1083                 lustre_fail ost 0
1084                 quota_error u $TSTUSR2 "giving up: dd stalled (i.e. made no progress) for 30 seconds!"
1085             fi
1086             last_size=$size
1087             sleep 1
1088         done
1089         echo "(dd_pid=$DDPID1, time=$((SECONDS-start_secs)))successful"
1090
1091         #Recover fail_loc and dd will finish soon
1092         lustre_fail ost 0
1093
1094         echo  "   step3: testing ......"
1095         count=0
1096         while [ true ]; do
1097             if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi
1098             count=$[count+1]
1099             if [ $count -gt 150 ]; then
1100                 quota_error u $TSTUSR "dd should be finished!"
1101             fi
1102             sleep 1
1103         done
1104         echo "(dd_pid=$DDPID, time=$count)successful"
1105
1106         rm -f $TESTFILE $TESTFILE2
1107         sync; sleep 3; sync;
1108
1109         resetquota -u $TSTUSR
1110 }
1111 run_test_with_stat 12 "test a deadlock between quota and journal ==="
1112
1113 # test multiple clients write block quota b=11693
1114 test_13() {
1115         mkdir -p $DIR/$tdir
1116         wait_delete_completed
1117
1118         # one OST * 10 + (mds + other OSTs)
1119         LIMIT=$((BUNIT_SZ * 10 + (BUNIT_SZ * OSTCOUNT)))
1120         TESTFILE="$DIR/$tdir/$tfile"
1121
1122         echo "   User quota (limit: $LIMIT kbytes)"
1123         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1124         quota_show_check b u $TSTUSR
1125
1126         $LFS setstripe $TESTFILE -i 0 -c 1
1127         chown $TSTUSR.$TSTUSR $TESTFILE
1128         $LFS setstripe $TESTFILE.2 -i 0 -c 1
1129         chown $TSTUSR.$TSTUSR $TESTFILE.2
1130
1131         echo "   step1: write out of block quota ..."
1132         # one bunit will give mds
1133         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] &
1134         DDPID=$!
1135         $RUNAS dd if=/dev/zero of=$TESTFILE.2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] &
1136         DDPID1=$!
1137
1138         echo  "   step2: testing ......"
1139         count=0
1140         while [ true ]; do
1141             if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi
1142             count=$[count+1]
1143             if [ $count -gt 64 ]; then
1144                 quota_error u $TSTUSR "dd should be finished!"
1145             fi
1146             sleep 1
1147         done
1148         echo "(dd_pid=$DDPID, time=$count)successful"
1149
1150         count=0
1151         while [ true ]; do
1152             if ! ps -p ${DDPID1} > /dev/null 2>&1 ; then break; fi
1153             count=$[count+1]
1154             if [ $count -gt 64 ]; then
1155                 quota_error u $TSTUSR "dd should be finished!"
1156             fi
1157             sleep 1
1158         done
1159         echo "(dd_pid=$DDPID1, time=$count)successful"
1160
1161         sync; sleep 5; sync;
1162
1163         echo  "   step3: checking ......"
1164         fz=`stat -c %s $TESTFILE`
1165         fz2=`stat -c %s $TESTFILE.2`
1166         $SHOW_QUOTA_USER
1167         [ $((fz + fz2)) -lt $((BUNIT_SZ * BLK_SZ * 10)) ] && \
1168                 quota_error u $TSTUSR "files too small $fz + $fz2 < $((BUNIT_SZ * BLK_SZ * 10))"
1169
1170         rm -f $TESTFILE $TESTFILE.2
1171         sync; sleep 3; sync;
1172
1173         resetquota -u $TSTUSR
1174 }
1175 run_test_with_stat 13 "test multiple clients write block quota ==="
1176
1177 check_if_quota_zero(){
1178         line=`$LFS quota -v -$1 $2 $DIR | wc -l`
1179         for i in `seq 3 $line`; do
1180             if [ $i -eq 3 ]; then
1181                 field="3 4 6 7"
1182             else
1183                 field="3 5"
1184             fi
1185             for j in $field; do
1186                 tmp=`$LFS quota -v -$1 $2 $DIR | sed -n ${i}p |
1187                      awk  '{print $'"$j"'}'`
1188                 [ -n "$tmp" ] && [ $tmp -ne 0 ] && $LFS quota -v -$1 $2 $DIR && \
1189                     error "quota on $2 isn't clean"
1190             done
1191         done
1192         echo "pass check_if_quota_zero"
1193 }
1194
1195 test_14a() {    # was test_14 b=12223 -- setting quota on root
1196         TESTFILE="$DIR/$tdir/$tfile"
1197
1198         # reboot the lustre
1199         sync; sleep 5; sync
1200         cleanup_and_setup_lustre
1201         quota_init
1202
1203         mkdir -p $DIR/$tdir
1204
1205         # out of root's file and block quota
1206         $LFS setquota -u root -b 10 -B 10 -i 10 -I 10 $DIR
1207         createmany -m ${TESTFILE} 20 || \
1208             quota_error u root "unexpected: user(root) create files failly!"
1209         dd if=/dev/zero of=$TESTFILE bs=4k count=4096 || \
1210             quota_error u root "unexpected: user(root) write files failly!"
1211         chmod 666 $TESTFILE
1212         $RUNAS dd if=/dev/zero of=${TESTFILE} seek=4096 bs=4k count=4096 && \
1213             quota_error u root "unexpected: user(quota_usr) write a file successfully!"
1214
1215         # trigger the llog
1216         chmod 777 $DIR
1217         for i in `seq 1 10`; do $RUNAS touch ${TESTFILE}a_$i; done
1218         for i in `seq 1 10`; do $RUNAS rm -f ${TESTFILE}a_$i; done
1219
1220         # do the check
1221         dmesg | tail | grep "\-122" |grep llog_obd_origin_add && error "err -122 not found in dmesg"
1222         resetquota -u root
1223         #check_if_quota_zero u root
1224
1225         # clean
1226         unlinkmany ${TESTFILE} 15
1227         rm -f $TESTFILE
1228         sync; sleep 3; sync;
1229 }
1230 run_test_with_stat 14a "test setting quota on root ==="
1231
1232 test_15(){
1233         LIMIT=$((24 * 1024 * 1024 * 1024 * 1024)) # 24 TB
1234         PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
1235
1236         wait_delete_completed
1237
1238         # test for user
1239         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1240         TOTAL_LIMIT="`$LFS quota -v -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
1241         [ $TOTAL_LIMIT -eq $LIMIT ] || error "  (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
1242         echo "  (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
1243         resetquota -u $TSTUSR
1244
1245         # test for group
1246         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1247         TOTAL_LIMIT="`$LFS quota -v -g $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
1248         [ $TOTAL_LIMIT -eq $LIMIT ] || error "  (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
1249         echo "  (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
1250         resetquota -g $TSTUSR
1251         $LFS quotaoff -ug $DIR
1252         do_facet $SINGLEMDS "lctl set_param lquota.mdd_obd-${FSNAME}-MDT*.quota_type=ug" | grep "error writing" && \
1253                 error "fail to set version for $SINGLEMDS"
1254         for j in `seq $OSTCOUNT`; do
1255                 do_facet ost$j "lctl set_param lquota.${FSNAME}-OST*.quota_type=ug" | grep "error writing" && \
1256                         error "fail to set version for ost$j"
1257         done
1258
1259         echo "invalidating quota files"
1260         $LFS quotainv -ug $DIR
1261         $LFS quotainv -ugf $DIR
1262         $LFS quotacheck -ug $DIR
1263 }
1264 run_test_with_stat 15 "set block quota more than 4T ==="
1265
1266 # $1=u/g $2=with qunit adjust or not
1267 test_16_tub() {
1268         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 4))
1269         TESTFILE="$DIR/$tdir/$tfile"
1270         mkdir -p $DIR/$tdir
1271
1272         wait_delete_completed
1273
1274         echo "  User quota (limit: $LIMIT kbytes)"
1275         if [ $1 == "u" ]; then
1276             $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1277             quota_show_check b u $TSTUSR
1278         else
1279             $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1280             quota_show_check b g $TSTUSR
1281         fi
1282
1283         $LFS setstripe $TESTFILE -c 1
1284         chown $TSTUSR.$TSTUSR $TESTFILE
1285
1286         echo "    Write ..."
1287         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((BUNIT_SZ * 4)) || \
1288             quota_error a $TSTUSR "(usr) write failure, but expect success"
1289         echo "    Done"
1290         echo "    Write out of block quota ..."
1291         # this time maybe cache write,  ignore it's failure
1292         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) || true
1293         # flush cache, ensure noquota flag is setted on client
1294         cancel_lru_locks osc
1295         if [ $2 -eq 1 ]; then
1296             $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) || \
1297                 quota_error a $TSTUSR "(write failure, but expect success"
1298         else
1299             $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) && \
1300                 quota_error a $TSTUSR "(write success, but expect EDQUOT"
1301         fi
1302
1303         rm -f $TESTFILE
1304         sync; sleep 3; sync;
1305         resetquota -$1 $TSTUSR
1306 }
1307
1308 # test without adjusting qunit
1309 # 2.0 version does not support WITHOUT_CHANGE_QS, so such test is obsolete
1310 test_16 () {
1311         set_blk_tunesz $((BUNIT_SZ * 2))
1312         set_blk_unitsz $((BUNIT_SZ * 4))
1313         for i in u g; do
1314             for j in 0 1; do
1315                 # define OBD_FAIL_QUOTA_WITHOUT_CHANGE_QS    0xA01
1316                 echo " grp/usr: $i, adjust qunit: $j"
1317                 echo "-------------------------------"
1318                 [ $j -eq 1 ] && lustre_fail mds_ost 0
1319                 [ $j -eq 0 ] && lustre_fail mds_ost 0xA01
1320                 test_16_tub $i $j
1321             done
1322         done
1323         set_blk_unitsz $((128 * 1024))
1324         set_blk_tunesz $((128 * 1024 / 2))
1325 }
1326 #run_test_with_stat 16 "test without adjusting qunit"
1327
1328 # run for fixing bug14526, failed returned quota reqs shouldn't ruin lustre.
1329 test_17() {
1330         set_blk_tunesz 512
1331         set_blk_unitsz 1024
1332
1333         wait_delete_completed
1334
1335         #define OBD_FAIL_QUOTA_RET_QDATA | OBD_FAIL_ONCE
1336         lustre_fail ost 0x80000A02
1337
1338         TESTFILE="$DIR/$tdir/$tfile-a"
1339         TESTFILE2="$DIR/$tdir/$tfile-b"
1340         mkdir -p $DIR/$tdir
1341
1342         BLK_LIMIT=$((100 * 1024)) # 100M
1343
1344         log "  Set enough high limit(block:$BLK_LIMIT) for user: $TSTUSR"
1345         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
1346         log "  Set enough high limit(block:$BLK_LIMIT) for group: $TSTUSR"
1347         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
1348
1349         quota_show_check b u $TSTUSR
1350         quota_show_check b g $TSTUSR
1351
1352         touch $TESTFILE
1353         chown $TSTUSR.$TSTUSR $TESTFILE
1354         touch $TESTFILE2
1355         chown $TSTUSR.$TSTUSR $TESTFILE2
1356
1357         log "    Write the test file1 ..."
1358         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$BLK_SZ count=$(( 10 * 1024 )) \
1359             || quota_error a $TSTUSR "write 10M file failure"
1360
1361         $SHOW_QUOTA_USER
1362         $SHOW_QUOTA_GROUP
1363
1364         log "    write the test file2 ..."
1365         $RUNAS dd if=/dev/zero of=$TESTFILE2  bs=$BLK_SZ count=$(( 10 * 1024 )) \
1366             || quota_error a $TSTUSR "write 10M file failure"
1367
1368         $SHOW_QUOTA_USER
1369         $SHOW_QUOTA_GROUP
1370
1371         rm -f $TESTFILE $TESTFILE2
1372         RC=$?
1373         sync; sleep 3; sync;
1374
1375         # make qd_count 64 bit
1376         lustre_fail ost 0
1377
1378         set_blk_unitsz $((128 * 1024))
1379         set_blk_tunesz $((128 * 1024 / 2))
1380
1381         resetquota -u $TSTUSR
1382         resetquota -g $TSTUSR
1383
1384         return $RC
1385 }
1386 run_test_with_stat 17 "run for fixing bug14526 ==========="
1387
1388 # test when mds takes a long time to handle a quota req so that
1389 # the ost has dropped it, the ost still could work well b=14840
1390 test_18() {
1391         LIMIT=$((100 * 1024 * 1024)) # 100G
1392         TESTFILE="$DIR/$tdir/$tfile"
1393         mkdir -p $DIR/$tdir
1394
1395         wait_delete_completed
1396
1397         set_blk_tunesz 512
1398         set_blk_unitsz 1024
1399
1400         log "   User quota (limit: $LIMIT kbytes)"
1401         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1402         quota_show_check b u $TSTUSR
1403
1404         $LFS setstripe $TESTFILE -i 0 -c 1
1405         chown $TSTUSR.$TSTUSR $TESTFILE
1406
1407         #define OBD_FAIL_MDS_BLOCK_QUOTA_REQ      0x13c
1408         lustre_fail mds 0x13c
1409
1410         log "   step1: write 100M block ..."
1411         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 100)) &
1412         DDPID=$!
1413
1414         sleep 5
1415         lustre_fail mds 0
1416
1417         echo  "   step2: testing ......"
1418         count=0
1419         if at_is_enabled; then
1420             timeout=$(at_max_get mds)
1421         else
1422             timeout=$(lctl get_param -n timeout)
1423         fi
1424         while [ true ]; do
1425             if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi
1426             count=$[count+1]
1427             if [ $count -gt $((4 * $timeout)) ]; then
1428                 quota_error u $TSTUSR "count=$count dd should be finished!"
1429             fi
1430             sleep 1
1431         done
1432         log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
1433         sync
1434         cancel_lru_locks mdc
1435         cancel_lru_locks osc
1436
1437         testfile_size=$(stat -c %s $TESTFILE)
1438         [ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \
1439             quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!"
1440         $SHOW_QUOTA_USER
1441         rm -f $TESTFILE
1442         sync
1443
1444         resetquota -u $TSTUSR
1445         set_blk_unitsz $((128 * 1024))
1446         set_blk_tunesz $((128 * 1024 / 2))
1447 }
1448 run_test_with_stat 18 "run for fixing bug14840 ==========="
1449
1450 # test when mds drops a quota req, the ost still could work well b=14840
1451 test_18a() {
1452         LIMIT=$((100 * 1024 * 1024)) # 100G
1453         TESTFILE="$DIR/$tdir/$tfile-a"
1454         mkdir -p $DIR/$tdir
1455
1456         wait_delete_completed
1457
1458         set_blk_tunesz 512
1459         set_blk_unitsz 1024
1460
1461         log "   User quota (limit: $LIMIT kbytes)"
1462         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1463         quota_show_check b u $TSTUSR
1464
1465         $LFS setstripe $TESTFILE -i 0 -c 1
1466         chown $TSTUSR.$TSTUSR $TESTFILE
1467
1468         #define OBD_FAIL_MDS_DROP_QUOTA_REQ | OBD_FAIL_ONCE   0x8000013d
1469         lustre_fail mds 0x8000013d
1470
1471         log "   step1: write 100M block ..."
1472         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 100)) &
1473         DDPID=$!
1474
1475         echo  "   step2: testing ......"
1476         count=0
1477         if at_is_enabled; then
1478             timeout=$(at_max_get mds)
1479         else
1480             timeout=$(lctl get_param -n timeout)
1481         fi
1482         while [ true ]; do
1483             if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi
1484             count=$[count+1]
1485             if [ $count -gt $((6 * $timeout)) ]; then
1486                 lustre_fail mds 0
1487                 quota_error u $TSTUSR "count=$count dd should be finished!"
1488             fi
1489             sleep 1
1490         done
1491         log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
1492
1493         lustre_fail mds 0
1494         rm -f $TESTFILE
1495         sync
1496
1497         resetquota -u $TSTUSR
1498         set_blk_unitsz $((128 * 1024))
1499         set_blk_tunesz $((128 * 1024 / 2))
1500 }
1501 run_test_with_stat 18a "run for fixing bug14840 ==========="
1502
1503 # test when mds do failover, the ost still could work well without trigger
1504 # watchdog b=14840
1505 test_18bc_sub() {
1506         type=$1
1507
1508         LIMIT=$((110 * 1024 )) # 110M
1509         TESTFILE="$DIR/$tdir/$tfile"
1510         mkdir -p $DIR/$tdir
1511
1512         wait_delete_completed
1513
1514         set_blk_tunesz 512
1515         set_blk_unitsz 1024
1516
1517         log "   User quota (limit: $LIMIT kbytes)"
1518         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1519         quota_show_check b u $TSTUSR
1520
1521         $LFS setstripe $TESTFILE -i 0 -c 1
1522         chown $TSTUSR.$TSTUSR $TESTFILE
1523
1524         timeout=$(sysctl -n lustre.timeout)
1525
1526         if [ $type = "directio" ]; then
1527             log "   write 100M block(directio) ..."
1528             $RUNAS $DIRECTIO write $TESTFILE 0 100 $((BLK_SZ * 1024)) &
1529         else
1530             log "   write 100M block(normal) ..."
1531             $RUNAS dd if=/dev/zero of=$TESTFILE bs=$((BLK_SZ * 1024)) count=100 &
1532         fi
1533
1534         DDPID=$!
1535         do_facet $SINGLEMDS "$LCTL conf_param ${FSNAME}-MDT*.mdd.quota_type=ug"
1536
1537         log "failing mds for $((2 * timeout)) seconds"
1538         fail $SINGLEMDS $((2 * timeout))
1539
1540         # check if quotaon successful
1541         $LFS quota -u $TSTUSR $MOUNT 2>&1 | grep -q "quotas are not enabled"
1542         if [ $? -eq 0 ]; then
1543             error "quotaon failed!"
1544             rm -rf $TESTFILE
1545             return
1546         fi
1547
1548         count=0
1549         if at_is_enabled; then
1550             timeout=$(at_max_get mds)
1551         else
1552             timeout=$(lctl get_param -n timeout)
1553         fi
1554         while [ true ]; do
1555             if ! ps -p ${DDPID} > /dev/null 2>&1; then break; fi
1556             if [ $((++count % (2 * timeout) )) -eq 0 ]; then
1557                 log "it took $count second"
1558             fi
1559             sleep 1
1560         done
1561         log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
1562         sync
1563         cancel_lru_locks mdc
1564         cancel_lru_locks osc
1565
1566         testfile_size=$(stat -c %s $TESTFILE)
1567         [ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \
1568             quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!"
1569         $SHOW_QUOTA_USER
1570         rm -f $TESTFILE
1571         sync
1572
1573         resetquota -u $TSTUSR
1574         set_blk_unitsz $((128 * 1024))
1575         set_blk_tunesz $((128 * 1024 / 2))
1576 }
1577
1578 # test when mds does failover, the ost still could work well
1579 # this test shouldn't trigger watchdog b=14840
1580 test_18b() {
1581         test_18bc_sub normal
1582         test_18bc_sub directio
1583         # check if watchdog is triggered
1584         do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log
1585         watchdog=`awk '/test 18b/ {start = 1;}
1586                        /Service thread pid/ && /was inactive/ {
1587                                if (start) {
1588                                        print;
1589                                }
1590                        }' $TMP/lustre-log-${TESTNAME}.log`
1591         [ `echo "$watchdog" | wc -l` -ge 3 ] && error "$watchdog"
1592         rm -f $TMP/lustre-log-${TESTNAME}.log
1593 }
1594 run_test_with_stat 18b "run for fixing bug14840(mds failover, no watchdog) ==========="
1595
1596 # test when mds does failover, the ost still could work well
1597 # this test will prevent OST_DISCONNET from happening b=14840
1598 test_18c() {
1599         # define OBD_FAIL_OST_DISCONNECT_NET 0x202(disable ost_disconnect for osts)
1600         lustre_fail ost  0x202
1601         test_18bc_sub normal
1602         test_18bc_sub directio
1603         lustre_fail ost  0
1604 }
1605 run_test_with_stat 18c "run for fixing bug14840(mds failover, OST_DISCONNECT is disabled) ==========="
1606
1607 run_to_block_limit() {
1608         local LIMIT=$((($OSTCOUNT + 1) * $BUNIT_SZ))
1609         local TESTFILE=$1
1610         wait_delete_completed
1611
1612         # set 1 Mb quota unit size
1613         set_blk_tunesz 512
1614         set_blk_unitsz 1024
1615
1616         # bind file to a single OST
1617         $LFS setstripe -c 1 $TESTFILE
1618         chown $TSTUSR.$TSTUSR $TESTFILE
1619
1620         echo "  User quota (limit: $LIMIT kbytes)"
1621         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1622         quota_show_check b u $TSTUSR
1623         echo "  Updating quota limits"
1624         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1625         quota_show_check b u $TSTUSR
1626
1627         RUNDD="$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ"
1628         $RUNDD count=$BUNIT_SZ || quota_error u $TSTUSR "(usr) write failure, but expect success"
1629         # for now page cache of TESTFILE may still be dirty,
1630         # let's push it to the corresponding OST, this will also
1631         # cache NOQUOTA on the client from OST's reply
1632         cancel_lru_locks osc
1633         $RUNDD seek=$BUNIT_SZ && quota_error u $TSTUSR "(usr) write success, should be EDQUOT"
1634 }
1635
1636 test_19() {
1637         # 1 Mb bunit per each MDS/OSS
1638         local TESTFILE="$DIR/$tdir/$tfile"
1639         mkdir -p $DIR/$tdir
1640
1641         run_to_block_limit $TESTFILE
1642         $SHOW_QUOTA_USER
1643
1644         # cleanup
1645         rm -f $TESTFILE
1646         resetquota -u $TSTUSR
1647
1648         set_blk_unitsz $((128 * 1024))
1649         set_blk_tunesz $((128 * 1024 / 2))
1650
1651 }
1652 run_test_with_stat 19 "test if administrative limits updates do not zero operational limits (14790) ==="
1653
1654 test_20()
1655 {
1656         LSTR=(1t 2g 3m 4k) # limits strings
1657         LVAL=($[1*1024*1024*1024] $[2*1024*1024] $[3*1024*1024] $[4*1024]) # limits values
1658
1659         $LFS setquota -u $TSTUSR --block-softlimit ${LSTR[0]} \
1660                                  $MOUNT || error "could not set quota limits"
1661
1662         $LFS setquota -u $TSTUSR --block-hardlimit ${LSTR[1]} \
1663                                  --inode-softlimit ${LSTR[2]} \
1664                                  --inode-hardlimit ${LSTR[3]} \
1665                                  $MOUNT || error "could not set quota limits"
1666
1667         ($LFS quota -v -u $TSTUSR $MOUNT  | \
1668             grep -E '^ *'$MOUNT' *[0-9]+\** *'${LVAL[0]}' *'${LVAL[1]}' *[0-9]+\** *'${LVAL[2]}' *'${LVAL[3]}) \
1669                  || error "lfs quota output is unexpected"
1670
1671         resetquota -u $TSTUSR
1672 }
1673 run_test_with_stat 20 "test if setquota specifiers work properly (15754)"
1674
1675 test_21_sub() {
1676         local testfile=$1
1677         local blk_number=$2
1678         local seconds=$3
1679
1680         time=$(($(date +%s) + seconds))
1681         while [ $(date +%s) -lt $time ]; do
1682             $RUNAS dd if=/dev/zero of=$testfile  bs=$BLK_SZ count=$blk_number > /dev/null 2>&1
1683             rm -f $testfile
1684         done
1685 }
1686
1687 # run for fixing bug16053, setquota shouldn't fail when writing and
1688 # deleting are happening
1689 test_21() {
1690         set_blk_tunesz 512
1691         set_blk_unitsz 1024
1692
1693         wait_delete_completed
1694
1695         TESTFILE="$DIR/$tdir/$tfile"
1696
1697         BLK_LIMIT=$((10 * 1024 * 1024)) # 10G
1698         FILE_LIMIT=1000000
1699
1700         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
1701         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $MOUNT
1702         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
1703         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $MOUNT
1704
1705         # repeat writing on a 1M file
1706         test_21_sub ${TESTFILE}_1 1024 30 &
1707         DDPID1=$!
1708         # repeat writing on a 128M file
1709         test_21_sub ${TESTFILE}_2 $((1024 * 128)) 30 &
1710         DDPID2=$!
1711
1712         time=$(($(date +%s) + 30))
1713         i=1
1714         while [ $(date +%s) -lt $time ]; do
1715             log "  Set quota for $i times"
1716             $LFS setquota -u $TSTUSR -b 0 -B $((BLK_LIMIT + 1024 * i)) -i 0 -I $((FILE_LIMIT + i)) $MOUNT
1717             $LFS setquota -g $TSTUSR -b 0 -B $((BLK_LIMIT + 1024 * i)) -i 0 -I $((FILE_LIMIT + i)) $MOUNT
1718             i=$((i+1))
1719             sleep 1
1720         done
1721
1722         count=0
1723         while [ true ]; do
1724             if ! ps -p ${DDPID1} > /dev/null 2>&1; then break; fi
1725             count=$[count+1]
1726             if [ $count -gt 60 ]; then
1727                 quota_error a $TSTUSR "dd should be finished!"
1728             fi
1729             sleep 1
1730         done
1731         echo "(dd_pid=$DDPID1, time=$count)successful"
1732
1733         count=0
1734         while [ true ]; do
1735             if ! ps -p ${DDPID2} > /dev/null 2>&1; then break; fi
1736             count=$[count+1]
1737             if [ $count -gt 60 ]; then
1738                 quota_error a $TSTUSR "dd should be finished!"
1739             fi
1740             sleep 1
1741         done
1742         echo "(dd_pid=$DDPID2, time=$count)successful"
1743
1744         set_blk_unitsz $((128 * 1024))
1745         set_blk_tunesz $((128 * 1024 / 2))
1746         resetquota -u $TSTUSR
1747         resetquota -g $TSTUSR
1748
1749         return $RC
1750 }
1751 run_test_with_stat 21 "run for fixing bug16053 ==========="
1752
1753 test_22() {
1754         quota_save_version "ug3"
1755
1756         stopall
1757         mount
1758         setupall
1759
1760         echo "checking parameters"
1761
1762         do_facet $SINGLEMDS "lctl get_param mdd.${FSNAME}-MDT*.quota_type" | grep "ug3" || error "admin failure"
1763         do_facet ost1 "lctl get_param obdfilter.*.quota_type" | grep "ug3" || error "op failure"
1764
1765         quota_init
1766 }
1767 run_test_with_stat 22 "test if quota_type saved as permanent parameter ===="
1768
1769 test_23_sub() {
1770         mkdir -p $DIR/$tdir
1771         chmod 0777 $DIR/$tdir
1772         TESTFILE="$DIR/$tdir/$tfile-0"
1773         rm -f $TESTFILE
1774         local bs_unit=$((1024*1024))
1775         LIMIT=$1
1776
1777         wait_delete_completed
1778
1779         # test for user
1780         log "  User quota (limit: $LIMIT kbytes)"
1781         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1782         sleep 3
1783         quota_show_check b u $TSTUSR
1784
1785         $LFS setstripe $TESTFILE -c 1
1786         chown $TSTUSR.$TSTUSR $TESTFILE
1787
1788         log "    Step1: trigger quota with 0_DIRECT"
1789         log "      Write half of file"
1790         $RUNAS $DIRECTIO write $TESTFILE 0 $(($LIMIT/1024/2)) $bs_unit || \
1791                 quota_error u $TSTUSR "(1) write failure, but expect success: $LIMIT"
1792         log "      Write out of block quota ..."
1793         $RUNAS $DIRECTIO write $TESTFILE $(($LIMIT/1024/2)) $(($LIMIT/1024/2)) $bs_unit && \
1794                 quota_error u $TSTUSR "(2) write success, but expect EDQUOT: $LIMIT"
1795         log "    Step1: done"
1796
1797         log "    Step2: rewrite should succeed"
1798         $RUNAS $DIRECTIO write $TESTFILE 0 1 $bs_unit || \
1799                 quota_error u $TSTUSR "(3) write failure, but expect success: $LIMIT"
1800         log "    Step2: done"
1801
1802         rm -f $TESTFILE
1803         wait_delete_completed
1804         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
1805         OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1806         echo $OST0_QUOTA_USED
1807         [ $OST0_QUOTA_USED -ne 0 ] && \
1808             ($SHOW_QUOTA_USER; quota_error u $TSTUSR "quota deleted isn't released")
1809         $SHOW_QUOTA_USER
1810         resetquota -u $TSTUSR
1811 }
1812
1813 test_23() {
1814         log "run for $((OSTCOUNT * 4))MB test file"
1815         test_23_sub $((OSTCOUNT * 4 * 1024))
1816
1817         OST0_MIN=120000
1818         check_whether_skip && return 0
1819         log "run for $((OSTCOUNT * 40))MB test file"
1820         test_23_sub $((OSTCOUNT * 40 * 1024))
1821 }
1822 run_test_with_stat 23 "run for fixing bug16125 ==========="
1823
1824 test_24() {
1825         local TESTFILE="$DIR/$tdir/$tfile"
1826         mkdir -p $DIR/$tdir
1827
1828         run_to_block_limit $TESTFILE
1829         $SHOW_QUOTA_USER | grep '*' || error "no matching *"
1830
1831         # cleanup
1832         rm -f $TESTFILE
1833         resetquota -u $TSTUSR
1834
1835         set_blk_unitsz $((128 * 1024))
1836         set_blk_tunesz $((128 * 1024 / 2))
1837         
1838 }
1839 run_test_with_stat 24 "test if lfs draws an asterix when limit is reached (16646) ==========="
1840
1841 show_quota() {
1842         if [ $1 = "-u" ]; then
1843                 if [ $2 = "$TSTUSR" ]; then
1844                         $SHOW_QUOTA_USER
1845                 else
1846                         $SHOW_QUOTA_USER2
1847                 fi
1848         else
1849                 if [ $2 = "$TSTUSR" ]; then
1850                         $SHOW_QUOTA_GROUP
1851                 else
1852                         $SHOW_QUOTA_GROUP2
1853                 fi
1854         fi
1855 }
1856
1857 test_25_sub() {
1858         mkdir -p $DIR/$tdir
1859         chmod 0777 $DIR/$tdir
1860         TESTFILE="$DIR/$tdir/$tfile-0"
1861         rm -f $TESTFILE
1862         LIMIT=$(( $BUNIT_SZ * ($OSTCOUNT + 1) + 4096 ))
1863
1864         wait_delete_completed
1865
1866         # set quota for $TSTUSR
1867         log "setquota for $TSTUSR"
1868         $LFS setquota $1 $TSTUSR -b $LIMIT -B $LIMIT -i 10 -I 10 $DIR
1869         sleep 3
1870         if [ "$1" == "-u" ]; then
1871                 quota_show_check a u $TSTUSR
1872         else
1873                 quota_show_check a g $TSTUSR
1874         fi
1875
1876         # set quota for $TSTUSR2
1877         log "setquota for $TSTUSR2"
1878         $LFS setquota $1 $TSTUSR2 -b $LIMIT -B $LIMIT -i 10 -I 10 $DIR
1879         sleep 3
1880         if [ "$1" == "-u" ]; then
1881                 quota_show_check a u $TSTUSR2
1882         else
1883                 quota_show_check a g $TSTUSR2
1884         fi
1885
1886         # set stripe index to 0
1887         log "setstripe for $DIR/$tdir to 0"
1888         $LFS setstripe $DIR/$tdir -c 1 -i 0
1889         MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
1890         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
1891         MDS_QUOTA_USED_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
1892         OST0_QUOTA_USED_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1893         MDS_QUOTA_USED2_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
1894         OST0_QUOTA_USED2_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1895
1896         # TSTUSR write 4M
1897         log "$TSTUSR write 4M to $TESTFILE"
1898         $RUNAS dd if=/dev/zero of=$TESTFILE bs=4K count=1K || quota_error a $TSTUSR "dd failed"
1899         sync
1900         show_quota $1 $TSTUSR
1901         show_quota $1 $TSTUSR2
1902         MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
1903         [ $MDS_QUOTA_USED_NEW -ne $((MDS_QUOTA_USED_OLD + 1)) ] && \
1904                 quota_error a $TSTUSR "$TSTUSR inode quota usage error: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
1905         OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1906         OST0_QUOTA_USED_DELTA=$((OST0_QUOTA_USED_NEW - OST0_QUOTA_USED_OLD))
1907         [ $OST0_QUOTA_USED_DELTA -lt 4096 ] && \
1908                 quota_error a $TSTUSR "$TSTUSR block quota usage error: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
1909
1910         # chown/chgrp from $TSTUSR to $TSTUSR2
1911         if [ $1 = "-u" ]; then
1912                 log "chown from $TSTUSR to $TSTUSR2"
1913                 chown $TSTUSR2 $TESTFILE || quota_error u $TSTUSR2 "chown failed"
1914         else
1915                 log "chgrp from $TSTUSR to $TSTUSR2"
1916                 chgrp $TSTUSR2 $TESTFILE || quota_error g $TSTUSR2 "chgrp failed"
1917         fi
1918         sync
1919         show_quota $1 $TSTUSR
1920         show_quota $1 $TSTUSR2
1921         MDS_QUOTA_USED2_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
1922         [ $MDS_QUOTA_USED2_NEW -ne $((MDS_QUOTA_USED2_OLD + 1)) ] && \
1923                 quota_error a $TSTUSR2 "$TSTUSR2 inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED2_OLD|$MDS_QUOTA_USED2_NEW]"
1924         OST0_QUOTA_USED2_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1925         # when chown, the quota on ost could be displayed out of quota temporarily. Delete the '*' in this situation. b=20433
1926         OST0_QUOTA_USED2_NEW=${OST0_QUOTA_USED2_NEW%\*}
1927         OST0_QUOTA_USED2_DELTA=$((OST0_QUOTA_USED2_NEW - OST0_QUOTA_USED2_OLD))
1928         [ $OST0_QUOTA_USED2_DELTA -ne $OST0_QUOTA_USED_DELTA ] && \
1929                 quota_error a $TSTUSR2 "$TSTUSR2 block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED2_OLD|$OST0_QUOTA_USED2_NEW]"
1930         MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
1931         [ $MDS_QUOTA_USED_NEW -ne $MDS_QUOTA_USED_OLD ] && \
1932                 quota_error a $TSTUSR "$TSTUSR inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
1933         OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
1934         [ $OST0_QUOTA_USED_NEW -ne $OST0_QUOTA_USED_OLD ] && \
1935                 quota_error a $TSTUSR "$TSTUSR block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
1936
1937         rm -f $TESTFILE
1938         wait_delete_completed
1939         resetquota $1 $TSTUSR
1940         resetquota $1 $TSTUSR2
1941 }
1942
1943 test_25() {
1944         log "run for chown case"
1945         test_25_sub -u
1946
1947         log "run for chgrp case"
1948         test_25_sub -g
1949 }
1950 run_test_with_stat 25 "test whether quota usage is transfered when chown/chgrp (18081) ==========="
1951
1952 test_26() {
1953         mkdir -p $DIR/$tdir
1954         chmod 0777 $DIR/$tdir
1955         TESTFILE="$DIR/$tdir/$tfile-0"
1956         TESTFILE2="$DIR/$tdir/$tfile-1"
1957         set_blk_tunesz 512
1958         set_blk_unitsz 1024
1959
1960         wait_delete_completed
1961
1962         # every quota slave gets 20MB
1963         b_limit=$(((OSTCOUNT + 1) * 20 * 1024))
1964         log "limit: ${b_limit}KB"
1965         $LFS setquota -u $TSTUSR -b 0 -B $b_limit -i 0 -I 0 $DIR
1966         sleep 3
1967         quota_show_check b u $TSTUSR
1968
1969         $LFS setstripe $TESTFILE  -c 1 -i 0
1970         $LFS setstripe $TESTFILE2 -c 1 -i 0
1971         chown $TSTUSR.$TSTUSR $TESTFILE
1972         chown $TSTUSR.$TSTUSR $TESTFILE2
1973
1974         #define OBD_FAIL_QUOTA_DELAY_REL         0xA03
1975         lustre_fail ost 0xA03
1976
1977         log "    Write the first file..."
1978         $RUNAS $DIRECTIO write $TESTFILE 0 10 $((BLK_SZ * 1024)) || quota_error u $TSTUSR "write failure, but expect success"
1979         log "    Delete the first file..."
1980         rm -f $TESTFILE
1981
1982
1983         wait_delete_completed
1984
1985         log "    Write the second file..."
1986         $RUNAS $DIRECTIO write $TESTFILE2 0 10 $((BLK_SZ * 1024)) || quota_error u $TSTUSR "write failure, but expect success"
1987         log "    Delete the second file..."
1988         rm -f $TESTFILE2
1989
1990         lustre_fail ost 0
1991         set_blk_unitsz $((128 * 1024))
1992         set_blk_tunesz $((128 * 1024 / 2))
1993         resetquota -u $TSTUSR
1994 }
1995 run_test_with_stat 26 "test for false quota error(bz18491) ======================================"
1996
1997 test_27a() {
1998         $LFS quota $TSTUSR $DIR && error "lfs succeeded with no type, but should have failed"
1999         $LFS setquota $TSTUSR $DIR && error "lfs succeeded with no type, but should have failed"
2000         return 0
2001 }
2002 run_test_with_stat 27a "lfs quota/setquota should handle wrong arguments (19612) ================="
2003
2004 test_27b() {
2005         $LFS setquota -u $TSTID -b 1000 -B 1000 -i 1000 -I 1000 $DIR || \
2006                 error "lfs setquota failed with uid argument"
2007         $LFS setquota -g $TSTID -b 1000 -B 1000 -i 1000 -I 1000 $DIR || \
2008                 error "lfs stequota failed with gid argument"
2009         $SHOW_QUOTA_USERID || error "lfs quota failed with uid argument"
2010         $SHOW_QUOTA_GROUPID || error "lfs quota failed with gid argument"
2011         resetquota -u $TSTUSR
2012         resetquota -g $TSTUSR
2013         return 0
2014 }
2015 run_test 27b "lfs quota/setquota should handle user/group ID (20200) ================="
2016
2017 test_28() {
2018         BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
2019         echo "Step 1: set enough high limit for user [$TSTUSR:$BLK_LIMIT]"
2020         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
2021         $SHOW_QUOTA_USER
2022
2023         echo "Step 2: reset system ..."
2024         cleanup_and_setup_lustre
2025         quota_init
2026
2027         echo "Step 3: change qunit for user [$TSTUSR:512:1024]"
2028         set_blk_tunesz 512
2029         set_blk_unitsz 1024
2030
2031         wait_delete_completed
2032
2033         #define OBD_FAIL_QUOTA_RET_QDATA | OBD_FAIL_ONCE
2034         lustre_fail ost 0x80000A02
2035
2036         TESTFILE="$DIR/$tdir/$tfile"
2037         mkdir -p $DIR/$tdir
2038
2039         BLK_LIMIT=$((100 * 1024)) # 100M
2040         echo "Step 4: set enough high limit for user [$TSTUSR:$BLK_LIMIT]"
2041         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
2042         $SHOW_QUOTA_USER
2043
2044         touch $TESTFILE
2045         chown $TSTUSR.$TSTUSR $TESTFILE
2046
2047         echo "Step 5: write the test file1 [10M] ..."
2048         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$BLK_SZ count=$(( 10 * 1024 )) \
2049             || quota_error a $TSTUSR "write 10M file failure"
2050         $SHOW_QUOTA_USER
2051
2052         rm -f $TESTFILE
2053         sync; sleep 3; sync;
2054
2055         # make qd_count 64 bit
2056         lustre_fail ost 0
2057
2058         set_blk_unitsz $((128 * 1024))
2059         set_blk_tunesz $((128 * 1024 / 2))
2060
2061         resetquota -u $TSTUSR
2062 }
2063 run_test_with_stat 28 "test for consistency for qunit when setquota (18574) ==========="
2064
2065 test_29()
2066 {
2067         local BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
2068         local timeout
2069         local pid
2070         local origin_resends
2071
2072         if at_is_enabled; then
2073                 timeout=$(at_max_get client)
2074                 at_max_set 10 client
2075         else
2076                 timeout=$(lctl get_param -n timeout)
2077                 lctl set_param timeout=10
2078         fi
2079
2080         origin_resends=$(lctl get_param -n mdc.${FSNAME}-*.quota_resend_count | head -1)
2081         lctl set_param -n mdc.${FSNAME}-*.quota_resend_count 0
2082
2083         #define OBD_FAIL_MDS_QUOTACTL_NET 0x12e
2084         lustre_fail mds 0x12e
2085
2086         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR & pid=$!
2087
2088         echo "sleeping for $((10 * 2)) seconds"
2089         sleep $((10 * 2))
2090         ps -p $pid && error "lfs hadn't finished by timeout"
2091         wait $pid && error "succeeded, but should have failed"
2092
2093         lustre_fail mds 0
2094
2095         if at_is_enabled; then
2096                 at_max_set $timeout client
2097         else
2098                 lctl set_param timeout=$timeout
2099         fi
2100
2101         lctl set_param -n mdc.${FSNAME}-*.quota_resend_count $origin_resends
2102         resetquota -u $TSTUSR
2103 }
2104 run_test_with_stat 29 "unhandled quotactls must not hang lustre client (19778) ========"
2105
2106 test_30()
2107 {
2108         local output
2109         local LIMIT=1024
2110         local TESTFILE="$DIR/$tdir/$tfile"
2111         local GRACE=10
2112
2113         mkdir -p $DIR/$tdir
2114         chmod 0777 $DIR/$tdir
2115
2116         $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
2117         $LFS setquota -u $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
2118         $RUNAS dd if=/dev/zero of=$TESTFILE bs=1024 count=$((LIMIT * 2)) || true
2119         cancel_lru_locks osc
2120         sleep 5
2121         $LFS setquota -u $TSTUSR -B 0 $DIR
2122         $SHOW_QUOTA_USER
2123         output=`$SHOW_QUOTA_USER | grep $MOUNT | awk '{ print $5 }' | tr -d s`
2124         [ "$output" -le "$((GRACE - 5))" ] || error "grace times were reset or unexpectedly high latency"
2125         rm -f $TESTFILE
2126         resetquota -u $TSTUSR
2127         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
2128 }
2129 run_test_with_stat 30 "hard limit updates should not reset grace times ================"
2130
2131 # test duplicate quota releases b=18630
2132 test_31() {
2133         mkdir -p $DIR/$tdir
2134         chmod 0777 $DIR/$tdir
2135
2136         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
2137         TESTFILE="$DIR/$tdir/$tfile-0"
2138         TESTFILE2="$DIR/$tdir/$tfile-1"
2139
2140         wait_delete_completed
2141
2142         log "   User quota (limit: $LIMIT kbytes)"
2143         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
2144
2145         $LFS setstripe $TESTFILE -i 0 -c 1
2146         chown $TSTUSR.$TSTUSR $TESTFILE
2147         $LFS setstripe $TESTFILE2 -i 0 -c 1
2148         chown $TSTUSR.$TSTUSR $TESTFILE2
2149
2150         log "   step1: write out of block quota ..."
2151         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=5120
2152         $RUNAS dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=5120
2153
2154         #define OBD_FAIL_QUOTA_DELAY_SD      0xA04
2155         #define OBD_FAIL_SOME        0x10000000 /* fail N times */
2156         lustre_fail ost $((0x00000A04 | 0x10000000)) 1
2157
2158         log "   step2: delete two files so that triggering duplicate quota release ..."
2159         rm -f $TESTFILE $TESTFILE2
2160         sync; sleep 5; sync      #  OBD_FAIL_QUOTA_DELAY_SD will delay for 5 seconds
2161         wait_delete_completed
2162
2163         log "   step3: verify if the ost failed"
2164         do_facet ost1 dmesg > $TMP/lustre-log-${TESTNAME}.log
2165         watchdog=`awk '/test 31/ {start = 1;}
2166                        /release quota error/ {
2167                                if (start) {
2168                                        print;
2169                                }
2170                        }' $TMP/lustre-log-${TESTNAME}.log`
2171         [ "$watchdog" ] && error "$watchdog"
2172         rm -f $TMP/lustre-log-${TESTNAME}.log
2173
2174         lustre_fail ost 0
2175         resetquota -u $TSTUSR
2176 }
2177 run_test_with_stat 31 "test duplicate quota releases ==="
2178
2179 # turn off quota
2180 quota_fini()
2181 {
2182         $LFS quotaoff $DIR
2183         do_nodes $(comma_list $(nodes_list)) "lctl set_param debug=-quota"
2184 }
2185 quota_fini
2186
2187 log "cleanup: ======================================================"
2188 cd $ORIG_PWD
2189 check_and_cleanup_lustre
2190 echo '=========================== finished ==============================='
2191 export QUOTA_AUTO=$QUOTA_AUTO_OLD
2192 [ -f "$QUOTALOG" ] && cat $QUOTALOG && grep -q FAIL $QUOTALOG && exit 1 || true
2193 echo "$0: completed"