| .. | .. |
|---|
| 24 | 24 | |
|---|
| 25 | 25 | # This represents |
|---|
| 26 | 26 | # |
|---|
| 27 | | -# TEST_ID:TEST_COUNT:ENABLED |
|---|
| 27 | +# TEST_ID:TEST_COUNT:ENABLED:TARGET |
|---|
| 28 | 28 | # |
|---|
| 29 | 29 | # TEST_ID: is the test id number |
|---|
| 30 | 30 | # TEST_COUNT: number of times we should run the test |
|---|
| 31 | 31 | # ENABLED: 1 if enabled, 0 otherwise |
|---|
| 32 | +# TARGET: test target file required on the test_sysctl module |
|---|
| 32 | 33 | # |
|---|
| 33 | 34 | # Once these are enabled please leave them as-is. Write your own test, |
|---|
| 34 | 35 | # we have tons of space. |
|---|
| 35 | | -ALL_TESTS="0001:1:1" |
|---|
| 36 | | -ALL_TESTS="$ALL_TESTS 0002:1:1" |
|---|
| 37 | | -ALL_TESTS="$ALL_TESTS 0003:1:1" |
|---|
| 38 | | -ALL_TESTS="$ALL_TESTS 0004:1:1" |
|---|
| 39 | | -ALL_TESTS="$ALL_TESTS 0005:3:1" |
|---|
| 40 | | - |
|---|
| 41 | | -test_modprobe() |
|---|
| 42 | | -{ |
|---|
| 43 | | - if [ ! -d $DIR ]; then |
|---|
| 44 | | - echo "$0: $DIR not present" >&2 |
|---|
| 45 | | - echo "You must have the following enabled in your kernel:" >&2 |
|---|
| 46 | | - cat $TEST_DIR/config >&2 |
|---|
| 47 | | - exit $ksft_skip |
|---|
| 48 | | - fi |
|---|
| 49 | | -} |
|---|
| 36 | +ALL_TESTS="0001:1:1:int_0001" |
|---|
| 37 | +ALL_TESTS="$ALL_TESTS 0002:1:1:string_0001" |
|---|
| 38 | +ALL_TESTS="$ALL_TESTS 0003:1:1:int_0002" |
|---|
| 39 | +ALL_TESTS="$ALL_TESTS 0004:1:1:uint_0001" |
|---|
| 40 | +ALL_TESTS="$ALL_TESTS 0005:3:1:int_0003" |
|---|
| 41 | +ALL_TESTS="$ALL_TESTS 0006:50:1:bitmap_0001" |
|---|
| 42 | +ALL_TESTS="$ALL_TESTS 0007:1:1:boot_int" |
|---|
| 50 | 43 | |
|---|
| 51 | 44 | function allow_user_defaults() |
|---|
| 52 | 45 | { |
|---|
| .. | .. |
|---|
| 120 | 113 | |
|---|
| 121 | 114 | function load_req_mod() |
|---|
| 122 | 115 | { |
|---|
| 123 | | - if [ ! -d $DIR ]; then |
|---|
| 116 | + if [ ! -d $SYSCTL ]; then |
|---|
| 124 | 117 | if ! modprobe -q -n $TEST_DRIVER; then |
|---|
| 125 | 118 | echo "$0: module $TEST_DRIVER not found [SKIP]" |
|---|
| 119 | + echo "You must set CONFIG_TEST_SYSCTL=m in your kernel" >&2 |
|---|
| 126 | 120 | exit $ksft_skip |
|---|
| 127 | 121 | fi |
|---|
| 128 | 122 | modprobe $TEST_DRIVER |
|---|
| 129 | 123 | if [ $? -ne 0 ]; then |
|---|
| 124 | + echo "$0: modprobe $TEST_DRIVER failed." |
|---|
| 130 | 125 | exit |
|---|
| 131 | 126 | fi |
|---|
| 132 | 127 | fi |
|---|
| .. | .. |
|---|
| 149 | 144 | string_0001) |
|---|
| 150 | 145 | VAL="(none)" |
|---|
| 151 | 146 | ;; |
|---|
| 147 | + bitmap_0001) |
|---|
| 148 | + VAL="" |
|---|
| 149 | + ;; |
|---|
| 152 | 150 | *) |
|---|
| 153 | 151 | ;; |
|---|
| 154 | 152 | esac |
|---|
| .. | .. |
|---|
| 157 | 155 | |
|---|
| 158 | 156 | set_orig() |
|---|
| 159 | 157 | { |
|---|
| 160 | | - if [ ! -z $TARGET ]; then |
|---|
| 161 | | - echo "${ORIG}" > "${TARGET}" |
|---|
| 158 | + if [ ! -z $TARGET ] && [ ! -z $ORIG ]; then |
|---|
| 159 | + if [ -f ${TARGET} ]; then |
|---|
| 160 | + echo "${ORIG}" > "${TARGET}" |
|---|
| 161 | + fi |
|---|
| 162 | 162 | fi |
|---|
| 163 | 163 | } |
|---|
| 164 | 164 | |
|---|
| .. | .. |
|---|
| 177 | 177 | return 0 |
|---|
| 178 | 178 | } |
|---|
| 179 | 179 | |
|---|
| 180 | +# proc files get read a page at a time, which can confuse diff, |
|---|
| 181 | +# and get you incorrect results on proc files with long data. To use |
|---|
| 182 | +# diff against them you must first extract the output to a file, and |
|---|
| 183 | +# then compare against that file. |
|---|
| 184 | +verify_diff_proc_file() |
|---|
| 185 | +{ |
|---|
| 186 | + TMP_DUMP_FILE=$(mktemp) |
|---|
| 187 | + cat $1 > $TMP_DUMP_FILE |
|---|
| 188 | + |
|---|
| 189 | + if ! diff -w -q $TMP_DUMP_FILE $2; then |
|---|
| 190 | + return 1 |
|---|
| 191 | + else |
|---|
| 192 | + return 0 |
|---|
| 193 | + fi |
|---|
| 194 | +} |
|---|
| 195 | + |
|---|
| 180 | 196 | verify_diff_w() |
|---|
| 181 | 197 | { |
|---|
| 182 | | - echo "$TEST_STR" | diff -q -w -u - $1 |
|---|
| 198 | + echo "$TEST_STR" | diff -q -w -u - $1 > /dev/null |
|---|
| 183 | 199 | return $? |
|---|
| 184 | 200 | } |
|---|
| 185 | 201 | |
|---|
| .. | .. |
|---|
| 288 | 304 | echo "ok" |
|---|
| 289 | 305 | fi |
|---|
| 290 | 306 | test_rc |
|---|
| 307 | +} |
|---|
| 308 | + |
|---|
| 309 | +check_failure() |
|---|
| 310 | +{ |
|---|
| 311 | + echo -n "Testing that $1 fails as expected..." |
|---|
| 312 | + reset_vals |
|---|
| 313 | + TEST_STR="$1" |
|---|
| 314 | + orig="$(cat $TARGET)" |
|---|
| 315 | + echo -n "$TEST_STR" > $TARGET 2> /dev/null |
|---|
| 316 | + |
|---|
| 317 | + # write should fail and $TARGET should retain its original value |
|---|
| 318 | + if [ $? = 0 ] || [ "$(cat $TARGET)" != "$orig" ]; then |
|---|
| 319 | + echo "FAIL" >&2 |
|---|
| 320 | + rc=1 |
|---|
| 321 | + else |
|---|
| 322 | + echo "ok" |
|---|
| 323 | + fi |
|---|
| 324 | + test_rc |
|---|
| 325 | +} |
|---|
| 326 | + |
|---|
| 327 | +run_wideint_tests() |
|---|
| 328 | +{ |
|---|
| 329 | + # sysctl conversion functions receive a boolean sign and ulong |
|---|
| 330 | + # magnitude; here we list the magnitudes we want to test (each of |
|---|
| 331 | + # which will be tested in both positive and negative forms). Since |
|---|
| 332 | + # none of these values fit in 32 bits, writing them to an int- or |
|---|
| 333 | + # uint-typed sysctl should fail. |
|---|
| 334 | + local magnitudes=( |
|---|
| 335 | + # common boundary-condition values (zero, +1, -1, INT_MIN, |
|---|
| 336 | + # and INT_MAX respectively) if truncated to lower 32 bits |
|---|
| 337 | + # (potential for being falsely deemed in range) |
|---|
| 338 | + 0x0000000100000000 |
|---|
| 339 | + 0x0000000100000001 |
|---|
| 340 | + 0x00000001ffffffff |
|---|
| 341 | + 0x0000000180000000 |
|---|
| 342 | + 0x000000017fffffff |
|---|
| 343 | + |
|---|
| 344 | + # these look like negatives, but without a leading '-' are |
|---|
| 345 | + # actually large positives (should be rejected as above |
|---|
| 346 | + # despite being zero/+1/-1/INT_MIN/INT_MAX in the lower 32) |
|---|
| 347 | + 0xffffffff00000000 |
|---|
| 348 | + 0xffffffff00000001 |
|---|
| 349 | + 0xffffffffffffffff |
|---|
| 350 | + 0xffffffff80000000 |
|---|
| 351 | + 0xffffffff7fffffff |
|---|
| 352 | + ) |
|---|
| 353 | + |
|---|
| 354 | + for sign in '' '-'; do |
|---|
| 355 | + for mag in "${magnitudes[@]}"; do |
|---|
| 356 | + check_failure "${sign}${mag}" |
|---|
| 357 | + done |
|---|
| 358 | + done |
|---|
| 291 | 359 | } |
|---|
| 292 | 360 | |
|---|
| 293 | 361 | # Your test must accept digits 3 and 4 to use this |
|---|
| .. | .. |
|---|
| 548 | 616 | test_rc |
|---|
| 549 | 617 | } |
|---|
| 550 | 618 | |
|---|
| 619 | +target_exists() |
|---|
| 620 | +{ |
|---|
| 621 | + TARGET="${SYSCTL}/$1" |
|---|
| 622 | + TEST_ID="$2" |
|---|
| 623 | + |
|---|
| 624 | + if [ ! -f ${TARGET} ] ; then |
|---|
| 625 | + echo "Target for test $TEST_ID: $TARGET not exist, skipping test ..." |
|---|
| 626 | + return 0 |
|---|
| 627 | + fi |
|---|
| 628 | + return 1 |
|---|
| 629 | +} |
|---|
| 630 | + |
|---|
| 631 | +run_bitmaptest() { |
|---|
| 632 | + # Total length of bitmaps string to use, a bit under |
|---|
| 633 | + # the maximum input size of the test node |
|---|
| 634 | + LENGTH=$((RANDOM % 65000)) |
|---|
| 635 | + |
|---|
| 636 | + # First bit to set |
|---|
| 637 | + BIT=$((RANDOM % 1024)) |
|---|
| 638 | + |
|---|
| 639 | + # String containing our list of bits to set |
|---|
| 640 | + TEST_STR=$BIT |
|---|
| 641 | + |
|---|
| 642 | + # build up the string |
|---|
| 643 | + while [ "${#TEST_STR}" -le "$LENGTH" ]; do |
|---|
| 644 | + # Make sure next entry is discontiguous, |
|---|
| 645 | + # skip ahead at least 2 |
|---|
| 646 | + BIT=$((BIT + $((2 + RANDOM % 10)))) |
|---|
| 647 | + |
|---|
| 648 | + # Add new bit to the list |
|---|
| 649 | + TEST_STR="${TEST_STR},${BIT}" |
|---|
| 650 | + |
|---|
| 651 | + # Randomly make it a range |
|---|
| 652 | + if [ "$((RANDOM % 2))" -eq "1" ]; then |
|---|
| 653 | + RANGE_END=$((BIT + $((1 + RANDOM % 10)))) |
|---|
| 654 | + TEST_STR="${TEST_STR}-${RANGE_END}" |
|---|
| 655 | + BIT=$RANGE_END |
|---|
| 656 | + fi |
|---|
| 657 | + done |
|---|
| 658 | + |
|---|
| 659 | + echo -n "Checking bitmap handler... " |
|---|
| 660 | + TEST_FILE=$(mktemp) |
|---|
| 661 | + echo -n "$TEST_STR" > $TEST_FILE |
|---|
| 662 | + |
|---|
| 663 | + cat $TEST_FILE > $TARGET 2> /dev/null |
|---|
| 664 | + if [ $? -ne 0 ]; then |
|---|
| 665 | + echo "FAIL" >&2 |
|---|
| 666 | + rc=1 |
|---|
| 667 | + test_rc |
|---|
| 668 | + fi |
|---|
| 669 | + |
|---|
| 670 | + if ! verify_diff_proc_file "$TARGET" "$TEST_FILE"; then |
|---|
| 671 | + echo "FAIL" >&2 |
|---|
| 672 | + rc=1 |
|---|
| 673 | + else |
|---|
| 674 | + echo "ok" |
|---|
| 675 | + rc=0 |
|---|
| 676 | + fi |
|---|
| 677 | + test_rc |
|---|
| 678 | +} |
|---|
| 679 | + |
|---|
| 551 | 680 | sysctl_test_0001() |
|---|
| 552 | 681 | { |
|---|
| 553 | | - TARGET="${SYSCTL}/int_0001" |
|---|
| 682 | + TARGET="${SYSCTL}/$(get_test_target 0001)" |
|---|
| 554 | 683 | reset_vals |
|---|
| 555 | 684 | ORIG=$(cat "${TARGET}") |
|---|
| 556 | 685 | TEST_STR=$(( $ORIG + 1 )) |
|---|
| 557 | 686 | |
|---|
| 558 | 687 | run_numerictests |
|---|
| 688 | + run_wideint_tests |
|---|
| 559 | 689 | run_limit_digit |
|---|
| 560 | 690 | } |
|---|
| 561 | 691 | |
|---|
| 562 | 692 | sysctl_test_0002() |
|---|
| 563 | 693 | { |
|---|
| 564 | | - TARGET="${SYSCTL}/string_0001" |
|---|
| 694 | + TARGET="${SYSCTL}/$(get_test_target 0002)" |
|---|
| 565 | 695 | reset_vals |
|---|
| 566 | 696 | ORIG=$(cat "${TARGET}") |
|---|
| 567 | 697 | TEST_STR="Testing sysctl" |
|---|
| .. | .. |
|---|
| 574 | 704 | |
|---|
| 575 | 705 | sysctl_test_0003() |
|---|
| 576 | 706 | { |
|---|
| 577 | | - TARGET="${SYSCTL}/int_0002" |
|---|
| 707 | + TARGET="${SYSCTL}/$(get_test_target 0003)" |
|---|
| 578 | 708 | reset_vals |
|---|
| 579 | 709 | ORIG=$(cat "${TARGET}") |
|---|
| 580 | 710 | TEST_STR=$(( $ORIG + 1 )) |
|---|
| 581 | 711 | |
|---|
| 582 | 712 | run_numerictests |
|---|
| 713 | + run_wideint_tests |
|---|
| 583 | 714 | run_limit_digit |
|---|
| 584 | 715 | run_limit_digit_int |
|---|
| 585 | 716 | } |
|---|
| 586 | 717 | |
|---|
| 587 | 718 | sysctl_test_0004() |
|---|
| 588 | 719 | { |
|---|
| 589 | | - TARGET="${SYSCTL}/uint_0001" |
|---|
| 720 | + TARGET="${SYSCTL}/$(get_test_target 0004)" |
|---|
| 590 | 721 | reset_vals |
|---|
| 591 | 722 | ORIG=$(cat "${TARGET}") |
|---|
| 592 | 723 | TEST_STR=$(( $ORIG + 1 )) |
|---|
| 593 | 724 | |
|---|
| 594 | 725 | run_numerictests |
|---|
| 726 | + run_wideint_tests |
|---|
| 595 | 727 | run_limit_digit |
|---|
| 596 | 728 | run_limit_digit_uint |
|---|
| 597 | 729 | } |
|---|
| 598 | 730 | |
|---|
| 599 | 731 | sysctl_test_0005() |
|---|
| 600 | 732 | { |
|---|
| 601 | | - TARGET="${SYSCTL}/int_0003" |
|---|
| 733 | + TARGET="${SYSCTL}/$(get_test_target 0005)" |
|---|
| 602 | 734 | reset_vals |
|---|
| 603 | 735 | ORIG=$(cat "${TARGET}") |
|---|
| 604 | 736 | |
|---|
| 605 | 737 | run_limit_digit_int_array |
|---|
| 738 | +} |
|---|
| 739 | + |
|---|
| 740 | +sysctl_test_0006() |
|---|
| 741 | +{ |
|---|
| 742 | + TARGET="${SYSCTL}/bitmap_0001" |
|---|
| 743 | + reset_vals |
|---|
| 744 | + ORIG="" |
|---|
| 745 | + run_bitmaptest |
|---|
| 746 | +} |
|---|
| 747 | + |
|---|
| 748 | +sysctl_test_0007() |
|---|
| 749 | +{ |
|---|
| 750 | + TARGET="${SYSCTL}/boot_int" |
|---|
| 751 | + if [ ! -f $TARGET ]; then |
|---|
| 752 | + echo "Skipping test for $TARGET as it is not present ..." |
|---|
| 753 | + return $ksft_skip |
|---|
| 754 | + fi |
|---|
| 755 | + |
|---|
| 756 | + if [ -d $DIR ]; then |
|---|
| 757 | + echo "Boot param test only possible sysctl_test is built-in, not module:" |
|---|
| 758 | + cat $TEST_DIR/config >&2 |
|---|
| 759 | + return $ksft_skip |
|---|
| 760 | + fi |
|---|
| 761 | + |
|---|
| 762 | + echo -n "Testing if $TARGET is set to 1 ..." |
|---|
| 763 | + ORIG=$(cat "${TARGET}") |
|---|
| 764 | + |
|---|
| 765 | + if [ x$ORIG = "x1" ]; then |
|---|
| 766 | + echo "ok" |
|---|
| 767 | + return 0 |
|---|
| 768 | + fi |
|---|
| 769 | + echo "FAIL" |
|---|
| 770 | + echo "Checking if /proc/cmdline contains setting of the expected parameter ..." |
|---|
| 771 | + if [ ! -f /proc/cmdline ]; then |
|---|
| 772 | + echo "/proc/cmdline does not exist, test inconclusive" |
|---|
| 773 | + return 0 |
|---|
| 774 | + fi |
|---|
| 775 | + |
|---|
| 776 | + FOUND=$(grep -c "sysctl[./]debug[./]test_sysctl[./]boot_int=1" /proc/cmdline) |
|---|
| 777 | + if [ $FOUND = "1" ]; then |
|---|
| 778 | + echo "Kernel param found but $TARGET is not 1, TEST FAILED" |
|---|
| 779 | + rc=1 |
|---|
| 780 | + test_rc |
|---|
| 781 | + fi |
|---|
| 782 | + |
|---|
| 783 | + echo "Skipping test, expected kernel parameter missing." |
|---|
| 784 | + echo "To perform this test, make sure kernel is booted with parameter: sysctl.debug.test_sysctl.boot_int=1" |
|---|
| 785 | + return $ksft_skip |
|---|
| 606 | 786 | } |
|---|
| 607 | 787 | |
|---|
| 608 | 788 | list_tests() |
|---|
| .. | .. |
|---|
| 618 | 798 | echo "0003 x $(get_test_count 0003) - tests proc_dointvec()" |
|---|
| 619 | 799 | echo "0004 x $(get_test_count 0004) - tests proc_douintvec()" |
|---|
| 620 | 800 | echo "0005 x $(get_test_count 0005) - tests proc_douintvec() array" |
|---|
| 801 | + echo "0006 x $(get_test_count 0006) - tests proc_do_large_bitmap()" |
|---|
| 802 | + echo "0007 x $(get_test_count 0007) - tests setting sysctl from kernel boot param" |
|---|
| 621 | 803 | } |
|---|
| 622 | | - |
|---|
| 623 | | -test_reqs |
|---|
| 624 | 804 | |
|---|
| 625 | 805 | usage() |
|---|
| 626 | 806 | { |
|---|
| .. | .. |
|---|
| 669 | 849 | { |
|---|
| 670 | 850 | test_num $1 |
|---|
| 671 | 851 | TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}') |
|---|
| 672 | | - LAST_TWO=${TEST_DATA#*:*} |
|---|
| 673 | | - echo ${LAST_TWO%:*} |
|---|
| 852 | + echo ${TEST_DATA} | awk -F":" '{print $2}' |
|---|
| 674 | 853 | } |
|---|
| 675 | 854 | |
|---|
| 676 | 855 | function get_test_enabled() |
|---|
| 677 | 856 | { |
|---|
| 678 | 857 | test_num $1 |
|---|
| 679 | 858 | TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}') |
|---|
| 680 | | - echo ${TEST_DATA#*:*:} |
|---|
| 859 | + echo ${TEST_DATA} | awk -F":" '{print $3}' |
|---|
| 860 | +} |
|---|
| 861 | + |
|---|
| 862 | +function get_test_target() |
|---|
| 863 | +{ |
|---|
| 864 | + test_num $1 |
|---|
| 865 | + TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}') |
|---|
| 866 | + echo ${TEST_DATA} | awk -F":" '{print $4}' |
|---|
| 681 | 867 | } |
|---|
| 682 | 868 | |
|---|
| 683 | 869 | function run_all_tests() |
|---|
| 684 | 870 | { |
|---|
| 685 | 871 | for i in $ALL_TESTS ; do |
|---|
| 686 | | - TEST_ID=${i%:*:*} |
|---|
| 872 | + TEST_ID=${i%:*:*:*} |
|---|
| 687 | 873 | ENABLED=$(get_test_enabled $TEST_ID) |
|---|
| 688 | 874 | TEST_COUNT=$(get_test_count $TEST_ID) |
|---|
| 875 | + TEST_TARGET=$(get_test_target $TEST_ID) |
|---|
| 876 | + if target_exists $TEST_TARGET $TEST_ID; then |
|---|
| 877 | + continue |
|---|
| 878 | + fi |
|---|
| 689 | 879 | if [[ $ENABLED -eq "1" ]]; then |
|---|
| 690 | | - test_case $TEST_ID $TEST_COUNT |
|---|
| 880 | + test_case $TEST_ID $TEST_COUNT $TEST_TARGET |
|---|
| 691 | 881 | fi |
|---|
| 692 | 882 | done |
|---|
| 693 | 883 | } |
|---|
| .. | .. |
|---|
| 720 | 910 | |
|---|
| 721 | 911 | function test_case() |
|---|
| 722 | 912 | { |
|---|
| 723 | | - NUM_TESTS=$DEFAULT_NUM_TESTS |
|---|
| 724 | | - if [ $# -eq 2 ]; then |
|---|
| 725 | | - NUM_TESTS=$2 |
|---|
| 726 | | - fi |
|---|
| 913 | + NUM_TESTS=$2 |
|---|
| 727 | 914 | |
|---|
| 728 | 915 | i=0 |
|---|
| 916 | + |
|---|
| 917 | + if target_exists $3 $1; then |
|---|
| 918 | + continue |
|---|
| 919 | + fi |
|---|
| 920 | + |
|---|
| 729 | 921 | while [ $i -lt $NUM_TESTS ]; do |
|---|
| 730 | 922 | test_num $1 |
|---|
| 731 | 923 | watch_log $i ${TEST_NAME}_test_$1 noclear |
|---|
| .. | .. |
|---|
| 748 | 940 | elif [[ "$1" = "-t" ]]; then |
|---|
| 749 | 941 | shift |
|---|
| 750 | 942 | test_num $1 |
|---|
| 751 | | - test_case $1 $(get_test_count $1) |
|---|
| 943 | + test_case $1 $(get_test_count $1) $(get_test_target $1) |
|---|
| 752 | 944 | elif [[ "$1" = "-c" ]]; then |
|---|
| 753 | 945 | shift |
|---|
| 754 | 946 | test_num $1 |
|---|
| 755 | 947 | test_num $2 |
|---|
| 756 | | - test_case $1 $2 |
|---|
| 948 | + test_case $1 $2 $(get_test_target $1) |
|---|
| 757 | 949 | elif [[ "$1" = "-s" ]]; then |
|---|
| 758 | 950 | shift |
|---|
| 759 | | - test_case $1 1 |
|---|
| 951 | + test_case $1 1 $(get_test_target $1) |
|---|
| 760 | 952 | elif [[ "$1" = "-l" ]]; then |
|---|
| 761 | 953 | list_tests |
|---|
| 762 | 954 | elif [[ "$1" = "-h" || "$1" = "--help" ]]; then |
|---|
| .. | .. |
|---|
| 770 | 962 | test_reqs |
|---|
| 771 | 963 | allow_user_defaults |
|---|
| 772 | 964 | check_production_sysctl_writes_strict |
|---|
| 773 | | -test_modprobe |
|---|
| 774 | 965 | load_req_mod |
|---|
| 775 | 966 | |
|---|
| 776 | 967 | trap "test_finish" EXIT |
|---|