Whamcloud - gitweb
b=5188
[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 TRACE=${TRACE:-""}
45 LUSTRE=${LUSTRE:-`dirname $0`/..}
46 . $LUSTRE/tests/test-framework.sh
47 init_test_env $@
48 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
49
50 [ "$SLOW" = "no" ] && EXCEPT_SLOW="9 10 11"
51
52 QUOTALOG=${TESTSUITELOG:-$TMP/$(basename $0 .sh).log}
53
54 [ "$QUOTALOG" ] && rm -f $QUOTALOG || true
55
56 DIR=${DIR:-$MOUNT}
57 DIR2=${DIR2:-$MOUNT2}
58
59 cleanup_and_setup_lustre
60
61 LOVNAME=`lctl get_param -n llite.*.lov.common_name | tail -n 1`
62 OSTCOUNT=`lctl get_param -n lov.$LOVNAME.numobd`
63
64 SHOW_QUOTA_USER="$LFS quota -u $TSTUSR $DIR"
65 SHOW_QUOTA_GROUP="$LFS quota -g $TSTUSR $DIR"
66 SHOW_QUOTA_INFO="$LFS quota -t $DIR"
67
68 # control the time of tests
69 cycle=30
70 [ "$SLOW" = "no" ] && cycle=10
71
72 build_test_filter
73
74 eval ONLY_0=true
75 eval ONLY_99=true
76
77 # set_blk_tunables(btune_sz)
78 set_blk_tunesz() {
79         local btune=$(($1 * BLK_SZ))
80         # set btune size on all obdfilters
81         do_facet ost1 "lctl set_param obdfilter.*.quota_btune_sz=$btune"
82         # set btune size on mds
83         do_facet mds "lctl set_param mds.${FSNAME}-MDT*.quota_btune_sz=$btune"
84 }
85
86 # set_blk_unitsz(bunit_sz)
87 set_blk_unitsz() {
88         local bunit=$(($1 * BLK_SZ))
89         # set bunit size on all obdfilters
90         do_facet ost1 "lctl set_param obdfilter.*.quota_bunit_sz=$bunit"
91         # set bunit size on mds
92         do_facet mds "lctl set_param mds.${FSNAME}-MDT*.quota_bunit_sz=$bunit"
93 }
94
95 # set_file_tunesz(itune_sz)
96 set_file_tunesz() {
97         local itune=$1
98         # set itune size on all obdfilters
99         do_facet ost1 "lctl set_param obdfilter.*.quota_itune_sz=$itune"
100         # set itune size on mds
101         do_facet mds "lctl set_param mds.${FSNAME}-MDT*.quota_itune_sz=$itune"
102 }
103
104 # set_file_unitsz(iunit_sz)
105 set_file_unitsz() {
106         local iunit=$1
107         # set iunit size on all obdfilters
108         do_facet ost1 "lctl set_param obdfilter.*.quota_iunit_sz=$iunit"
109         # set iunit size on mds
110         do_facet mds "lctl set_param mds.${FSNAME}-MDT*.quota_iunit_sz=$iunit"
111 }
112
113 lustre_fail() {
114         local fail_node=$1
115         local fail_loc=$2
116
117         case $fail_node in
118             "mds" )
119                 do_facet mds "lctl set_param fail_loc=$fail_loc" ;;
120             "ost" )
121                 for num in `seq $OSTCOUNT`; do
122                     do_facet ost$num "lctl set_param fail_loc=$fail_loc"
123                 done ;;
124             "mds_ost" )
125                 do_facet mds "lctl set_param fail_loc=$fail_loc" ;
126                 for num in `seq $OSTCOUNT`; do
127                     do_facet ost$num "lctl set_param fail_loc=$fail_loc"
128                 done ;;
129             * ) echo "usage: lustre_fail fail_node fail_loc" ;
130                 return 1 ;;
131         esac
132 }
133
134 RUNAS="runas -u $TSTID"
135 RUNAS2="runas -u $TSTID2"
136 FAIL_ON_ERROR=true check_runas_id $TSTID $RUNAS
137 FAIL_ON_ERROR=true check_runas_id $TSTID2 $RUNAS2
138
139 FAIL_ON_ERROR=false
140
141 # set quota
142 test_0() {
143         $LFS quotaoff -ug $DIR
144         $LFS quotacheck -ug $DIR
145
146         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
147         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
148
149         lctl set_param debug="+quota"
150         do_facet mds "lctl set_param debug=+quota"
151         for num in `seq $OSTCOUNT`; do
152             do_facet ost$num "lctl set_param debug=+quota"
153         done
154 }
155 run_test 0 "Set quota ============================="
156
157 # test for specific quota limitation, qunit, qtune $1=block_quota_limit
158 test_1_sub() {
159         LIMIT=$1
160         mkdir -p $DIR/$tdir
161         chmod 0777 $DIR/$tdir
162         TESTFILE="$DIR/$tdir/$tfile-0"
163
164         wait_delete_completed
165
166         # test for user
167         log "  User quota (limit: $LIMIT kbytes)"
168         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
169         sleep 3
170         $SHOW_QUOTA_USER
171
172         $LFS setstripe $TESTFILE -c 1
173         chown $TSTUSR.$TSTUSR $TESTFILE
174
175         log "    Write ..."
176         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || error "(usr) write failure, but expect success"
177         log "    Done"
178         log "    Write out of block quota ..."
179         # this time maybe cache write,  ignore it's failure
180         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true
181         # flush cache, ensure noquota flag is setted on client
182         cancel_lru_locks osc
183         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && error "(usr) write success, but expect EDQUOT"
184
185         rm -f $TESTFILE
186         sync; sleep 1; sync;
187         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
188         OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
189         echo $OST0_QUOTA_USED
190         [ $OST0_QUOTA_USED -ne 0 ] && \
191             ($SHOW_QUOTA_USER; error "quota deleted isn't released")
192         $SHOW_QUOTA_USER
193         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
194
195         # test for group
196         log "--------------------------------------"
197         log "  Group quota (limit: $LIMIT kbytes)"
198         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
199         sleep 3
200         $SHOW_QUOTA_GROUP
201         TESTFILE="$DIR/$tdir/$tfile-1"
202
203         $LFS setstripe $TESTFILE -c 1
204         chown $TSTUSR.$TSTUSR $TESTFILE
205
206         log "    Write ..."
207         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) || error "(grp) write failure, but expect success"
208         log "    Done"
209         log "    Write out of block quota ..."
210         # this time maybe cache write, ignore it's failure
211         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT/2)) seek=$(($LIMIT/2)) || true
212         cancel_lru_locks osc
213         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$LIMIT && error "(grp) write success, but expect EDQUOT"
214
215         # cleanup
216         rm -f $TESTFILE
217         sync; sleep 1; sync;
218         OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
219         OST0_QUOTA_USED=`$LFS quota -o $OST0_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
220         echo $OST0_QUOTA_USED
221         [ $OST0_QUOTA_USED -ne 0 ] && \
222             ($SHOW_QUOTA_USER; error "quota deleted isn't released")
223         $SHOW_QUOTA_GROUP
224         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
225 }
226
227 # block hard limit (normal use and out of quota)
228 test_1() {
229         for i in `seq 1 $cycle`; do
230             # define blk_qunit is between 1M and 4M
231             blk_qunit=$(( $RANDOM % 3072 + 1024 ))
232             blk_qtune=$(( $RANDOM % $blk_qunit ))
233             # other osts and mds will occupy at 1M blk quota
234             b_limit=$(( ($RANDOM - 16384) / 8 +  $OSTCOUNT  * $blk_qunit * 4 ))
235             set_blk_tunesz $blk_qtune
236             set_blk_unitsz $blk_qunit
237             echo "cycle: $i(total $cycle) bunit:$blk_qunit, btune:$blk_qtune, blimit:$b_limit"
238             test_1_sub $b_limit
239             echo "=================================================="
240             set_blk_unitsz $((128 * 1024))
241             set_blk_tunesz $((128 * 1024 / 2))
242         done
243 }
244 run_test 1 "Block hard limit (normal use and out of quota) ==="
245
246 # test for specific quota limitation, qunit, qtune $1=block_quota_limit
247 test_2_sub() {
248         LIMIT=$1
249         mkdir -p $DIR/$tdir
250         chmod 0777 $DIR/$tdir
251         TESTFILE="$DIR/$tdir/$tfile-0"
252
253         wait_delete_completed
254
255         # test for user
256         log "  User quota (limit: $LIMIT files)"
257         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR
258         sleep 3
259         $SHOW_QUOTA_USER
260
261         log "    Create $LIMIT files ..."
262         $RUNAS createmany -m ${TESTFILE} $LIMIT || \
263                 error "(usr) create failure, but expect success"
264         log "    Done"
265         log "    Create out of file quota ..."
266         $RUNAS touch ${TESTFILE}_xxx && \
267                 error "(usr) touch success, but expect EDQUOT"
268
269         unlinkmany ${TESTFILE} $LIMIT
270         rm -f ${TESTFILE}_xxx
271         sync; sleep 1; sync;
272
273         MDS_UUID=`do_facet mds $LCTL dl | grep -m1 mds | awk '{print $((NF-1))}'`
274         MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
275         echo $MDS_QUOTA_USED
276         [ $MDS_QUOTA_USED -ne 0 ] && \
277             ($SHOW_QUOTA_USER; error "quota deleted isn't released")
278         $SHOW_QUOTA_USER
279         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
280
281         # test for group
282         log "--------------------------------------"
283         log "  Group quota (limit: $LIMIT FILE)"
284         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I $LIMIT $DIR
285         sleep 3
286         $SHOW_QUOTA_GROUP
287         TESTFILE=$DIR/$tdir/$tfile-1
288
289         log "    Create $LIMIT files ..."
290         $RUNAS createmany -m ${TESTFILE} $LIMIT || \
291                 error "(usr) create failure, but expect success"
292         log "    Done"
293         log "    Create out of file quota ..."
294         $RUNAS touch ${TESTFILE}_xxx && \
295                 error "(usr) touch success, but expect EDQUOT"
296
297         unlinkmany ${TESTFILE} $LIMIT
298         rm -f ${TESTFILE}_xxx
299         sync; sleep 1; sync;
300
301         MDS_UUID=`do_facet mds $LCTL dl | grep -m1 mds | awk '{print $((NF-1))}'`
302         MDS_QUOTA_USED=`$LFS quota -o $MDS_UUID -g $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
303         echo $MDS_QUOTA_USED
304         [ $MDS_QUOTA_USED -ne 0 ] && \
305             ($SHOW_QUOTA_USER; error "quota deleted isn't released")
306         $SHOW_QUOTA_GROUP
307         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
308 }
309
310 # file hard limit (normal use and out of quota)
311 test_2() {
312         for i in `seq 1 $cycle`; do
313             # define ino_qunit is between 10 and 100
314             ino_qunit=$(( $RANDOM % 90 + 10 ))
315             ino_qtune=$(( $RANDOM % $ino_qunit ))
316             # RANDOM's maxium is 32767
317             i_limit=$(( $RANDOM % 990 + 10 ))
318             set_file_tunesz $ino_qtune
319             set_file_unitsz $ino_qunit
320             echo "cycle: $i(total $cycle) iunit:$ino_qunit, itune:$ino_qtune, ilimit:$i_limit"
321             test_2_sub $i_limit
322             echo "=================================================="
323             set_file_unitsz 5120
324             set_file_tunesz 2560
325         done
326 }
327 run_test 2 "File hard limit (normal use and out of quota) ==="
328
329 test_block_soft() {
330         TESTFILE=$1
331         TIMER=$(($2 * 3 / 2))
332         OFFSET=0
333
334         wait_delete_completed
335
336         echo "    Write to exceed soft limit"
337         RUNDD="$RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ"
338         $RUNDD count=$((BUNIT_SZ+1)) || \
339                 error "write failure, but expect success"
340         OFFSET=$((OFFSET + BUNIT_SZ + 1))
341         cancel_lru_locks osc
342
343         $SHOW_QUOTA_USER
344         $SHOW_QUOTA_GROUP
345         $SHOW_QUOTA_INFO
346
347         echo "    Write before timer goes off"
348         $RUNDD count=$BUNIT_SZ seek=$OFFSET || \
349                 error "write failure, but expect success"
350         OFFSET=$((OFFSET + BUNIT_SZ))
351         cancel_lru_locks osc
352         echo "    Done"
353
354         echo "    Sleep $TIMER seconds ..."
355         sleep $TIMER
356
357         $SHOW_QUOTA_USER
358         $SHOW_QUOTA_GROUP
359         $SHOW_QUOTA_INFO
360
361         echo "    Write after timer goes off"
362         # maybe cache write, ignore.
363         $RUNDD count=$BUNIT_SZ seek=$OFFSET || true
364         OFFSET=$((OFFSET + BUNIT_SZ))
365         cancel_lru_locks osc
366         $RUNDD count=$BUNIT_SZ seek=$OFFSET && \
367                 error "write success, but expect EDQUOT"
368
369         $SHOW_QUOTA_USER
370         $SHOW_QUOTA_GROUP
371         $SHOW_QUOTA_INFO
372
373         echo "    Unlink file to stop timer"
374         rm -f $TESTFILE
375         sync; sleep 1; sync
376         echo "    Done"
377
378         $SHOW_QUOTA_USER
379         $SHOW_QUOTA_GROUP
380         $SHOW_QUOTA_INFO
381
382         echo "    Write ..."
383         $RUNDD count=$BUNIT_SZ || error "write failure, but expect success"
384         echo "    Done"
385
386         # cleanup
387         rm -f $TESTFILE
388         sync; sleep 3; sync;
389 }
390
391 # block soft limit (start timer, timer goes off, stop timer)
392 test_3() {
393         mkdir -p $DIR/$tdir
394         chmod 0777 $DIR/$tdir
395
396         # 1 bunit on mds and 1 bunit on every ost
397         LIMIT=$(( $BUNIT_SZ * ($OSTCOUNT + 1) ))
398         GRACE=10
399
400         echo "  User quota (soft limit: $LIMIT kbytes  grace: $GRACE seconds)"
401         TESTFILE=$DIR/$tdir/$tfile-0
402
403         $LFS setstripe $TESTFILE -c 1
404         chown $TSTUSR.$TSTUSR $TESTFILE
405
406         $LFS setquota -t -u --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
407         $LFS setquota -u $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
408
409         test_block_soft $TESTFILE $GRACE
410         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
411
412         echo "  Group quota (soft limit: $LIMIT kbytes  grace: $GRACE seconds)"
413         TESTFILE=$DIR/$tdir/$tfile-1
414
415         $LFS setstripe $TESTFILE -c 1
416         chown $TSTUSR.$TSTUSR $TESTFILE
417
418         $LFS setquota -t -g --block-grace $GRACE --inode-grace $MAX_IQ_TIME $DIR
419         $LFS setquota -g $TSTUSR -b $LIMIT -B 0 -i 0 -I 0 $DIR
420
421         test_block_soft $TESTFILE $GRACE
422         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
423 }
424 run_test 3 "Block soft limit (start timer, timer goes off, stop timer) ==="
425
426 test_file_soft() {
427         TESTFILE=$1
428         LIMIT=$2
429         TIMER=$(($3 * 3 / 2))
430
431         wait_delete_completed
432
433         echo "    Create files to exceed soft limit"
434         $RUNAS createmany -m ${TESTFILE}_ $((LIMIT + 1)) || \
435                 error "create failure, but expect success"
436         sync; sleep 1; sync
437         echo "    Done"
438
439         echo "    Create file before timer goes off"
440         $RUNAS touch ${TESTFILE}_before || \
441                 error "failed create before timer expired, but expect success"
442         sync; sleep 1; sync
443         echo "    Done"
444
445         echo "    Sleep $TIMER seconds ..."
446         sleep $TIMER
447
448         $SHOW_QUOTA_USER
449         $SHOW_QUOTA_GROUP
450         $SHOW_QUOTA_INFO
451
452         echo "    Create file after timer goes off"
453         $RUNAS touch ${TESTFILE}_after ${TESTFILE}_after1 && \
454                 error "create after timer expired, but expect EDQUOT"
455         sync; sleep 1; sync
456
457         $SHOW_QUOTA_USER
458         $SHOW_QUOTA_GROUP
459         $SHOW_QUOTA_INFO
460
461         echo "    Unlink files to stop timer"
462         find `dirname $TESTFILE` -name "`basename ${TESTFILE}`*" | xargs rm -f
463         echo "    Done"
464
465         echo "    Create file"
466         $RUNAS touch ${TESTFILE}_xxx || \
467                 error "touch after timer stop failure, but expect success"
468         sync; sleep 1; sync
469         echo "    Done"
470
471         # cleanup
472         rm -f ${TESTFILE}_xxx
473         sync; sleep 3; sync;
474 }
475
476 # file soft limit (start timer, timer goes off, stop timer)
477 test_4a() {     # was test_4
478         mkdir -p $DIR/$tdir
479         chmod 0777 $DIR/$tdir
480         LIMIT=$(($IUNIT_SZ * 10))       # 10 iunits on mds
481         TESTFILE=$DIR/$tdir/$tfile-0
482
483         GRACE=5
484
485         echo "  User quota (soft limit: $LIMIT files  grace: $GRACE seconds)"
486         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR
487         $LFS setquota -u $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR
488         $SHOW_QUOTA_USER
489
490         test_file_soft $TESTFILE $LIMIT $GRACE
491         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
492
493         echo "  Group quota (soft limit: $LIMIT files  grace: $GRACE seconds)"
494         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $GRACE $DIR
495         $LFS setquota -g $TSTUSR -b 0 -B 0 -i $LIMIT -I 0 $DIR
496         $SHOW_QUOTA_GROUP
497         TESTFILE=$DIR/$tdir/$tfile-1
498
499         test_file_soft $TESTFILE $LIMIT $GRACE
500         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
501
502         # cleanup
503         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
504         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
505 }
506 run_test 4a "File soft limit (start timer, timer goes off, stop timer) ==="
507
508 test_4b() {     # was test_4a
509         GR_STR1="1w3d"
510         GR_STR2="1000s"
511         GR_STR3="5s"
512         GR_STR4="1w2d3h4m5s"
513         GR_STR5="5c"
514         GR_STR6="1111111111111111"
515
516         wait_delete_completed
517
518         # test of valid grace strings handling
519         echo "  Valid grace strings test"
520         $LFS setquota -t -u --block-grace $GR_STR1 --inode-grace $GR_STR2 $DIR
521         $LFS quota -u -t $DIR | grep "Block grace time: $GR_STR1"
522         $LFS setquota -t -g --block-grace $GR_STR3 --inode-grace $GR_STR4 $DIR
523         $LFS quota -g -t $DIR | grep "Inode grace time: $GR_STR4"
524
525         # test of invalid grace strings handling
526         echo "  Invalid grace strings test"
527         ! $LFS setquota -t -u --block-grace $GR_STR4 --inode-grace $GR_STR5 $DIR
528         ! $LFS setquota -t -g --block-grace $GR_STR4 --inode-grace $GR_STR6 $DIR
529
530         # cleanup
531         $LFS setquota -t -u --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
532         $LFS setquota -t -g --block-grace $MAX_DQ_TIME --inode-grace $MAX_IQ_TIME $DIR
533 }
534 run_test 4b "Grace time strings handling ==="
535
536 # chown & chgrp (chown & chgrp successfully even out of block/file quota)
537 test_5() {
538         mkdir -p $DIR/$tdir
539         BLIMIT=$(( $BUNIT_SZ * $((OSTCOUNT + 1)) * 10)) # 10 bunits on each server
540         ILIMIT=$(( $IUNIT_SZ * 10 )) # 10 iunits on mds
541
542         wait_delete_completed
543
544         echo "  Set quota limit (0 $BLIMIT 0 $ILIMIT) for $TSTUSR.$TSTUSR"
545         $LFS setquota -u $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $DIR
546         $LFS setquota -g $TSTUSR -b 0 -B $BLIMIT -i 0 -I $ILIMIT $DIR
547         $SHOW_QUOTA_USER
548         $SHOW_QUOTA_GROUP
549
550         echo "  Create more than $ILIMIT files and more than $BLIMIT kbytes ..."
551         createmany -m $DIR/$tdir/$tfile-0_ $((ILIMIT + 1)) || \
552                 error "touch failure, expect success"
553         dd if=/dev/zero of=$DIR/$tdir/$tfile-0_1 bs=$BLK_SZ count=$((BLIMIT+1)) || error "write failure, expect success"
554
555         echo "  Chown files to $TSTUSR.$TSTUSR ..."
556         for i in `seq 0 $ILIMIT`; do
557         chown $TSTUSR.$TSTUSR $DIR/$tdir/$tfile-0_$i || \
558                         error "chown failure, but expect success"
559         done
560
561         # cleanup
562         unlinkmany $DIR/$tdir/$tfile-0_ $((ILIMIT + 1))
563         sync; sleep 3; sync;
564
565         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
566         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
567 }
568 run_test 5 "Chown & chgrp successfully even out of block/file quota ==="
569
570 # block quota acquire & release
571 test_6() {
572         if [ $OSTCOUNT -lt 2 ]; then
573                 skip "$OSTCOUNT < 2, too few osts"
574                 return 0;
575         fi
576
577         wait_delete_completed
578
579         mkdir -p $DIR/$tdir
580         chmod 0777 $DIR/$tdir
581
582         LIMIT=$((BUNIT_SZ * (OSTCOUNT + 1) * 5)) # 5 bunits per server
583         FILEA="$DIR/$tdir/$tfile-0_a"
584         FILEB="$DIR/$tdir/$tfile-0_b"
585
586         echo "  Set block limit $LIMIT kbytes to $TSTUSR.$TSTUSR"
587         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
588         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
589         $SHOW_QUOTA_USER
590         $SHOW_QUOTA_GROUP
591
592         echo "  Create filea on OST0 and fileb on OST1"
593         $LFS setstripe $FILEA -i 0 -c 1
594         $LFS setstripe $FILEB -i 1 -c 1
595         chown $TSTUSR.$TSTUSR $FILEA
596         chown $TSTUSR.$TSTUSR $FILEB
597
598         echo "  Exceed quota limit ..."
599         RUNDD="$RUNAS dd if=/dev/zero of=$FILEB bs=$BLK_SZ"
600         $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
601                 error "write fileb failure, but expect success"
602
603         cancel_lru_locks osc
604         $SHOW_QUOTA_USER
605         $SHOW_QUOTA_GROUP
606         $RUNDD seek=$LIMIT count=$((BUNIT_SZ * OSTCOUNT)) && \
607                 error "write fileb success, but expect EDQUOT"
608         cancel_lru_locks osc
609         echo "  Write to OST0 return EDQUOT"
610         # this write maybe cache write, ignore it's failure
611         RUNDD="$RUNAS dd if=/dev/zero of=$FILEA bs=$BLK_SZ"
612         $RUNDD count=$(($BUNIT_SZ * 2)) || true
613         cancel_lru_locks osc
614         $SHOW_QUOTA_USER
615         $SHOW_QUOTA_GROUP
616         $RUNDD count=$((BUNIT_SZ * 2)) seek=$((BUNIT_SZ *2)) && \
617                 error "write filea success, but expect EDQUOT"
618
619         echo "  Remove fileb to let OST1 release quota"
620         rm -f $FILEB
621         sync; sleep 10; sync; # need to allow journal commit for small fs
622
623         echo "  Write to OST0"
624         $RUNDD count=$((LIMIT - BUNIT_SZ * OSTCOUNT)) || \
625                 error "write filea failure, expect success"
626         echo "  Done"
627
628         # cleanup
629         rm -f $FILEA
630         sync; sleep 3; sync;
631
632         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
633         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
634         return 0
635 }
636 run_test 6 "Block quota acquire & release ========="
637
638 # quota recovery (block quota only by now)
639 test_7()
640 {
641         mkdir -p $DIR/$tdir
642         chmod 0777 $DIR/$tdir
643         remote_mds && skip "remote mds" && return 0
644
645         wait_delete_completed
646
647         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) ))
648         TESTFILE="$DIR/$tdir/$tfile-0"
649
650         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
651
652         $LFS setstripe $TESTFILE -c 1
653         chown $TSTUSR.$TSTUSR $TESTFILE
654
655         echo "  Write to OST0..."
656         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ || \
657                 error "write failure, but expect success"
658
659         #define OBD_FAIL_OBD_DQACQ               0x604
660         lustre_fail mds  0x604
661         echo "  Remove files on OST0"
662         rm -f $TESTFILE
663         lustre_fail mds  0
664
665         echo "  Trigger recovery..."
666         OSC0_UUID="`$LCTL dl | awk '$3 ~ /osc/ { print $1 }'`"
667         for i in $OSC0_UUID; do
668                 $LCTL --device $i activate || error "activate osc failed!"
669         done
670
671         # sleep a while to wait for recovery done
672         sleep 20
673
674         # check limits
675         PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
676         TOTAL_LIMIT="`$LFS quota -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
677         [ $TOTAL_LIMIT -eq $LIMIT ] || error "total limits not recovery!"
678         echo "  total limits = $TOTAL_LIMIT"
679
680         OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
681         [ -z "$OST0_UUID" ] && OST0_UUID=`do_facet ost1 "$LCTL dl | grep -m1 obdfilter" | awk '{print $((NF-1))}'`
682         OST0_LIMIT="`$LFS quota -o $OST0_UUID -u $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $3 }'`"
683         [ $OST0_LIMIT -eq $BUNIT_SZ ] || error "high limits not released!"
684         echo "  limits on $OST0_UUID = $OST0_LIMIT"
685
686         # cleanup
687         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
688 }
689 run_test 7 "Quota recovery (only block limit) ======"
690
691 # run dbench with quota enabled
692 test_8() {
693         mkdir -p $DIR/$tdir
694         BLK_LIMIT=$((100 * 1024 * 1024)) # 100G
695         FILE_LIMIT=1000000
696         DBENCH_LIB=${DBENCH_LIB:-/usr/lib/dbench}
697
698         [ ! -d $DBENCH_LIB ] && skip "dbench not installed" && return 0
699
700         wait_delete_completed
701
702         echo "  Set enough high limit for user: $TSTUSR"
703         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
704         echo "  Set enough high limit for group: $TSTUSR"
705         $LFS setquota -g $USER -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
706
707         TGT=$DIR/$tdir/client.txt
708         SRC=${SRC:-$DBENCH_LIB/client.txt}
709         [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
710         SRC=$DBENCH_LIB/client_plain.txt
711         [ ! -e $TGT -a -e $SRC ] && echo "copying $SRC to $TGT" && cp $SRC $TGT
712
713         chmod 0777 $DIR/$tdir
714         SAVE_PWD=$PWD
715         cd $DIR/$tdir
716         local duration=""
717         [ "$SLOW" = "no" ] && duration=" -t 120"
718         $RUNAS dbench -c client.txt 3 $duration
719         RC=$?
720         [ $RC -ne 0 ] && killall -9 dbench
721
722         rm -f client.txt
723         sync; sleep 3; sync;
724
725         cd $SAVE_PWD
726         return $RC
727 }
728 run_test 8 "Run dbench with quota enabled ==========="
729
730 # run for fixing bug10707, it needs a big room. test for 64bit
731 KB=1024
732 GB=$((KB * 1024 * 1024))
733 # Use this as dd bs to decrease time
734 # inode->i_blkbits = min(PTLRPC_MAX_BRW_BITS+1, LL_MAX_BLKSIZE_BITS);
735 blksize=$((1 << 21)) # 2Mb
736 size_file=$((GB * 9 / 2))
737 # this check is just for test9 and test10
738 OST0_MIN=4900000 #4.67G
739 check_whether_skip () {
740     OST0_SIZE=`$LFS df $DIR | awk '/\[OST:0\]/ {print $4}'`
741     log "OST0_SIZE: $OST0_SIZE  required: $OST0_MIN"
742     if [ $OST0_SIZE -lt $OST0_MIN ]; then
743         echo "WARN: OST0 has less than $OST0_MIN free, skip this test."
744         return 0
745     else
746         return 1
747     fi
748 }
749
750 test_9() {
751         check_whether_skip && return 0
752
753         wait_delete_completed
754
755         set_blk_tunesz 512
756         set_blk_unitsz 1024
757
758         mkdir -p $DIR/$tdir
759         chmod 0777 $DIR/$tdir
760         TESTFILE="$DIR/$tdir/$tfile-0"
761
762         BLK_LIMIT=$((100 * KB * KB)) # 100G
763         FILE_LIMIT=1000000
764         echo "  Set block limit $BLK_LIMIT kbytes to $TSTUSR.$TSTUSR"
765
766         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
767         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
768         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
769         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
770
771         echo "  Set stripe"
772         $LFS setstripe $TESTFILE -c 1
773         touch $TESTFILE
774         chown $TSTUSR.$TSTUSR $TESTFILE
775
776         $SHOW_QUOTA_USER
777         $SHOW_QUOTA_GROUP
778
779         log "    Write the big file of 4.5G ..."
780         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$blksize count=$((size_file / blksize)) || \
781                error "(usr) write 4.5G file failure, but expect success"
782
783         $SHOW_QUOTA_USER
784         $SHOW_QUOTA_GROUP
785
786         log "    delete the big file of 4.5G..."
787         $RUNAS rm -f $TESTFILE
788         sync; sleep 3; sync;
789
790         $SHOW_QUOTA_USER
791         $SHOW_QUOTA_GROUP
792
793         RC=$?
794
795         set_blk_unitsz $((128 * 1024))
796         set_blk_tunesz $((128 * 1024 / 2))
797
798         return $RC
799 }
800 run_test 9 "run for fixing bug10707(64bit) ==========="
801
802 # run for fixing bug10707, it need a big room. test for 32bit
803 test_10() {
804         mkdir -p $DIR/$tdir
805         chmod 0777 $DIR/$tdir
806         check_whether_skip && return 0
807
808         wait_delete_completed
809
810         set_blk_tunesz 512
811         set_blk_unitsz 1024
812
813         # make qd_count 32 bit
814         lustre_fail mds_ost 0xA00
815
816         TESTFILE="$DIR/$tdir/$tfile-0"
817
818         BLK_LIMIT=$((100 * KB * KB)) # 100G
819         FILE_LIMIT=1000000
820
821         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for user: $TSTUSR"
822         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
823         log "  Set enough high limit(block:$BLK_LIMIT; file: $FILE_LIMIT) for group: $TSTUSR"
824         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I $FILE_LIMIT $DIR
825
826         echo "  Set stripe"
827         $LFS setstripe $TESTFILE -c 1
828         touch $TESTFILE
829         chown $TSTUSR.$TSTUSR $TESTFILE
830
831         $SHOW_QUOTA_USER
832         $SHOW_QUOTA_GROUP
833
834         log "    Write the big file of 4.5 G ..."
835         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$blksize count=$((size_file / blksize)) || \
836                 error "(usr) write 4.5 G file failure, but expect success"
837
838         $SHOW_QUOTA_USER
839         $SHOW_QUOTA_GROUP
840
841         log "    delete the big file of 4.5 G..."
842         $RUNAS rm -f $TESTFILE
843         sync; sleep 3; sync;
844
845         $SHOW_QUOTA_USER
846         $SHOW_QUOTA_GROUP
847
848         RC=$?
849
850         # make qd_count 64 bit
851         lustre_fail mds_ost 0
852
853         set_blk_unitsz $((128 * 1024))
854         set_blk_tunesz $((128 * 1024 / 2))
855
856         return $RC
857 }
858 run_test 10 "run for fixing bug10707(32bit) ==========="
859
860 test_11() {
861        wait_delete_completed
862
863        #prepare the test
864        block_limit=`(echo 0; df -t lustre -P | awk '{print $(NF - 4)}') | tail -n 1`
865        echo $block_limit
866        orig_dbr=`sysctl -n vm.dirty_background_ratio`
867        orig_dec=`sysctl -n vm.dirty_expire_centisecs`
868        orig_dr=`sysctl -n vm.dirty_ratio`
869        orig_dwc=`sysctl -n vm.dirty_writeback_centisecs`
870        sysctl -w vm.dirty_background_ratio=1
871        sysctl -w vm.dirty_expire_centisecs=30
872        sysctl -w vm.dirty_ratio=1
873        sysctl -w vm.dirty_writeback_centisecs=50
874        TESTDIR="$DIR/$tdir"
875        local RV=0
876
877        #do the test
878        local SECS=0
879        local REPS=3
880        [ "$SLOW" = no ] && REPS=1
881        local sleep=20
882        local i=1
883        while [ $i -le $REPS ]; do
884            echo "test: cycle($i of $REPS) start at $(date)"
885            mkdir -p $TESTDIR && chmod 777 $TESTDIR
886            echo -n "    create a file for uid "
887            for j in `seq 1 30`; do
888                echo -n "$j "
889                # 30MB per dd for a total of 900MB (if space even permits)
890                runas -u $j dd if=/dev/zero of=$TESTDIR/$tfile  bs=$blksize count=15 > /dev/null 2>&1 &
891            done
892            echo ""
893            PROCS=$(ps -ef | grep -v grep | grep "dd if /dev/zero of $TESTDIR" | wc -l)
894            LAST_USED=0
895            while [ $PROCS -gt 0 ]; do 
896              sleep 20
897              SECS=$((SECS + sleep))
898              PROCS=$(ps -ef | grep -v grep | grep "dd if /dev/zero of $TESTDIR" | wc -l)
899              USED=$(du -s $TESTDIR | awk '{print $1}')
900              PCT=$(($USED * 100 / $block_limit))
901              echo "${i}/${REPS} ${PCT}% p${PROCS} t${SECS}  "
902              if [ $USED -le $LAST_USED ]; then
903                  kill -9 $(ps -ef | grep "dd if /dev/zero of $TESTDIR" | grep -v grep | awk '{ print $2 }')
904                  i=$REPS
905                  RV=2
906                  break
907              fi
908              LAST_USED=$USED
909            done
910            echo "    removing the test files..."
911            rm -f $TESTDIR/$tfile
912            echo "cycle $i done at $(date)"
913            i=$[$i+1]
914        done
915        echo "Test took $SECS sec"
916
917        #clean
918        sysctl -w vm.dirty_background_ratio=$orig_dbr
919        sysctl -w vm.dirty_expire_centisecs=$orig_dec
920        sysctl -w vm.dirty_ratio=$orig_dr
921        sysctl -w vm.dirty_writeback_centisecs=$orig_dwc
922        if [ $RV -ne 0 ]; then
923            error "Nothing was written for $SECS sec ... aborting"
924        fi
925        return $RV
926 }
927 run_test 11 "run for fixing bug10912 ==========="
928
929
930 # test a deadlock between quota and journal b=11693
931 test_12() {
932         mkdir -p $DIR/$tdir
933         chmod 0777 $DIR/$tdir
934
935         [ "$(grep $DIR2 /proc/mounts)" ] || mount_client $DIR2 || \
936                 { skip "Need lustre mounted on $MOUNT2 " && retutn 0; }
937
938         if [ $OSTCOUNT -lt 2 ]; then
939                 skip "$OSTCOUNT < 2, too few osts"
940                 return 0;
941         fi
942
943         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 10)) # 10 bunits each sever
944         TESTFILE="$DIR/$tdir/$tfile-0"
945         TESTFILE2="$DIR2/$tdir/$tfile-1"
946
947         wait_delete_completed
948
949         echo "   User quota (limit: $LIMIT kbytes)"
950         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
951
952         $LFS setstripe $TESTFILE -i 0 -c 1
953         chown $TSTUSR.$TSTUSR $TESTFILE
954         $LFS setstripe $TESTFILE2 -i 1 -c 1
955         chown $TSTUSR2.$TSTUSR2 $TESTFILE2
956
957         #define OBD_FAIL_OST_HOLD_WRITE_RPC      0x21f
958         lustre_fail ost 0x0000021f
959
960         echo "   step1: write out of block quota ..."
961         $RUNAS2 dd if=/dev/zero of=$TESTFILE2 bs=$BLK_SZ count=102400 &
962         DDPID1=$!
963         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$(($LIMIT*2)) &
964         DDPID=$!
965
966         echo  "   step2: testing ......"
967         count=0
968         while [ true ]; do
969             if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
970             count=$[count+1]
971             if [ $count -gt 64 ]; then
972                 lustre_fail ost 0
973                 error "dd should be finished!"
974             fi
975             sleep 1
976         done
977         echo "(dd_pid=$DDPID1, time=$count)successful"
978
979         #Recover fail_loc and dd will finish soon
980         lustre_fail ost 0
981
982         echo  "   step3: testing ......"
983         count=0
984         while [ true ]; do
985             if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
986             count=$[count+1]
987             if [ $count -gt 150 ]; then
988                 error "dd should be finished!"
989             fi
990             sleep 1
991         done
992         echo "(dd_pid=$DDPID, time=$count)successful"
993
994         rm -f $TESTFILE $TESTFILE2
995         sync; sleep 3; sync;
996
997         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
998 }
999 run_test 12 "test a deadlock between quota and journal ==="
1000
1001 # test multiple clients write block quota b=11693
1002 test_13() {
1003         mkdir -p $DIR/$tdir
1004         wait_delete_completed
1005
1006         # one OST * 10 + (mds + other OSTs)
1007         LIMIT=$((BUNIT_SZ * 10 + (BUNIT_SZ * OSTCOUNT)))
1008         TESTFILE="$DIR/$tdir/$tfile"
1009
1010         echo "   User quota (limit: $LIMIT kbytes)"
1011         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1012         $SHOW_QUOTA_USER
1013
1014         $LFS setstripe $TESTFILE -i 0 -c 1
1015         chown $TSTUSR.$TSTUSR $TESTFILE
1016         $LFS setstripe $TESTFILE.2 -i 0 -c 1
1017         chown $TSTUSR.$TSTUSR $TESTFILE.2
1018
1019         echo "   step1: write out of block quota ..."
1020         # one bunit will give mds
1021         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] &
1022         DDPID=$!
1023         $RUNAS dd if=/dev/zero of=$TESTFILE.2 bs=$BLK_SZ count=$[($LIMIT - $BUNIT_SZ) / 2] &
1024         DDPID1=$!
1025
1026         echo  "   step2: testing ......"
1027         count=0
1028         while [ true ]; do
1029             if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
1030             count=$[count+1]
1031             if [ $count -gt 64 ]; then
1032                 error "dd should be finished!"
1033             fi
1034             sleep 1
1035         done
1036         echo "(dd_pid=$DDPID, time=$count)successful"
1037
1038         count=0
1039         while [ true ]; do
1040             if [ -z `ps -ef | awk '$2 == '${DDPID1}' { print $8 }'` ]; then break; fi
1041             count=$[count+1]
1042             if [ $count -gt 64 ]; then
1043                 error "dd should be finished!"
1044             fi
1045             sleep 1
1046         done
1047         echo "(dd_pid=$DDPID1, time=$count)successful"
1048
1049         sync; sleep 5; sync;
1050
1051         echo  "   step3: checking ......"
1052         fz=`stat -c %s $TESTFILE`
1053         fz2=`stat -c %s $TESTFILE.2`
1054         $SHOW_QUOTA_USER
1055         [ $((fz + fz2)) -lt $((BUNIT_SZ * BLK_SZ * 10)) ] && \
1056                 error "files too small $fz + $fz2 < $((BUNIT_SZ * BLK_SZ * 10))"
1057
1058         rm -f $TESTFILE $TESTFILE.2
1059         sync; sleep 3; sync;
1060
1061         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
1062 }
1063 run_test 13 "test multiple clients write block quota ==="
1064
1065 check_if_quota_zero(){
1066         line=`$LFS quota -$1 $2 $DIR | wc -l`
1067         for i in `seq 3 $line`; do
1068             if [ $i -eq 3 ]; then
1069                 field="3 4 6 7"
1070             else
1071                 field="3 5"
1072             fi
1073             for j in $field; do
1074                 tmp=`$LFS quota -$1 $2 $DIR | sed -n ${i}p |
1075                      awk  '{print $'"$j"'}'`
1076                 [ -n "$tmp" ] && [ $tmp -ne 0 ] && $LFS quota -$1 $2 $DIR && \
1077                     error "quota on $2 isn't clean"
1078             done
1079         done
1080         echo "pass check_if_quota_zero"
1081 }
1082
1083 pre_test_14 () {
1084         # reboot the lustre
1085         sync; sleep 5; sync
1086         cd $T_PWD; sh llmountcleanup.sh || error "llmountcleanup failed"
1087         sh llmount.sh
1088         run_test 0 "reboot lustre"
1089 }
1090 pre_test_14
1091
1092 test_14a() {    # was test_14 b=12223 -- setting quota on root
1093         TESTFILE="$DIR/$tdir/$tfile"
1094         mkdir -p $DIR/$tdir
1095
1096         # out of root's file and block quota
1097         $LFS setquota -u root -b 10 -B 10 -i 10 -I 10 $DIR
1098         createmany -m ${TESTFILE} 20 || \
1099             error "unexpected: user(root) create files failly!"
1100         dd if=/dev/zero of=$TESTFILE bs=4k count=4096 || \
1101             error "unexpected: user(root) write files failly!"
1102         chmod 666 $TESTFILE
1103         $RUNAS dd if=/dev/zero of=${TESTFILE} seek=4096 bs=4k count=4096 && \
1104             error "unexpected: user(quota_usr) write a file successfully!"
1105
1106         # trigger the llog
1107         chmod 777 $DIR
1108         for i in `seq 1 10`; do $RUNAS touch ${TESTFILE}a_$i; done
1109         for i in `seq 1 10`; do $RUNAS rm -f ${TESTFILE}a_$i; done
1110
1111         # do the check
1112         dmesg | tail | grep "\-122" |grep llog_obd_origin_add && error "err -122 not found in dmesg"
1113         $LFS setquota -u root -b 0 -B 0 -i 0 -I 0 $DIR
1114         #check_if_quota_zero u root
1115
1116         # clean
1117         unlinkmany ${TESTFILE} 15
1118         rm -f $TESTFILE
1119         sync; sleep 3; sync;
1120 }
1121 run_test 14a "test setting quota on root ==="
1122
1123 quota_set_version() {
1124         local qver=$1
1125         do_facet mds "lctl set_param mds.${FSNAME}-MDT*.quota_type=$qver"
1126 }
1127
1128 test_14b() {    # was test_14a
1129         # 1. check that required users exist
1130         # 2. ensure that switch to new mode will start conversion
1131         # 3. start quota in old mode and put some entries
1132         # 4. restart quota in new mode forcing conversion and check the entries
1133
1134         wait_delete_completed
1135
1136         MISSING_USERS=""
1137         for i in `seq 1 30`; do
1138                 check_runas_id_ret quota15_$i "runas -u quota15_$i"
1139                 if [ "$?" != "0" ]; then
1140                        MISSING_USERS="$MISSING_USERS quota15_$i"
1141                 fi
1142         done
1143
1144         if [ -n "$MISSING_USERS" ]; then
1145                 skip "following users are missing: $MISSING_USERS"
1146                 return 0
1147         fi
1148
1149         $LFS quotaoff -ug $DIR
1150         quota_set_version 1
1151         $LFS quotacheck -ug $DIR
1152
1153         for i in `seq 1 30`; do
1154                 $LFS setquota -u quota15_$i -b $i -B $i -i $i -I $i $DIR
1155         done
1156
1157         $LFS quotaoff -ug $DIR
1158         quota_set_version 2
1159         $LFS quotainv -ug $DIR
1160         $LFS quotacheck -ug $DIR
1161
1162         for i in `seq 1 30`; do
1163                 # the format is "mntpnt   curspace[*]   bsoftlimit   bhardlimit   [time]   curinodes[*]    isoftlimit  ihardlimit"
1164                 ($LFS quota -u quota15_$i $DIR | grep -E '^ *'$DIR' *[0-9]+\** *'$i' *'$i' *[0-9]+\** *'$i' *'$i) \
1165                  || error "lfs quota output is unexpected"
1166                 $LFS setquota -u quota15_$i -b 0 -B 0 -i 0 -I 0 $DIR
1167         done
1168 }
1169 run_test 14b "setting 30 quota entries in quota v1 file before conversion ==="
1170
1171 test_15(){
1172         LIMIT=$((24 * 1024 * 1024 * 1024 * 1024)) # 24 TB
1173         PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`"
1174
1175         wait_delete_completed
1176
1177         # test for user
1178         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1179         TOTAL_LIMIT="`$LFS quota -u $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
1180         [ $TOTAL_LIMIT -eq $LIMIT ] || error "  (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
1181         echo "  (user)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
1182         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
1183
1184         # test for group
1185         $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1186         TOTAL_LIMIT="`$LFS quota -g $TSTUSR $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $4 }'`"
1187         [ $TOTAL_LIMIT -eq $LIMIT ] || error "  (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, failed!"
1188         echo "  (group)total limits = $TOTAL_LIMIT; limit = $LIMIT, successful!"
1189         $LFS setquota -g $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
1190         $LFS quotaoff -ug $DIR
1191         quota_set_version 1
1192         $LFS quotacheck -ug $DIR || error "quotacheck failed"
1193
1194         echo "Testing that >4GB quota limits fail on volume with quota v1"
1195         ! $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1196 }
1197 run_test 15 "set block quota more than 4T ==="
1198
1199 # $1=u/g $2=with qunit adjust or not
1200 test_16_tub() {
1201         LIMIT=$(( $BUNIT_SZ * $(($OSTCOUNT + 1)) * 4))
1202         TESTFILE="$DIR/$tdir/$tfile"
1203         mkdir -p $DIR/$tdir
1204
1205         wait_delete_completed
1206
1207         echo "  User quota (limit: $LIMIT kbytes)"
1208         if [ $1 == "u" ]; then
1209             $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1210             $SHOW_QUOTA_USER
1211         else
1212             $LFS setquota -g $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $DIR
1213             $SHOW_QUOTA_GROUP
1214         fi
1215
1216         $LFS setstripe $TESTFILE -c 1
1217         chown $TSTUSR.$TSTUSR $TESTFILE
1218
1219         echo "    Write ..."
1220         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((BUNIT_SZ * 4)) || \
1221             error "(usr) write failure, but expect success"
1222         echo "    Done"
1223         echo "    Write out of block quota ..."
1224         # this time maybe cache write,  ignore it's failure
1225         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) || true
1226         # flush cache, ensure noquota flag is setted on client
1227         cancel_lru_locks osc
1228         if [ $2 -eq 1 ]; then
1229             $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) || \
1230                 error "(write failure, but expect success"
1231         else
1232             $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$BUNIT_SZ seek=$((BUNIT_SZ * 4)) && \
1233                 error "(write success, but expect EDQUOT"
1234         fi
1235
1236         rm -f $TESTFILE
1237         sync; sleep 3; sync;
1238         $LFS setquota -$1 $TSTUSR -b 0 -B 0 -i 0 -I 0 $DIR
1239 }
1240
1241 # test without adjusting qunit
1242 test_16 () {
1243         set_blk_tunesz $((BUNIT_SZ * 2))
1244         set_blk_unitsz $((BUNIT_SZ * 4))
1245         for i in u g; do
1246             for j in 0 1; do
1247                 # define OBD_FAIL_QUOTA_WITHOUT_CHANGE_QS    0xA01
1248                 echo " grp/usr: $i, adjust qunit: $j"
1249                 echo "-------------------------------"
1250                 [ $j -eq 1 ] && lustre_fail mds_ost 0
1251                 [ $j -eq 0 ] && lustre_fail mds_ost 0xA01
1252                 test_16_tub $i $j
1253             done
1254         done
1255         set_blk_unitsz $((128 * 1024))
1256         set_blk_tunesz $((128 * 1024 / 2))
1257 }
1258 run_test 16 "test without adjusting qunit"
1259
1260 # run for fixing bug14526, failed returned quota reqs shouldn't ruin lustre.
1261 test_17() {
1262         set_blk_tunesz 512
1263         set_blk_unitsz 1024
1264
1265         wait_delete_completed
1266
1267         #define OBD_FAIL_QUOTA_RET_QDATA | OBD_FAIL_ONCE
1268         lustre_fail ost 0x80000A02
1269
1270         TESTFILE="$DIR/$tdir/$tfile-a"
1271         TESTFILE2="$DIR/$tdir/$tfile-b"
1272         mkdir -p $DIR/$tdir
1273
1274         BLK_LIMIT=$((100 * 1024)) # 100M
1275
1276         log "  Set enough high limit(block:$BLK_LIMIT) for user: $TSTUSR"
1277         $LFS setquota -u $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
1278         log "  Set enough high limit(block:$BLK_LIMIT) for group: $TSTUSR"
1279         $LFS setquota -g $TSTUSR -b 0 -B $BLK_LIMIT -i 0 -I 0 $DIR
1280
1281         touch $TESTFILE
1282         chown $TSTUSR.$TSTUSR $TESTFILE
1283         touch $TESTFILE2
1284         chown $TSTUSR.$TSTUSR $TESTFILE2
1285
1286         $SHOW_QUOTA_USER
1287         $SHOW_QUOTA_GROUP
1288
1289         log "    Write the test file1 ..."
1290         $RUNAS dd if=/dev/zero of=$TESTFILE  bs=$BLK_SZ count=$(( 10 * 1024 )) \
1291             || echo "write 10M file failure"
1292
1293         $SHOW_QUOTA_USER
1294         $SHOW_QUOTA_GROUP
1295
1296         log "    write the test file2 ..."
1297         $RUNAS dd if=/dev/zero of=$TESTFILE2  bs=$BLK_SZ count=$(( 10 * 1024 )) \
1298             || error "write 10M file failure"
1299
1300         $SHOW_QUOTA_USER
1301         $SHOW_QUOTA_GROUP
1302
1303         rm -f $TESTFILE $TESTFILE2
1304         RC=$?
1305         sync; sleep 3; sync;
1306
1307         # make qd_count 64 bit
1308         lustre_fail ost 0
1309
1310         set_blk_unitsz $((128 * 1024))
1311         set_blk_tunesz $((128 * 1024 / 2))
1312
1313         return $RC
1314 }
1315 run_test 17 "run for fixing bug14526 ==========="
1316
1317 # test when mds takes a long time to handle a quota req so that
1318 # the ost has dropped it, the ost still could work well b=14840
1319 test_18() {
1320         LIMIT=$((100 * 1024 * 1024)) # 100G
1321         TESTFILE="$DIR/$tdir/$tfile"
1322         mkdir -p $DIR/$tdir
1323
1324         wait_delete_completed
1325
1326         set_blk_tunesz 512
1327         set_blk_unitsz 1024
1328
1329         log "   User quota (limit: $LIMIT kbytes)"
1330         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1331         $SHOW_QUOTA_USER
1332
1333         $LFS setstripe $TESTFILE -i 0 -c 1
1334         chown $TSTUSR.$TSTUSR $TESTFILE
1335
1336         #define OBD_FAIL_MDS_BLOCK_QUOTA_REQ      0x13c
1337         lustre_fail mds 0x13c
1338
1339         log "   step1: write 100M block ..."
1340         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 100)) &
1341         DDPID=$!
1342
1343         sleep 5
1344         lustre_fail mds 0
1345
1346         echo  "   step2: testing ......"
1347         count=0
1348         timeout=$(lctl get_param -n timeout)
1349         while [ true ]; do
1350             if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
1351             count=$[count+1]
1352             if [ $count -gt $((2 * $timeout)) ]; then
1353                 error "count=$count dd should be finished!"
1354             fi
1355             sleep 1
1356         done
1357         log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
1358         if [ $count -lt $(($timeout - 10)) ]; then
1359             error " should take longer!"
1360         else
1361             echo " successful"
1362         fi
1363
1364         rm -f $TESTFILE
1365         sync; sleep 3; sync;
1366
1367         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $MOUNT
1368
1369         set_blk_unitsz $((128 * 1024))
1370         set_blk_tunesz $((128 * 1024 / 2))
1371 }
1372 run_test 18 "run for fixing bug14840 ==========="
1373
1374 # test when mds drops a quota req, the ost still could work well b=14840
1375 test_18a() {
1376         LIMIT=$((100 * 1024 * 1024)) # 100G
1377         TESTFILE="$DIR/$tdir/$tfile-a"
1378         mkdir -p $DIR/$tdir
1379
1380         wait_delete_completed
1381
1382         set_blk_tunesz 512
1383         set_blk_unitsz 1024
1384
1385         log "   User quota (limit: $LIMIT kbytes)"
1386         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1387         $SHOW_QUOTA_USER
1388
1389         $LFS setstripe $TESTFILE -i 0 -c 1
1390         chown $TSTUSR.$TSTUSR $TESTFILE
1391
1392         #define OBD_FAIL_MDS_DROP_QUOTA_REQ | OBD_FAIL_ONCE   0x8000013d
1393         lustre_fail mds 0x8000013d
1394
1395         log "   step1: write 100M block ..."
1396         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=$((1024 * 100)) &
1397         DDPID=$!
1398
1399         echo  "   step2: testing ......"
1400         count=0
1401         timeout=$(lctl get_param -n timeout)
1402         while [ true ]; do
1403             if [ -z `ps -ef | awk '$2 == '${DDPID}' { print $8 }'` ]; then break; fi
1404             count=$[count+1]
1405             if [ $count -gt $((3 * $timeout)) ]; then
1406                 lustre_fail mds 0
1407                 error "count=$count dd should be finished!"
1408             fi
1409             sleep 1
1410         done
1411         log "(dd_pid=$DDPID, time=$count, timeout=$timeout)"
1412         if [ $count -lt $(($timeout - 10)) ]; then
1413             lustre_fail mds 0
1414             error " should take longer!"
1415         else
1416             echo " successful"
1417         fi
1418
1419         lustre_fail mds 0
1420
1421         rm -f $TESTFILE
1422         sync; sleep 3; sync;
1423
1424         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $MOUNT
1425
1426         set_blk_unitsz $((128 * 1024))
1427         set_blk_tunesz $((128 * 1024 / 2))
1428 }
1429 run_test 18a "run for fixing bug14840 ==========="
1430
1431 test_19() {
1432         # 1 Mb bunit per each MDS/OSS
1433         LIMIT=$((($OSTCOUNT + 1) * 1024))
1434         TESTFILE="$DIR/$tdir/$tfile"
1435         mkdir -p $DIR/$tdir
1436
1437         wait_delete_completed
1438
1439         # set 1 Mb quota unit size
1440         set_blk_tunesz 512
1441         set_blk_unitsz 1024
1442
1443         # bind file to a single OST
1444         $LFS setstripe -c 1 $TESTFILE
1445         chown $TSTUSR.$TSTUSR $TESTFILE
1446
1447         echo "  User quota (limit: $LIMIT kbytes)"
1448         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1449         $SHOW_QUOTA_USER
1450         echo "  Updating quota limits"
1451         $LFS setquota -u $TSTUSR -b 0 -B $LIMIT -i 0 -I 0 $MOUNT
1452         $SHOW_QUOTA_USER
1453
1454         $RUNAS dd if=/dev/zero of=$TESTFILE bs=$BLK_SZ count=1028 || true
1455         # for now page cache of TESTFILE may still be dirty,
1456         # let's push it to the corresponding OST, this will also
1457         # cache NOQUOTA on the client from OST's reply
1458         cancel_lru_locks osc
1459         $RUNAS dd if=/dev/zero of=$TESTFILE seek=1028 bs=$BLK_SZ count=1 && \
1460                 error "(usr) write success, should be EDQUOT"
1461         $SHOW_QUOTA_USER
1462
1463         # cleanup
1464         rm -f $TESTFILE
1465         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 $MOUNT
1466
1467         set_blk_unitsz $((128 * 1024))
1468         set_blk_tunesz $((128 * 1024 / 2))
1469
1470 }
1471 run_test 19 "test if administrative limits updates do not zero operational limits (14790) ==="
1472
1473 test_20()
1474 {
1475         LSTR=(1t 2g 3m 4k) # limits strings
1476         LVAL=($[1*1024*1024*1024] $[2*1024*1024] $[3*1024*1024] $[4*1024]) # limits values
1477
1478         $LFS setquota -u $TSTUSR --block-softlimit ${LSTR[0]} \
1479                                  $MOUNT || error "could not set quota limits"
1480
1481         $LFS setquota -u $TSTUSR --block-hardlimit ${LSTR[1]} \
1482                                  --inode-softlimit ${LSTR[2]} \
1483                                  --inode-hardlimit ${LSTR[3]} \
1484                                  $MOUNT || error "could not set quota limits"
1485
1486         ($LFS quota -u $TSTUSR $MOUNT  | \
1487             grep -E '^ *'$MOUNT' *[0-9]+\** *'${LVAL[0]}' *'${LVAL[1]}' *[0-9]+\** *'${LVAL[2]}' *'${LVAL[3]}) \
1488                  || error "lfs quota output is unexpected"
1489
1490         $LFS setquota -u $TSTUSR -b 0 -B 0 -i 0 -I 0 \
1491                                  $MOUNT || error "could not reset quota limits"
1492
1493 }
1494 run_test 20 "test if setquota specifiers work properly (15754)"
1495
1496 # turn off quota
1497 test_99()
1498 {
1499         $LFS quotaoff $DIR
1500         lctl set_param debug="-quota"
1501
1502         return 0
1503 }
1504 run_test 99 "Quota off ==============================="
1505
1506
1507 log "cleanup: ======================================================"
1508 cd $ORIG_PWD
1509 check_and_cleanup_lustre
1510 echo '=========================== finished ==============================='
1511 [ -f "$QUOTALOG" ] && cat $QUOTALOG && grep -q FAIL $QUOTALOG && exit 1 || true
1512 echo "$0: completed"