+show_quota() {
+ if [ $1 = "-u" ]; then
+ if [ $2 = "$TSTUSR" ]; then
+ $SHOW_QUOTA_USER
+ else
+ $SHOW_QUOTA_USER2
+ fi
+ else
+ if [ $2 = "$TSTUSR" ]; then
+ $SHOW_QUOTA_GROUP
+ else
+ $SHOW_QUOTA_GROUP2
+ fi
+ fi
+}
+
+test_25_sub() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+ TESTFILE="$DIR/$tdir/$tfile-0"
+ rm -f $TESTFILE
+ LIMIT=$(( $BUNIT_SZ * ($OSTCOUNT + 1) + 4096 ))
+
+ wait_delete_completed
+
+ # set quota for $TSTUSR
+ log "setquota for $TSTUSR"
+ $LFS setquota $1 $TSTUSR -b $LIMIT -B $LIMIT -i 10 -I 10 $DIR
+ sleep 3
+ if [ "$1" == "-u" ]; then
+ quota_show_check a u $TSTUSR
+ else
+ quota_show_check a g $TSTUSR
+ fi
+
+ # set quota for $TSTUSR2
+ log "setquota for $TSTUSR2"
+ $LFS setquota $1 $TSTUSR2 -b $LIMIT -B $LIMIT -i 10 -I 10 $DIR
+ sleep 3
+ if [ "$1" == "-u" ]; then
+ quota_show_check a u $TSTUSR2
+ else
+ quota_show_check a g $TSTUSR2
+ fi
+
+ # set stripe index to 0
+ log "setstripe for $DIR/$tdir to 0"
+ $LFS setstripe $DIR/$tdir -c 1 -i 0
+ MDS_UUID=`do_facet $SINGLEMDS $LCTL dl | grep -m1 " mdt " | awk '{print $((NF-1))}'`
+ OST0_UUID=`do_facet ost1 $LCTL dl | grep -m1 obdfilter | awk '{print $((NF-1))}'`
+ MDS_QUOTA_USED_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ OST0_QUOTA_USED_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ MDS_QUOTA_USED2_OLD=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ OST0_QUOTA_USED2_OLD=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+
+ # TSTUSR write 4M
+ log "$TSTUSR write 4M to $TESTFILE"
+ $RUNAS dd if=/dev/zero of=$TESTFILE bs=4K count=1K || quota_error a $TSTUSR "dd failed"
+ sync
+ show_quota $1 $TSTUSR
+ show_quota $1 $TSTUSR2
+ MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ [ $MDS_QUOTA_USED_NEW -ne $((MDS_QUOTA_USED_OLD + 1)) ] && \
+ quota_error a $TSTUSR "$TSTUSR inode quota usage error: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
+ OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED_DELTA=$((OST0_QUOTA_USED_NEW - OST0_QUOTA_USED_OLD))
+ [ $OST0_QUOTA_USED_DELTA -lt 4096 ] && \
+ quota_error a $TSTUSR "$TSTUSR block quota usage error: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
+
+ # chown/chgrp from $TSTUSR to $TSTUSR2
+ if [ $1 = "-u" ]; then
+ log "chown from $TSTUSR to $TSTUSR2"
+ chown $TSTUSR2 $TESTFILE || quota_error u $TSTUSR2 "chown failed"
+ else
+ log "chgrp from $TSTUSR to $TSTUSR2"
+ chgrp $TSTUSR2 $TESTFILE || quota_error g $TSTUSR2 "chgrp failed"
+ fi
+ sync
+ show_quota $1 $TSTUSR
+ show_quota $1 $TSTUSR2
+ MDS_QUOTA_USED2_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ [ $MDS_QUOTA_USED2_NEW -ne $((MDS_QUOTA_USED2_OLD + 1)) ] && \
+ quota_error a $TSTUSR2 "$TSTUSR2 inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED2_OLD|$MDS_QUOTA_USED2_NEW]"
+ OST0_QUOTA_USED2_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR2 $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ OST0_QUOTA_USED2_DELTA=$((OST0_QUOTA_USED2_NEW - OST0_QUOTA_USED2_OLD))
+ [ $OST0_QUOTA_USED2_DELTA -ne $OST0_QUOTA_USED_DELTA ] && \
+ quota_error a $TSTUSR2 "$TSTUSR2 block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED2_OLD|$OST0_QUOTA_USED2_NEW]"
+ MDS_QUOTA_USED_NEW=`$LFS quota -o $MDS_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $4 }'`
+ [ $MDS_QUOTA_USED_NEW -ne $MDS_QUOTA_USED_OLD ] && \
+ quota_error a $TSTUSR "$TSTUSR inode quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$MDS_QUOTA_USED_OLD|$MDS_QUOTA_USED_NEW]"
+ OST0_QUOTA_USED_NEW=`$LFS quota -o $OST0_UUID $1 $TSTUSR $DIR | awk '/^.*[[:digit:]+][[:space:]+]/ { print $1 }'`
+ [ $OST0_QUOTA_USED_NEW -ne $OST0_QUOTA_USED_OLD ] && \
+ quota_error a $TSTUSR "$TSTUSR block quota usage transfer from $TSTUSR to $TSTUSR2 failed: [$OST0_QUOTA_USED_OLD|$OST0_QUOTA_USED_NEW]"
+
+ rm -f $TESTFILE
+ wait_delete_completed
+ resetquota $1 $TSTUSR
+ resetquota $1 $TSTUSR2
+}
+
+test_25() {
+ log "run for chown case"
+ test_25_sub -u
+
+ log "run for chgrp case"
+ test_25_sub -g
+}
+run_test_with_stat 25 "test whether quota usage is transfered when chown/chgrp (18081) ==========="
+
+test_26() {
+ mkdir -p $DIR/$tdir
+ chmod 0777 $DIR/$tdir
+ TESTFILE="$DIR/$tdir/$tfile-0"
+ TESTFILE2="$DIR/$tdir/$tfile-1"
+ set_blk_tunesz 512
+ set_blk_unitsz 1024
+
+ wait_delete_completed
+
+ # every quota slave gets 20MB
+ b_limit=$((OSTCOUNT * 20 * 1024))
+ log "limit: ${b_limit}KB"
+ $LFS setquota -u $TSTUSR -b 0 -B $b_limit -i 0 -I 0 $DIR
+ sleep 3
+ quota_show_check b u $TSTUSR
+
+ $LFS setstripe $TESTFILE -c 1 -i 0
+ $LFS setstripe $TESTFILE2 -c 1 -i 0
+ chown $TSTUSR.$TSTUSR $TESTFILE
+ chown $TSTUSR.$TSTUSR $TESTFILE2
+
+ #define OBD_FAIL_QUOTA_DELAY_REL 0xA03
+ lustre_fail ost 0xA03
+
+ log " Write the first file..."
+ $RUNAS $DIRECTIO write $TESTFILE 0 10 $((BLK_SZ * 1024)) || quota_error u $TSTUSR "write failure, but expect success"
+ log " Delete the first file..."
+ rm -f $TESTFILE
+
+
+ wait_delete_completed
+
+ log " Write the second file..."
+ $RUNAS $DIRECTIO write $TESTFILE2 0 10 $((BLK_SZ * 1024)) || quota_error u $TSTUSR "write failure, but expect success"
+ log " Delete the second file..."
+ rm -f $TESTFILE2
+
+ lustre_fail ost 0
+ set_blk_unitsz $((128 * 1024))
+ set_blk_tunesz $((128 * 1024 / 2))
+ resetquota -u $TSTUSR
+}
+run_test_with_stat 26 "test for false quota error(bz18491) ======================================"
+