+check_som_nodata()
+{
+ $LFS getsom $1
+ [[ $? -eq 61 ]] || error "DoM-only file $1 has SOM xattr"
+}
+
+test_809() {
+ [ $MDS1_VERSION -lt $(version_code 2.11.56) ] &&
+ skip "Need MDS version at least 2.11.56"
+
+ $LFS setstripe -E 1M -L mdt $DIR/$tfile ||
+ error "failed to create DoM-only file $DIR/$tfile"
+ touch $DIR/$tfile || error "touch $tfile failed"
+ check_som_nodata $DIR/$tfile
+
+ dd if=/dev/zero of=$DIR/$tfile bs=2048 count=1 ||
+ error "write $tfile failed"
+ check_som_nodata $DIR/$tfile
+
+ $TRUNCATE $DIR/$tfile 1234
+ check_som_nodata $DIR/$tfile
+
+ $TRUNCATE $DIR/$tfile 4097
+ check_som_nodata $DIR/$file
+}
+run_test 809 "Verify no SOM xattr store for DoM-only files"
+
+test_810() {
+ local ORIG
+ local CSUM
+
+ # t10 seem to dislike partial pages
+ lctl set_param osc.*.checksum_type=adler
+ lctl set_param fail_loc=0x411
+ dd if=/dev/urandom of=$DIR/$tfile bs=10240 count=2
+ ORIG=$(md5sum $DIR/$tfile)
+ lctl set_param ldlm.namespaces.*osc*.lru_size=clear
+ CSUM=$(md5sum $DIR/$tfile)
+ set_checksum_type adler
+ if [ "$ORIG" != "$CSUM" ]; then
+ error "$ORIG != $CSUM"
+ fi
+}
+run_test 810 "partial page writes on ZFS (LU-11663)"
+
+test_811() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.11.56) ] &&
+ skip "Need MDS version at least 2.11.56"
+
+ #define OBD_FAIL_MDS_ORPHAN_DELETE 0x165
+ do_facet mds1 $LCTL set_param fail_loc=0x165
+ $MULTIOP $DIR/$tfile Ouc || error "multiop failed"
+
+ stop mds1
+ start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS
+
+ sleep 5
+ [[ $(do_facet mds1 pgrep orph_.*-MDD | wc -l) -eq 0 ]] ||
+ error "MDD orphan cleanup thread not quit"
+}
+run_test 811 "orphan name stub can be cleaned up in startup"
+
+test_812() {
+ [ $OST1_VERSION -lt $(version_code 2.12.51) ] &&
+ skip "OST < 2.12.51 doesn't support this fail_loc"
+ [ "$SHARED_KEY" = true ] &&
+ skip "OSC connections never go IDLE with Shared-Keys enabled"
+
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+ # ensure ost1 is connected
+ stat $DIR/$tfile >/dev/null || error "can't stat"
+ wait_osc_import_state client ost1 FULL
+ # no locks, no reqs to let the connection idle
+ cancel_lru_locks osc
+
+ # delay OST_DISCONNECT on OST1 to put OSC into intermediate state
+#define OBD_FAIL_OST_DISCONNECT_DELAY 0x245
+ do_facet ost1 "$LCTL set_param fail_loc=0x245 fail_val=8"
+ wait_osc_import_state client ost1 CONNECTING
+ do_facet ost1 "$LCTL set_param fail_loc=0 fail_val=0"
+
+ stat $DIR/$tfile >/dev/null || error "can't stat file"
+}
+run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)"
+
+test_813() {
+ local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null)
+ [ -z "$file_heat_sav" ] && skip "no file heat support"
+
+ local readsample
+ local writesample
+ local readbyte
+ local writebyte
+ local readsample1
+ local writesample1
+ local readbyte1
+ local writebyte1
+
+ local period_second=$($LCTL get_param -n llite.*.heat_period_second)
+ local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage)
+
+ $LCTL set_param -n llite.*.file_heat=1
+ echo "Turn on file heat"
+ echo "Period second: $period_second, Decay percentage: $decay_pct"
+
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+
+ local out=$($LFS heat_get $DIR/$tfile)
+
+ $LFS heat_get $DIR/$tfile
+ readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $readsample -le 4 ] || error "read sample ($readsample) is wrong"
+ [ $writesample -le 3 ] || error "write sample ($writesample) is wrong"
+ [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong"
+ [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong"
+
+ sleep $((period_second + 3))
+ echo "Sleep $((period_second + 3)) seconds..."
+ # The recursion formula to calculate the heat of the file f is as
+ # follow:
+ # Hi+1(f) = (1-P)*Hi(f)+ P*Ci
+ # Where Hi is the heat value in the period between time points i*I and
+ # (i+1)*I; Ci is the access count in the period; the symbol P refers
+ # to the weight of Ci.
+ out=$($LFS heat_get $DIR/$tfile)
+ $LFS heat_get $DIR/$tfile
+ readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] ||
+ error "read sample ($readsample) is wrong"
+ [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] ||
+ error "write sample ($writesample) is wrong"
+ [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] ||
+ error "read bytes ($readbyte) is wrong"
+ [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] ||
+ error "write bytes ($writebyte) is wrong"
+
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+
+ sleep $((period_second + 3))
+ echo "Sleep $((period_second + 3)) seconds..."
+
+ out=$($LFS heat_get $DIR/$tfile)
+ $LFS heat_get $DIR/$tfile
+ readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \
+ 4 * $decay_pct) / 100") -eq 1 ] ||
+ error "read sample ($readsample1) is wrong"
+ [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \
+ 3 * $decay_pct) / 100") -eq 1 ] ||
+ error "write sample ($writesample1) is wrong"
+ [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \
+ 20 * $decay_pct) / 100") -eq 1 ] ||
+ error "read bytes ($readbyte1) is wrong"
+ [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \
+ 15 * $decay_pct) / 100") -eq 1 ] ||
+ error "write bytes ($writebyte1) is wrong"
+
+ echo "Turn off file heat for the file $DIR/$tfile"
+ $LFS heat_set -o $DIR/$tfile
+
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+
+ out=$($LFS heat_get $DIR/$tfile)
+ $LFS heat_get $DIR/$tfile
+ readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
+ [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
+ [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
+ [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
+
+ echo "Trun on file heat for the file $DIR/$tfile"
+ $LFS heat_set -O $DIR/$tfile
+
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+
+ out=$($LFS heat_get $DIR/$tfile)
+ $LFS heat_get $DIR/$tfile
+ readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong"
+ [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong"
+ [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong"
+ [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong"
+
+ $LFS heat_set -c $DIR/$tfile
+ $LCTL set_param -n llite.*.file_heat=0
+ echo "Turn off file heat support for the Lustre filesystem"
+
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ echo "QQQQ" > $DIR/$tfile
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+ cat $DIR/$tfile > /dev/null
+
+ out=$($LFS heat_get $DIR/$tfile)
+ $LFS heat_get $DIR/$tfile
+ readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }')
+ writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }')
+ readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }')
+ writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }')
+
+ [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong"
+ [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong"
+ [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong"
+ [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong"
+
+ $LCTL set_param -n llite.*.file_heat=$file_heat_sav
+ rm -f $DIR/$tfile
+}
+run_test 813 "File heat verfication"
+
+test_814()
+{
+ dd of=$DIR/$tfile seek=128 bs=1k < /dev/null
+ echo -n y >> $DIR/$tfile
+ cp --sparse=always $DIR/$tfile $DIR/${tfile}.cp || error "copy failed"
+ diff $DIR/$tfile $DIR/${tfile}.cp || error "files should be same"
+}
+run_test 814 "sparse cp works as expected (LU-12361)"
+
+test_815()
+{
+ writeme -b 100 $DIR/$tfile || error "write 100 bytes failed"
+ writeme -b 0 $DIR/$tfile || error "write 0 byte failed"
+}
+run_test 815 "zero byte tiny write doesn't hang (LU-12382)"
+
+test_816() {
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+ # ensure ost1 is connected
+ stat $DIR/$tfile >/dev/null || error "can't stat"
+ wait_osc_import_state client ost1 FULL
+ # no locks, no reqs to let the connection idle
+ cancel_lru_locks osc
+ lru_resize_disable osc
+ local before
+ local now
+ before=$($LCTL get_param -n \
+ ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
+
+ wait_osc_import_state client ost1 IDLE
+ dd if=/dev/null of=$DIR/$tfile bs=1k count=1 conv=sync
+ now=$($LCTL get_param -n \
+ ldlm.namespaces.$FSNAME-OST0000-osc-[^M]*.lru_size)
+ [ $before == $now ] || error "lru_size changed $before != $now"
+}
+run_test 816 "do not reset lru_resize on idle reconnect"
+