+test_64g() {
+ #[ $MDS1_VERSION -lt $(version_code 2.14.54) ] &&
+ # skip "Need MDS version at least 2.14.54"
+
+ local mdts=$(comma_list $(mdts_nodes))
+
+ local old=$($LCTL get_param mdc.$FSNAME-*.grant_shrink_interval |
+ tr '\n' ' ')
+ stack_trap "$LCTL set_param $old"
+
+ # generate dirty pages and increase dirty granted on MDT
+ stack_trap "rm -f $DIR/$tfile-*"
+ for (( i = 0; i < 10; i++)); do
+ $LFS setstripe -E 1M -L mdt $DIR/$tfile-$i ||
+ error "can't set stripe"
+ dd if=/dev/zero of=$DIR/$tfile-$i bs=128k count=1 ||
+ error "can't dd"
+ $LFS getstripe $DIR/$tfile-$i | grep -q pattern.*mdt || {
+ $LFS getstripe $DIR/$tfile-$i
+ error "not DoM file"
+ }
+ done
+
+ # flush dirty pages
+ sync
+
+ # wait until grant shrink reset grant dirty on MDTs
+ for ((i = 0; i < 120; i++)); do
+ grant_dirty=$(do_nodes $mdts $LCTL get_param -n mdt.*.tot_dirty |
+ awk '{sum=sum+$1} END {print sum}')
+ vm_dirty=$(awk '/Dirty:/{print $2}' /proc/meminfo)
+ echo "$grant_dirty grants, $vm_dirty pages"
+ (( grant_dirty + vm_dirty == 0 )) && break
+ (( i == 3 )) && sync &&
+ $LCTL set_param mdc.$FSNAME-*.grant_shrink_interval=5
+ sleep 1
+ done
+
+ grant_dirty=$(do_nodes $mdts $LCTL get_param -n mdt.*.tot_dirty |
+ awk '{sum=sum+$1} END {print sum}')
+ (( grant_dirty == 0 )) || error "$grant_dirty on MDT"
+}
+run_test 64g "grant shrink on MDT"
+
+test_64h() {
+ local instance=$($LFS getname -i $DIR)
+ local osc_tgt="$FSNAME-OST0000-osc-$instance"
+ local num_exps=$(do_facet ost1 \
+ $LCTL get_param -n obdfilter.*OST0000*.num_exports)
+ local max_brw_size=$(import_param $osc_tgt max_brw_size)
+ local avail=$($LCTL get_param -n osc.*OST0000-osc-$instance.kbytesavail)
+ local p="$TMP/$TESTSUITE-$TESTNAME.parameters"
+
+ # 10MiB is for file to be written, max_brw_size * 16 *
+ # num_exps is space reserve so that tgt_grant_shrink() decided
+ # to not shrink
+ local expect=$((max_brw_size * 16 * num_exps + 10 * 1048576))
+ (( avail * 1024 < expect )) &&
+ skip "need $expect bytes on ost1, have $(( avail * 1024 )) only"
+
+ save_lustre_params client "osc.*OST0000*.grant_shrink" > $p
+ save_lustre_params client "osc.*OST0000*.grant_shrink_interval" >> $p
+ stack_trap "restore_lustre_params < $p; rm -f $save" EXIT
+ $LCTL set_param osc.*OST0000*.grant_shrink=1
+ $LCTL set_param osc.*OST0000*.grant_shrink_interval=10
+
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=10 oflag=sync
+
+ # drop cache so that coming read would do rpc
+ cancel_lru_locks osc
+
+ # shrink interval is set to 10, pause for 7 seconds so that
+ # grant thread did not wake up yet but coming read entered
+ # shrink mode for rpc (osc_should_shrink_grant())
+ sleep 7
+
+ declare -a cur_grant_bytes
+ declare -a tot_granted
+ cur_grant_bytes[0]=$($LCTL get_param -n osc.*OST0000*.cur_grant_bytes)
+ tot_granted[0]=$(do_facet ost1 \
+ $LCTL get_param -n obdfilter.*OST0000*.tot_granted)
+
+ dd if=$DIR/$tfile bs=4K count=1 of=/dev/null
+
+ cur_grant_bytes[1]=$($LCTL get_param -n osc.*OST0000*.cur_grant_bytes)
+ tot_granted[1]=$(do_facet ost1 \
+ $LCTL get_param -n obdfilter.*OST0000*.tot_granted)
+
+ # grant change should be equal on both sides
+ (( cur_grant_bytes[0] - cur_grant_bytes[1] ==
+ tot_granted[0] - tot_granted[1])) ||
+ error "grant change mismatch, " \
+ "server: ${tot_granted[0]} to ${tot_granted[1]}, " \
+ "client: ${cur_grant_bytes[0]} to ${cur_grant_bytes[1]}"
+}
+run_test 64h "grant shrink on read"
+
+test_64i() {
+ (( $OST1_VERSION >= $(version_code 2.14.55) )) ||
+ skip "need OST at least 2.14.55 to avoid grant shrink on replay"
+
+ [ $PARALLEL == "yes" ] && skip "skip parallel run"
+ remote_ost_nodsh && skip "remote OSTs with nodsh"
+
+ $LFS setstripe -c 1 -i 0 $DIR/$tfile
+
+ dd if=/dev/zero of=$DIR/$tfile bs=1M count=64
+
+ # lustre-ffff9fc75e850800 /mnt/lustre -> ffff9fc75e850800
+ local instance=$($LFS getname -i $DIR)
+
+ local osc_tgt="$FSNAME-OST0000-osc-$instance"
+ local cgb=$($LCTL get_param -n osc.$osc_tgt.cur_grant_bytes)
+
+ # shrink grants and simulate rpc loss
+ #define OBD_FAIL_PTLRPC_DROP_REQ_OPC 0x513
+ do_facet ost1 "$LCTL set_param fail_loc=0x80000513 fail_val=17"
+ $LCTL set_param osc.$osc_tgt.cur_grant_bytes=$((cgb/2))B
+
+ fail ost1
+
+ dd if=/dev/zero of=$DIR/$tfile oflag=append bs=1M count=8 conv=notrunc
+
+ local testid=$(echo $TESTNAME | tr '_' ' ')
+
+ do_facet ost1 dmesg | tac | sed "/$testid/,$ d" |
+ grep "GRANT, real grant" &&
+ error "client has more grants then it owns" || true
+}
+run_test 64i "shrink on reconnect"
+