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