157718be8SEnji Cooper 257718be8SEnji Cooper# Common settings and functions for the various resize_ffs tests. 357718be8SEnji Cooper# 457718be8SEnji Cooper 557718be8SEnji Cooper# called from atf_init_test_cases 657718be8SEnji Coopersetupvars() 757718be8SEnji Cooper{ 857718be8SEnji Cooper IMG=fsimage 957718be8SEnji Cooper TDBASE64=$(atf_get_srcdir)/testdata.tar.gz.base64 1057718be8SEnji Cooper GOODMD5=$(atf_get_srcdir)/testdata.md5 1157718be8SEnji Cooper # set BYTESWAP to opposite-endian. 1257718be8SEnji Cooper if [ $(sysctl -n hw.byteorder) = "1234" ]; then 1357718be8SEnji Cooper BYTESWAP=be 1457718be8SEnji Cooper else 1557718be8SEnji Cooper BYTESWAP=le 1657718be8SEnji Cooper fi 1757718be8SEnji Cooper} 1857718be8SEnji Cooper 1957718be8SEnji Cooper# test_case() taken from the tests/ipf/h_common.sh 2057718be8SEnji Cooper# Used to declare the atf goop for a test. 2157718be8SEnji Coopertest_case() 2257718be8SEnji Cooper{ 2357718be8SEnji Cooper local name="${1}"; shift 2457718be8SEnji Cooper local check_function="${1}"; shift 2557718be8SEnji Cooper 2657718be8SEnji Cooper atf_test_case "${name}" cleanup 2757718be8SEnji Cooper eval "${name}_head() { \ 2857718be8SEnji Cooper atf_set "require.user" "root" ; \ 2957718be8SEnji Cooper atf_set "require.progs" "rump_ffs" ; \ 3057718be8SEnji Cooper }" 3157718be8SEnji Cooper eval "${name}_body() { \ 3257718be8SEnji Cooper ${check_function} " "${@}" "; \ 3357718be8SEnji Cooper }" 3457718be8SEnji Cooper eval "${name}_cleanup() { \ 3557718be8SEnji Cooper umount -f mnt ; \ 3657718be8SEnji Cooper : reset error ; \ 3757718be8SEnji Cooper }" 3857718be8SEnji Cooper} 3957718be8SEnji Cooper 4057718be8SEnji Cooper# Used to declare the atf goop for a test expected to fail. 4157718be8SEnji Coopertest_case_xfail() 4257718be8SEnji Cooper{ 4357718be8SEnji Cooper local name="${1}"; shift 4457718be8SEnji Cooper local reason="${1}"; shift 4557718be8SEnji Cooper local check_function="${1}"; shift 4657718be8SEnji Cooper 4757718be8SEnji Cooper atf_test_case "${name}" cleanup 4857718be8SEnji Cooper eval "${name}_head() { \ 4957718be8SEnji Cooper atf_set "require.user" "root" ; \ 5057718be8SEnji Cooper }" 5157718be8SEnji Cooper eval "${name}_body() { \ 5257718be8SEnji Cooper atf_expect_fail "${reason}" ; \ 5357718be8SEnji Cooper ${check_function} " "${@}" "; \ 5457718be8SEnji Cooper }" 5557718be8SEnji Cooper eval "${name}_cleanup() { \ 5657718be8SEnji Cooper umount -f mnt ; \ 5757718be8SEnji Cooper : reset error ; \ 5857718be8SEnji Cooper }" 5957718be8SEnji Cooper} 6057718be8SEnji Cooper 6157718be8SEnji Cooper# copy_data requires the mount already done; makes one copy of the test data 6257718be8SEnji Coopercopy_data () 6357718be8SEnji Cooper{ 6457718be8SEnji Cooper uudecode -p ${TDBASE64} | (cd mnt; tar xzf - -s/testdata/TD$1/) 6557718be8SEnji Cooper} 6657718be8SEnji Cooper 6757718be8SEnji Coopercopy_multiple () 6857718be8SEnji Cooper{ 6957718be8SEnji Cooper local i 7057718be8SEnji Cooper for i in $(seq $1); do 7157718be8SEnji Cooper copy_data $i 7257718be8SEnji Cooper done 7357718be8SEnji Cooper} 7457718be8SEnji Cooper 7557718be8SEnji Cooper# remove_data removes one directory worth of test data; the purpose 7657718be8SEnji Cooper# is to ensure data exists near the end of the fs under test. 7757718be8SEnji Cooperremove_data () 7857718be8SEnji Cooper{ 7957718be8SEnji Cooper rm -rf mnt/TD$1 8057718be8SEnji Cooper} 8157718be8SEnji Cooper 8257718be8SEnji Cooperremove_multiple () 8357718be8SEnji Cooper{ 8457718be8SEnji Cooper local i 8557718be8SEnji Cooper for i in $(seq $1); do 8657718be8SEnji Cooper remove_data $i 8757718be8SEnji Cooper done 8857718be8SEnji Cooper} 8957718be8SEnji Cooper 9057718be8SEnji Cooper# verify that the data in a particular directory is still OK 9157718be8SEnji Cooper# generated md5 file doesn't need explicit cleanup thanks to ATF 9257718be8SEnji Coopercheck_data () 9357718be8SEnji Cooper{ 9457718be8SEnji Cooper (cd mnt/TD$1 && md5 *) > TD$1.md5 9557718be8SEnji Cooper atf_check diff -u ${GOODMD5} TD$1.md5 9657718be8SEnji Cooper} 9757718be8SEnji Cooper 9857718be8SEnji Cooper# supply begin and end arguments 9957718be8SEnji Coopercheck_data_range () 10057718be8SEnji Cooper{ 10157718be8SEnji Cooper local i 10257718be8SEnji Cooper for i in $(seq $1 $2); do 10357718be8SEnji Cooper check_data $i 10457718be8SEnji Cooper done 10557718be8SEnji Cooper} 10657718be8SEnji Cooper 10757718be8SEnji Cooper 10857718be8SEnji Cooperresize_ffs() 10957718be8SEnji Cooper{ 11057718be8SEnji Cooper echo "in resize_ffs:" ${@} 11157718be8SEnji Cooper local bs=$1 11257718be8SEnji Cooper local fragsz=$2 11357718be8SEnji Cooper local osize=$3 11457718be8SEnji Cooper local nsize=$4 11557718be8SEnji Cooper local fslevel=$5 11657718be8SEnji Cooper local numdata=$6 11757718be8SEnji Cooper local swap=$7 11857718be8SEnji Cooper mkdir -p mnt 11957718be8SEnji Cooper echo "bs is ${bs} numdata is ${numdata}" 12057718be8SEnji Cooper echo "****resizing fs with blocksize ${bs}" 12157718be8SEnji Cooper 12257718be8SEnji Cooper # we want no more than 16K/inode to allow test files to copy. 12357718be8SEnji Cooper local fpi=$((fragsz * 4)) 12457718be8SEnji Cooper local i 12557718be8SEnji Cooper if [ $fpi -gt 16384 ]; then 12657718be8SEnji Cooper i="-i 16384" 12757718be8SEnji Cooper fi 12857718be8SEnji Cooper if [ x$swap != x ]; then 12957718be8SEnji Cooper newfs -B ${BYTESWAP} -O${fslevel} -b ${bs} -f ${fragsz} \ 13057718be8SEnji Cooper -s ${osize} ${i} -F ${IMG} 13157718be8SEnji Cooper else 13257718be8SEnji Cooper newfs -O${fslevel} -b ${bs} -f ${fragsz} -s ${osize} ${i} \ 13357718be8SEnji Cooper -F ${IMG} 13457718be8SEnji Cooper fi 13557718be8SEnji Cooper 13657718be8SEnji Cooper # we're specifying relative paths, so rump_ffs warns - ignore. 13757718be8SEnji Cooper atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt 13857718be8SEnji Cooper copy_multiple ${numdata} 13957718be8SEnji Cooper 14057718be8SEnji Cooper if [ ${nsize} -lt ${osize} ]; then 14157718be8SEnji Cooper # how much data to remove so fs can be shrunk 14257718be8SEnji Cooper local remove=$((numdata-numdata*nsize/osize)) 14357718be8SEnji Cooper local dataleft=$((numdata-remove)) 14457718be8SEnji Cooper echo remove is $remove dataleft is $dataleft 14557718be8SEnji Cooper remove_multiple ${remove} 14657718be8SEnji Cooper fi 14757718be8SEnji Cooper 14857718be8SEnji Cooper umount mnt 149*640235e2SEnji Cooper # Check that resize needed 150*640235e2SEnji Cooper atf_check -s exit:0 -o ignore resize_ffs -c -y -s ${nsize} ${IMG} 15157718be8SEnji Cooper atf_check -s exit:0 -o ignore resize_ffs -y -s ${nsize} ${IMG} 15257718be8SEnji Cooper atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG} 15357718be8SEnji Cooper atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt 15457718be8SEnji Cooper if [ ${nsize} -lt ${osize} ]; then 15557718be8SEnji Cooper check_data_range $((remove + 1)) ${numdata} 15657718be8SEnji Cooper else 15757718be8SEnji Cooper # checking everything because we don't delete on grow 15857718be8SEnji Cooper check_data_range 1 ${numdata} 15957718be8SEnji Cooper fi 160*640235e2SEnji Cooper # Check that no resize needed 161*640235e2SEnji Cooper atf_check -s exit:1 -o ignore resize_ffs -c -y -s ${nsize} ${IMG} 16257718be8SEnji Cooper umount mnt 16357718be8SEnji Cooper} 164