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