| #!/bin/bash | |
| TS_TOPDIR="${0%/*}/../.." | |
| TS_DESC="count file contents in core" | |
| . $TS_TOPDIR/functions.sh | |
| ts_init "$*" | |
| ts_check_test_command "$TS_HELPER_SYSINFO" | |
| # Send patch if you know how to keep it portable and robust. Thanks. | |
| TS_KNOWN_FAIL="yes" | |
| function header | |
| { | |
| echo "[" "$1" "]" | |
| } | |
| function footer | |
| { | |
| echo "return value: $1" | |
| } | |
| function make_input_name | |
| { | |
| header=$1 | |
| prefix=i_ | |
| echo ${prefix}$(sed -e "s/[^-+a-zA-Z0-9_]/_/g"<<<"$header") | |
| } | |
| function _dd | |
| { | |
| local msg | |
| local ret=0 | |
| msg=$(dd "$@" 2>&1) | |
| ret=$? | |
| if [ $ret != 0 ]; then | |
| echo "failed: dd $@" >&2 | |
| echo "$msg" >&2 | |
| fi | |
| return $ret | |
| } | |
| function check_dd_fs_feat | |
| { | |
| local testf="$TS_OUTDIR/ddtest" | |
| rm -f "$testf" | |
| touch "$testf" | |
| # NFS seems to fail for direct AND append | |
| _dd if=/dev/zero of="$testf" bs=1k count=2 oflag=direct,append &>/dev/null \ | |
| || ts_skip "unsupported: dd oflag=direct,append" | |
| # TODO: Should we check for sparse file support? | |
| rm -f "$testf" | |
| } | |
| function run_dd_test | |
| { | |
| header=$1 | |
| bs=$2 | |
| flags=$3 | |
| input=$(make_input_name "$header") | |
| INPUT="${INPUT} ${input}" | |
| rm -f "$input" | |
| if [ "$bs" = 0 ]; then | |
| touch $input | |
| else | |
| _dd if=/dev/zero of=$input count=1 bs=$bs $flags || return | |
| fi | |
| $TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input | |
| footer "$?" | |
| } | |
| function run_dd_dd_test | |
| { | |
| header=$1 | |
| flags0=$2 | |
| flags1=$3 | |
| bs=$PAGE_SIZE | |
| input=$(make_input_name "$header") | |
| INPUT="${INPUT} ${input}" | |
| rm -f "$input" | |
| _dd if=/dev/zero of=$input count=1 bs=$bs $flags0 || return | |
| _dd if=/dev/zero of=$input count=1 bs=$bs $flags1 || return | |
| $TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input | |
| footer "$?" | |
| } | |
| PAGE_SIZE=$($TS_HELPER_SYSINFO pagesize) | |
| WINDOW_SIZE=$(( 32 * 1024 * PAGE_SIZE )) | |
| # we use PAGE_SIZE dependent output for a few systems | |
| if test -f "$TS_EXPECTED.$PAGE_SIZE"; then | |
| TS_EXPECTED+=".$PAGE_SIZE" | |
| OUT_COLUMNS="PAGES,SIZE,FILE" | |
| else | |
| TS_EXPECTED+=".nosize" | |
| OUT_COLUMNS="PAGES,FILE" | |
| fi | |
| ts_check_test_command "$TS_CMD_FINCORE" | |
| ts_cd "$TS_OUTDIR" | |
| check_dd_fs_feat | |
| INPUT= | |
| input= | |
| { | |
| input=no_such_file | |
| INPUT="${INPUT} ${input}" | |
| header "NO EXCITING FILE" | |
| $TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input | |
| footer "$?" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "EMPTY FILE" 0 | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "PAGESIZE -1 (incore)" $(( PAGE_SIZE - 1 )) | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "JUST PAGESIZE(incore)" $(( PAGE_SIZE )) | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "JUST PAGESIZE(directio)" $(( PAGE_SIZE )) "oflag=direct" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "TWO PAGES(incore)" $(( 2 * PAGE_SIZE )) | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_test "TWO PAGES(directio)" $(( 2 * PAGE_SIZE )) "oflag=direct" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_dd_test "TWO PAGES(mixed directio/incore)" \ | |
| oflag=direct \ | |
| "oflag=append seek=1" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| run_dd_dd_test "TWO PAGES(mixed incore/directio)" \ | |
| "" \ | |
| "oflag=direct,append seek=1" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 )) | |
| run_dd_dd_test "WINDOW SIZE(incore-sparse-incore)" \ | |
| "" \ | |
| "oflag=append seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 )) | |
| run_dd_dd_test "WINDOW SIZE(directio-sparse-directio)" \ | |
| "oflag=direct" \ | |
| "oflag=append,direct seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 )) | |
| run_dd_dd_test "WINDOW SIZE(incore-sparse-directio)" \ | |
| "" \ | |
| "oflag=append,direct seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 )) | |
| run_dd_dd_test "WINDOW SIZE(directio-sparse-incore)" \ | |
| "oflag=direct" \ | |
| "oflag=append seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 )) | |
| run_dd_dd_test "WINDOW SIZE + 1 page(incore-sparse-incore)" \ | |
| "" \ | |
| "oflag=append seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 )) | |
| run_dd_dd_test "WINDOW SIZE + 1 page(directio-sparse-directio)" \ | |
| "oflag=direct" \ | |
| "oflag=append,direct seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 )) | |
| run_dd_dd_test "WINDOW SIZE + 1 page(incore-sparse-directio)" \ | |
| "" \ | |
| "oflag=append,direct seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 )) | |
| run_dd_dd_test "WINDOW SIZE + 1 page(directio-sparse-incore)" \ | |
| "oflag=direct" \ | |
| "oflag=append seek=$hole_count" | |
| } >> $TS_OUTPUT 2>&1 | |
| { | |
| header "MULTIPLE FILES" | |
| $TS_CMD_FINCORE --output $OUT_COLUMNS --bytes $INPUT | |
| footer "$?" | |
| } >> $TS_OUTPUT 2>&1 | |
| rm -f $INPUT | |
| ts_finalize |