1272343Sngie 2272343Sngie# Common settings and functions for the various resize_ffs tests. 3272343Sngie# 4272343Sngie 5272343Sngie# called from atf_init_test_cases 6272343Sngiesetupvars() 7272343Sngie{ 8272343Sngie IMG=fsimage 9272343Sngie TDBASE64=$(atf_get_srcdir)/testdata.tar.gz.base64 10272343Sngie GOODMD5=$(atf_get_srcdir)/testdata.md5 11272343Sngie # set BYTESWAP to opposite-endian. 12272343Sngie if [ $(sysctl -n hw.byteorder) = "1234" ]; then 13272343Sngie BYTESWAP=be 14272343Sngie else 15272343Sngie BYTESWAP=le 16272343Sngie fi 17272343Sngie} 18272343Sngie 19272343Sngie# test_case() taken from the tests/ipf/h_common.sh 20272343Sngie# Used to declare the atf goop for a test. 21272343Sngietest_case() 22272343Sngie{ 23272343Sngie local name="${1}"; shift 24272343Sngie local check_function="${1}"; shift 25272343Sngie 26272343Sngie atf_test_case "${name}" cleanup 27272343Sngie eval "${name}_head() { \ 28272343Sngie atf_set "require.user" "root" ; \ 29272343Sngie atf_set "require.progs" "rump_ffs" ; \ 30272343Sngie }" 31272343Sngie eval "${name}_body() { \ 32272343Sngie ${check_function} " "${@}" "; \ 33272343Sngie }" 34272343Sngie eval "${name}_cleanup() { \ 35272343Sngie umount -f mnt ; \ 36272343Sngie : reset error ; \ 37272343Sngie }" 38272343Sngie} 39272343Sngie 40272343Sngie# Used to declare the atf goop for a test expected to fail. 41272343Sngietest_case_xfail() 42272343Sngie{ 43272343Sngie local name="${1}"; shift 44272343Sngie local reason="${1}"; shift 45272343Sngie local check_function="${1}"; shift 46272343Sngie 47272343Sngie atf_test_case "${name}" cleanup 48272343Sngie eval "${name}_head() { \ 49272343Sngie atf_set "require.user" "root" ; \ 50272343Sngie }" 51272343Sngie eval "${name}_body() { \ 52272343Sngie atf_expect_fail "${reason}" ; \ 53272343Sngie ${check_function} " "${@}" "; \ 54272343Sngie }" 55272343Sngie eval "${name}_cleanup() { \ 56272343Sngie umount -f mnt ; \ 57272343Sngie : reset error ; \ 58272343Sngie }" 59272343Sngie} 60272343Sngie 61272343Sngie# copy_data requires the mount already done; makes one copy of the test data 62272343Sngiecopy_data () 63272343Sngie{ 64272343Sngie uudecode -p ${TDBASE64} | (cd mnt; tar xzf - -s/testdata/TD$1/) 65272343Sngie} 66272343Sngie 67272343Sngiecopy_multiple () 68272343Sngie{ 69272343Sngie local i 70272343Sngie for i in $(seq $1); do 71272343Sngie copy_data $i 72272343Sngie done 73272343Sngie} 74272343Sngie 75272343Sngie# remove_data removes one directory worth of test data; the purpose 76272343Sngie# is to ensure data exists near the end of the fs under test. 77272343Sngieremove_data () 78272343Sngie{ 79272343Sngie rm -rf mnt/TD$1 80272343Sngie} 81272343Sngie 82272343Sngieremove_multiple () 83272343Sngie{ 84272343Sngie local i 85272343Sngie for i in $(seq $1); do 86272343Sngie remove_data $i 87272343Sngie done 88272343Sngie} 89272343Sngie 90272343Sngie# verify that the data in a particular directory is still OK 91272343Sngie# generated md5 file doesn't need explicit cleanup thanks to ATF 92272343Sngiecheck_data () 93272343Sngie{ 94272343Sngie (cd mnt/TD$1 && md5 *) > TD$1.md5 95272343Sngie atf_check diff -u ${GOODMD5} TD$1.md5 96272343Sngie} 97272343Sngie 98272343Sngie# supply begin and end arguments 99272343Sngiecheck_data_range () 100272343Sngie{ 101272343Sngie local i 102272343Sngie for i in $(seq $1 $2); do 103272343Sngie check_data $i 104272343Sngie done 105272343Sngie} 106272343Sngie 107272343Sngie 108272343Sngieresize_ffs() 109272343Sngie{ 110272343Sngie echo "in resize_ffs:" ${@} 111272343Sngie local bs=$1 112272343Sngie local fragsz=$2 113272343Sngie local osize=$3 114272343Sngie local nsize=$4 115272343Sngie local fslevel=$5 116272343Sngie local numdata=$6 117272343Sngie local swap=$7 118272343Sngie mkdir -p mnt 119272343Sngie echo "bs is ${bs} numdata is ${numdata}" 120272343Sngie echo "****resizing fs with blocksize ${bs}" 121272343Sngie 122272343Sngie # we want no more than 16K/inode to allow test files to copy. 123272343Sngie local fpi=$((fragsz * 4)) 124272343Sngie local i 125272343Sngie if [ $fpi -gt 16384 ]; then 126272343Sngie i="-i 16384" 127272343Sngie fi 128272343Sngie if [ x$swap != x ]; then 129272343Sngie newfs -B ${BYTESWAP} -O${fslevel} -b ${bs} -f ${fragsz} \ 130272343Sngie -s ${osize} ${i} -F ${IMG} 131272343Sngie else 132272343Sngie newfs -O${fslevel} -b ${bs} -f ${fragsz} -s ${osize} ${i} \ 133272343Sngie -F ${IMG} 134272343Sngie fi 135272343Sngie 136272343Sngie # we're specifying relative paths, so rump_ffs warns - ignore. 137272343Sngie atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt 138272343Sngie copy_multiple ${numdata} 139272343Sngie 140272343Sngie if [ ${nsize} -lt ${osize} ]; then 141272343Sngie # how much data to remove so fs can be shrunk 142272343Sngie local remove=$((numdata-numdata*nsize/osize)) 143272343Sngie local dataleft=$((numdata-remove)) 144272343Sngie echo remove is $remove dataleft is $dataleft 145272343Sngie remove_multiple ${remove} 146272343Sngie fi 147272343Sngie 148272343Sngie umount mnt 149272343Sngie atf_check -s exit:0 -o ignore resize_ffs -y -s ${nsize} ${IMG} 150272343Sngie atf_check -s exit:0 -o ignore fsck_ffs -f -n -F ${IMG} 151272343Sngie atf_check -s exit:0 -e ignore rump_ffs ${IMG} mnt 152272343Sngie if [ ${nsize} -lt ${osize} ]; then 153272343Sngie check_data_range $((remove + 1)) ${numdata} 154272343Sngie else 155272343Sngie # checking everything because we don't delete on grow 156272343Sngie check_data_range 1 ${numdata} 157272343Sngie fi 158272343Sngie umount mnt 159272343Sngie} 160