11.4Spgoyette# find where everything lives 21.4Spgoyette 31.4Spgoyettecurdir=$(pwd) 41.4Spgoyettehelper=$(atf_get_srcdir)/h_nullmnt 51.4Spgoyette 61.9Smartin# helper function to check for kernel support 71.9Smartinhave_nullfs_support() 81.9Smartin{ 91.9Smartin for t in $( sysctl -n vfs.generic.fstypes ) 101.9Smartin do 111.9Smartin case "$t" in 121.9Smartin null) return 0;; 131.9Smartin esac 141.9Smartin done 151.9Smartin 161.9Smartin return 1 171.9Smartin} 181.9Smartin 191.3Spgoyette# common test body 201.4Spgoyette# $1 = directory of file to monitor 211.4Spgoyette# $2 = directory of file to update/modify 221.1Spgoyette 231.3Spgoyettenullmnt_common() 241.9Smartin{ 251.9Smartin if ! have_nullfs_support; then 261.9Smartin atf_skip "nullfs not supported" 271.9Smartin fi 281.9Smartin 291.3Spgoyette mkdir ${curdir}/lower_dir 301.3Spgoyette mkdir ${curdir}/upper_dir 311.8Smartin mount -t null ${curdir}/lower_dir ${curdir}/upper_dir || \ 321.9Smartin atf_fail "could not mount nullfs" 331.3Spgoyette rm -f ${curdir}/lower_dir/afile 341.3Spgoyette touch ${curdir}/lower_dir/afile 351.1Spgoyette 361.3Spgoyette atf_check -e ignore -o ignore -s exit:0 \ 371.4Spgoyette ${helper} ${curdir}/${1}/afile ${curdir}/${2}/afile 381.3Spgoyette} 391.3Spgoyette 401.3Spgoyettenullmnt_common_cleanup() 411.3Spgoyette{ 421.3Spgoyette curdir=$(pwd) 431.3Spgoyette umount ${curdir}/upper_dir 441.3Spgoyette rm -rf ${curdir}/lower_dir ${curdir}/upper_dir 451.3Spgoyette} 461.3Spgoyette 471.3Spgoyetteatf_test_case nullmnt_upper_lower cleanup 481.3Spgoyettenullmnt_upper_lower_head() 491.3Spgoyette{ 501.3Spgoyette atf_set "descr" "ensure upper fs events seen on lower fs" 511.7Sriastrad atf_set "require.user" "root" 521.3Spgoyette} 531.3Spgoyettenullmnt_upper_lower_body() 541.3Spgoyette{ 551.4Spgoyette nullmnt_common lower_dir upper_dir 561.3Spgoyette} 571.3Spgoyettenullmnt_upper_lower_cleanup() 581.3Spgoyette{ 591.3Spgoyette nullmnt_common_cleanup 601.3Spgoyette} 611.1Spgoyette 621.3Spgoyetteatf_test_case nullmnt_upper_upper cleanup 631.3Spgoyettenullmnt_upper_upper_head() 641.3Spgoyette{ 651.3Spgoyette atf_set "descr" "ensure upper fs events seen on upper fs" 661.7Sriastrad atf_set "require.user" "root" 671.3Spgoyette} 681.3Spgoyettenullmnt_upper_upper_body() 691.3Spgoyette{ 701.4Spgoyette nullmnt_common upper_dir upper_dir 711.3Spgoyette} 721.3Spgoyettenullmnt_upper_upper_cleanup() 731.3Spgoyette{ 741.3Spgoyette nullmnt_common_cleanup 751.3Spgoyette} 761.3Spgoyetteatf_test_case nullmnt_lower_upper cleanup 771.3Spgoyettenullmnt_lower_upper_head() 781.3Spgoyette{ 791.3Spgoyette atf_set "descr" "ensure lower fs events seen on upper fs" 801.7Sriastrad atf_set "require.user" "root" 811.3Spgoyette} 821.3Spgoyettenullmnt_lower_upper_body() 831.3Spgoyette{ 841.4Spgoyette nullmnt_common upper_dir lower_dir 851.3Spgoyette} 861.3Spgoyettenullmnt_lower_upper_cleanup() 871.3Spgoyette{ 881.3Spgoyette nullmnt_common_cleanup 891.3Spgoyette} 901.1Spgoyette 911.3Spgoyetteatf_test_case nullmnt_lower_lower cleanup 921.3Spgoyettenullmnt_lower_lower_head() 931.3Spgoyette{ 941.3Spgoyette atf_set "descr" "ensure lower fs events seen on lower fs" 951.7Sriastrad atf_set "require.user" "root" 961.3Spgoyette} 971.3Spgoyettenullmnt_lower_lower_body() 981.3Spgoyette{ 991.4Spgoyette nullmnt_common lower_dir lower_dir 1001.1Spgoyette} 1011.5Spgoyettenullmnt_lower_lower_cleanup() 1021.1Spgoyette{ 1031.5Spgoyette nullmnt_common_cleanup 1041.1Spgoyette} 1051.1Spgoyette 1061.1Spgoyetteatf_init_test_cases() 1071.1Spgoyette{ 1081.3Spgoyette atf_add_test_case nullmnt_upper_upper 1091.3Spgoyette atf_add_test_case nullmnt_upper_lower 1101.3Spgoyette atf_add_test_case nullmnt_lower_upper 1111.3Spgoyette atf_add_test_case nullmnt_lower_lower 1121.1Spgoyette} 113