+test_77o() {
+ (( $OST1_VERSION > $(version_code 2.14.54) )) ||
+ skip "need OST > 2.14.54"
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies="tbf\ nid"
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ name\ nid={192.168.*.*@tcp}\ rate=10000"
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ name1\ nid={192.168.*.*@tcp}\ rate=10000"
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="change\ name1\ rank=name"
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="stop\ name"
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies="fifo"
+}
+run_test 77o "Changing rank should not panic"
+
+test_77q() {
+ local i
+
+ (( $MDS1_VERSION > $(version_code 2.14.54) )) ||
+ skip "need MDS >= 2.14.54"
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies="tbf"
+ stack_trap "do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies=fifo"
+
+ for i in {1..50}; do
+ local pid1 pid2
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'start rule77q_1 uid={500}&gid={500} rate=100'" &
+ pid1=$!
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'start rule77q_2 uid={1000}&gid={1000} rate=100'" &
+ pid2=$!
+ wait $pid1 || error "$i: Fail to start TBF rule 'rule77q_1'"
+ wait $pid2 || error "$i: Fail to start TBF rule 'rule77q_2'"
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'stop rule77q_1'" &
+ pid1=$!
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'stop rule77q_2'" &
+ pid2=$!
+ wait $pid1 || error "$i: Fail to stop TBF rule 'rule77q_1'"
+ wait $pid2 || error "$i: Fail to stop TBF rule 'rule77q_2'"
+ done
+}
+run_test 77q "Parallel TBF rule definitions should not panic"
+
+test_77p() {
+ local c
+ local -a spec_chars=(
+ '@' '.' '~' '#' '/' '^' '%' '*' ';' ',' '?' '<' '>' ':'
+ '+' '=' ')' '(' '{' '}' '|' '[' ']' '!' '&' '\$' '\`' '\\')
+
+ (( $MDS1_VERSION > $(version_code 2.14.54) )) ||
+ skip "need MDS >= 2.14.54"
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies="tbf"
+ stack_trap "do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies=fifo"
+
+ # TBF rule name size is 16 bytes
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ test_77p_overflo\ uid={500}\ rate=500" &&
+ error "The length of tbf rule name is not checked" || true
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ \ uid={500}\ rate=500" &&
+ error "The server should not accept empty tbf rule name" || true
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ test_77p_empty" &&
+ error "The server should not accept 'start <tbf_rule_name>' without an expression" || true
+
+ # Test with special chars
+ for c in "${spec_chars[@]}"; do
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'start test77p${c}spec uid={500} rate=500'" &&
+ error "Special char '${c}' should not be accepted in a tbf rule name" || true
+ done
+
+}
+run_test 77p "Check validity of rule names for TBF policies"
+