#!/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