+error_dbench()
+{
+ local err_str=$1
+
+ killall -9 dbench
+ sleep 1
+
+ error $err_str
+}
+
+test_100() {
+ # started from default flavors
+ restore_to_default_flavor
+
+ # running dbench background
+ start_dbench
+
+ #
+ # all: null -> krb5n -> krb5a -> krb5i -> krb5p -> plain
+ #
+ set_rule $FSNAME any any krb5n
+ wait_flavor all2all krb5n $cnt_all2all || error_dbench "1"
+ check_dbench
+
+ set_rule $FSNAME any any krb5a
+ wait_flavor all2all krb5a $cnt_all2all || error_dbench "2"
+ check_dbench
+
+ set_rule $FSNAME any any krb5i
+ wait_flavor all2all krb5i $cnt_all2all || error_dbench "3"
+ check_dbench
+
+ set_rule $FSNAME any any krb5p
+ wait_flavor all2all krb5p $cnt_all2all || error_dbench "4"
+ check_dbench
+
+ set_rule $FSNAME any any plain
+ wait_flavor all2all plain $cnt_all2all || error_dbench "5"
+ check_dbench
+
+ #
+ # M - M: krb5a
+ # C - M: krb5i
+ # M - O: krb5p
+ # C - O: krb5n
+ #
+ set_rule $FSNAME any mdt2mdt krb5a
+ wait_flavor mdt2mdt krb5a $cnt_mdt2mdt || error_dbench "6"
+ check_dbench
+
+ set_rule $FSNAME any cli2mdt krb5i
+ wait_flavor cli2mdt krb5i $cnt_cli2mdt || error_dbench "7"
+ check_dbench
+
+ set_rule $FSNAME any mdt2ost krb5p
+ wait_flavor mdt2ost krb5p $cnt_mdt2ost || error_dbench "8"
+ check_dbench
+
+ set_rule $FSNAME any cli2ost krb5n
+ wait_flavor cli2ost krb5n $cnt_cli2ost || error_dbench "9"
+ check_dbench
+
+ #
+ # * - MDT0: krb5p
+ # * - OST0: krb5i
+ #
+ # nothing should be changed because they are override by above dir rules
+ #
+ set_rule $FSNAME-MDT0000 any any krb5p
+ set_rule $FSNAME-OST0000 any any krb5i
+ wait_flavor mdt2mdt krb5a $cnt_mdt2mdt || error_dbench "10"
+ wait_flavor cli2mdt krb5i $cnt_cli2mdt || error_dbench "11"
+ check_dbench
+ wait_flavor mdt2ost krb5p $cnt_mdt2ost || error_dbench "12"
+ wait_flavor cli2ost krb5n $cnt_cli2ost || error_dbench "13"
+
+ #
+ # delete all dir-specific rules
+ #
+ set_rule $FSNAME any mdt2mdt
+ set_rule $FSNAME any cli2mdt
+ set_rule $FSNAME any mdt2ost
+ set_rule $FSNAME any cli2ost
+ wait_flavor mdt2mdt krb5p $((MDSCOUNT - 1)) || error_dbench "14"
+ wait_flavor cli2mdt krb5p $CLICOUNT || error_dbench "15"
+ check_dbench
+ wait_flavor mdt2ost krb5i $MDSCOUNT || error_dbench "16"
+ wait_flavor cli2ost krb5i $CLICOUNT || error_dbench "17"
+ check_dbench
+
+ #
+ # remove:
+ # * - MDT0: krb5p
+ # * - OST0: krb5i
+ #
+ set_rule $FSNAME-MDT0000 any any
+ set_rule $FSNAME-OST0000 any any || error_dbench "18"
+ wait_flavor all2all plain $cnt_all2all || error_dbench "19"
+ check_dbench
+
+ stop_dbench
+}
+run_test 100 "change security flavor on the fly under load"
+
+switch_sec_test()
+{
+ local count=$1
+ local flavor0=$2
+ local flavor1=$3
+ local flavor2=$4
+ local df_pid=0
+ local wait_time=$((TIMEOUT + TIMEOUT / 4))
+ local num
+
+ #
+ # stop gss daemon, then switch to flavor1 (which should be a gss flavor),
+ # and run a 'df' which should hanging, wait the request timeout and
+ # resend, then switch the flavor to another one. To exercise the code of
+ # switching ctx/sec for a resend request.
+ #
+ echo ">>>>>>>>>>>>>>> Testing $flavor0 -> $flavor1 -> $flavor2..."
+
+ echo "(0) set base flavor $flavor0"
+ set_rule $FSNAME any cli2mdt $flavor0
+ wait_flavor cli2mdt $flavor0 $count
+ df $MOUNT
+ if [ $? -ne 0 ]; then
+ error "initial df failed"