X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=0ad132270e48655a3ca02e750323228046329366;hp=7135751f3416ebd11dd739b2f9eb3a817403da68;hb=6115eb7fd5;hpb=e9b13cd1daf959b40e9ff5c810368c67e9491e06 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 7135751..0ad1322 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -8,12 +8,12 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: LU-9693 LU-6493 LU-9693 -ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c" +# bug number for skipped test: LU-9693 LU-6493 LU-9693 LU-11058 +ALWAYS_EXCEPT="$SANITY_EXCEPT 42a 42b 42c 77k" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! -# skipped tests: LU-8411 LU-9096 LU-9054 LU-10680 .. -ALWAYS_EXCEPT=" 407 253 312 160f 160g $ALWAYS_EXCEPT" +# skipped tests: LU-8411 LU-9096 LU-9054 LU-10734 .. +ALWAYS_EXCEPT=" 407 253 312 160g $ALWAYS_EXCEPT" # Check Grants after these tests GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c" @@ -901,6 +901,19 @@ test_23c() { } run_test 23c "O_APPEND size checks for tiny writes" +# LU-11069 file offset is correct after appending writes +test_23d() { + local file=$DIR/$tfile + local offset + + echo CentaurHauls > $file + offset=$($MULTIOP $file oO_WRONLY:O_APPEND:w13Zp) + if ((offset != 26)); then + error "wrong offset, expected 26, got '$offset'" + fi +} +run_test 23d "file offset is correct after appending writes" + # rename sanity test_24a() { echo '-- same directory rename' @@ -6112,7 +6125,7 @@ test_60a() { log "$TEST60_HEAD - from kernel mode" do_facet mgs "$LCTL set_param debug=warning; $LCTL dk > /dev/null" - do_facet mgs "sh run-llog.sh" || error "run-llog.sh failed" + do_facet mgs "bash run-llog.sh" || error "run-llog.sh failed" do_facet mgs $LCTL dk > $TMP/$tfile # LU-6388: test llog_reader @@ -6211,6 +6224,10 @@ run_test 60aa "llog_print works with FIDs and simple names" test_60ab() { # test llog_print with params + + [[ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.11.51) ]] || + skip "Need server version greater than 2.11.51" + local yaml local orig_val @@ -6947,8 +6964,8 @@ set_checksums() export ORIG_CSUM_TYPE="`lctl get_param -n osc.*osc-[^mM]*.checksum_type | sed 's/.*\[\(.*\)\].*/\1/g' | head -n1`" -CKSUM_TYPES=${CKSUM_TYPES:-"crc32 adler"} -[ "$ORIG_CSUM_TYPE" = "crc32c" ] && CKSUM_TYPES="$CKSUM_TYPES crc32c" +CKSUM_TYPES=${CKSUM_TYPES:-$(lctl get_param -n osc.*osc-[^mM]*.checksum_type | + tr -d [] | head -n1)} set_checksum_type() { lctl set_param -n osc.*osc-[^mM]*.checksum_type $1 @@ -7163,29 +7180,6 @@ test_77g() { # bug 10889 } run_test 77g "checksum error on OST write, read" -test_77j() { # bug 13805 - [ $PARALLEL == "yes" ] && skip "skip parallel run" - $GSS && skip_env "could not run with gss" - - #define OBD_FAIL_OSC_CKSUM_ADLER_ONLY 0x40c - lctl set_param fail_loc=0x40c - remount_client $MOUNT - lctl set_param fail_loc=0 - # wait async osc connect to finish and reflect updated state value - local i - for (( i=0; i < OSTCOUNT; i++ )) ; do - wait_osc_import_state client ost$((i+1)) FULL - done - - for VALUE in $(lctl get_param osc.*osc-[^mM]*.checksum_type); do - PARAM=$(echo ${VALUE[0]} | cut -d "=" -f1) - algo=$(lctl get_param -n $PARAM | sed 's/.*\[\(.*\)\].*/\1/g') - [ "$algo" = "adler" ] || error "algo set to $algo instead of adler" - done - remount_client $MOUNT -} -run_test 77j "client only supporting ADLER32" - test_77k() { # LU-10906 [ $PARALLEL == "yes" ] && skip "skip parallel run" $GSS && skip_env "could not run with gss" @@ -12237,18 +12231,21 @@ test_160e() { run_test 160e "changelog negative testing (should return errors)" test_160f() { - remote_mds_nodsh && skip "remote MDS with nodsh" + remote_mds_nodsh && skip "remote MDS with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.56) ]] || - skip "Need MDS version at least 2.10.56" + { skip "Need MDS version at least 2.10.56"; return 0; } local mdts=$(comma_list $(mdts_nodes)) # Create a user changelog_register || error "first changelog_register failed" changelog_register || error "second changelog_register failed" - local cl_users=(${CL_USERS[$SINGLEMDS]}) - local cl_user1="${cl_users[0]}" - local cl_user2="${cl_users[1]}" + local cl_users + declare -A cl_user1 + declare -A cl_user2 + local user_rec1 + local user_rec2 + local i # generate some changelog records to accumulate on each MDT test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed" @@ -12256,11 +12253,11 @@ test_160f() { error "create $DIR/$tdir/$tfile failed" # check changelogs have been generated - nbcl=$(changelog_dump | wc -l) + local nbcl=$(changelog_dump | wc -l) [[ $nbcl -eq 0 ]] && error "no changelogs found" - # changelog_gc=1 should be set by default for param in "changelog_max_idle_time=10" \ + "changelog_gc=1" \ "changelog_min_gc_interval=2" \ "changelog_min_free_cat_entries=3"; do local MDT0=$(facet_svc $SINGLEMDS) @@ -12271,44 +12268,79 @@ test_160f() { do_nodes $mdts $LCTL set_param mdd.*.$param done + # force cl_user2 to be idle (1st part) + sleep 9 + # simulate changelog catalog almost full #define OBD_FAIL_CAT_FREE_RECORDS 0x1313 do_nodes $mdts $LCTL set_param fail_loc=0x1313 fail_val=3 - sleep 6 - local user_rec1=$(changelog_user_rec $SINGLEMDS $cl_user1) - [ -n "$user_rec1" ] || - error "User $cl_user1 not found in changelog_users" - __changelog_clear $SINGLEMDS $cl_user1 +2 - local user_rec2=$(changelog_user_rec $SINGLEMDS $cl_user1) - [ -n "$user_rec2" ] || - error "User $cl_user1 not found in changelog_users" - echo "verifying user clear: $user_rec1 + 2 == $user_rec2" - [ $((user_rec1 + 2)) == $user_rec2 ] || - error "user index expected $user_rec1 + 2, but is $user_rec2" - sleep 5 + for i in $(seq $MDSCOUNT); do + cl_users=(${CL_USERS[mds$i]}) + cl_user1[mds$i]="${cl_users[0]}" + cl_user2[mds$i]="${cl_users[1]}" + + [ -n "${cl_user1[mds$i]}" ] || + error "mds$i: no user registered" + [ -n "${cl_user2[mds$i]}" ] || + error "mds$i: only ${cl_user2[mds$i]} is registered" + + user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec1" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + __changelog_clear mds$i ${cl_user1[mds$i]} +2 + user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec2" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \ + "$user_rec1 + 2 == $user_rec2" + [ $((user_rec1 + 2)) == $user_rec2 ] || + error "mds$i: user ${cl_user1[mds$i]} index expected " \ + "$user_rec1 + 2, but is $user_rec2" + user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]}) + [ -n "$user_rec2" ] || + error "mds$i: User ${cl_user2[mds$i]} not registered" + [ $user_rec1 == $user_rec2 ] || + error "mds$i: user ${cl_user2[mds$i]} index expected " \ + "$user_rec1, but is $user_rec2" + done + + # force cl_user2 to be idle (2nd part) and to reach + # changelog_max_idle_time + sleep 2 # generate one more changelog to trigger fail_loc - rm -rf $DIR/$tdir || error "rm -rf $tdir failed" + createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/${tfile}bis failed" # ensure gc thread is done - wait_update_facet $SINGLEMDS \ - "ps -e -o comm= | grep chlg_gc_thread" "" 20 - - # check user still registered - changelog_users $SINGLEMDS | grep -q "$cl_user1" || - error "User $cl_user1 not found in changelog_users" - # check user2 unregistered - changelog_users $SINGLEMDS | grep -q "$cl_user2" && - error "User $cl_user2 still found in changelog_users" - - # check changelogs are present and starting at $user_rec2 + 1 - local first_rec=$($LFS changelog $(facet_svc $SINGLEMDS) | - awk '{ print $1; exit; }') + for i in $(mdts_nodes); do + wait_update $i \ + "ps -e -o comm= | grep chlg_gc_thread" "" 20 || + error "$i: GC-thread not done" + done - echo "verifying min purge: $user_rec2 + 1 == $first_rec" - [ $((user_rec2 + 1)) == $first_rec ] || - error "first index should be $user_rec2 + 1, but is $first_rec" + local first_rec + for i in $(seq $MDSCOUNT); do + # check cl_user1 still registered + changelog_users mds$i | grep -q "${cl_user1[mds$i]}" || + error "mds$i: User ${cl_user1[mds$i]} not registered" + # check cl_user2 unregistered + changelog_users mds$i | grep -q "${cl_user2[mds$i]}" && + error "mds$i: User ${cl_user2[mds$i]} still registered" + + # check changelogs are present and starting at $user_rec1 + 1 + user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec1" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + first_rec=$($LFS changelog $(facet_svc mds$i) | + awk '{ print $1; exit; }') + + echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec" + [ $((user_rec1 + 1)) == $first_rec ] || + error "mds$i: first index should be $user_rec1 + 1, " \ + "but is $first_rec" + done } run_test 160f "changelog garbage collect (timestamped users)" @@ -12390,6 +12422,166 @@ test_160g() { run_test 160g "changelog garbage collect (old users)" test_160h() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.10.56) ]] || + { skip "Need MDS version at least 2.10.56"; return 0; } + + local mdts=$(comma_list $(mdts_nodes)) + + # Create a user + changelog_register || error "first changelog_register failed" + changelog_register || error "second changelog_register failed" + local cl_users + declare -A cl_user1 + declare -A cl_user2 + local user_rec1 + local user_rec2 + local i + + # generate some changelog records to accumulate on each MDT + test_mkdir -c $MDSCOUNT $DIR/$tdir || error "test_mkdir $tdir failed" + createmany -m $DIR/$tdir/$tfile $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/$tfile failed" + + # check changelogs have been generated + local nbcl=$(changelog_dump | wc -l) + [[ $nbcl -eq 0 ]] && error "no changelogs found" + + for param in "changelog_max_idle_time=10" \ + "changelog_gc=1" \ + "changelog_min_gc_interval=2"; do + local MDT0=$(facet_svc $SINGLEMDS) + local var="${param%=*}" + local old=$(do_facet mds1 "$LCTL get_param -n mdd.$MDT0.$var") + + stack_trap "do_nodes $mdts $LCTL set_param mdd.*.$var=$old" EXIT + do_nodes $mdts $LCTL set_param mdd.*.$param + done + + # force cl_user2 to be idle (1st part) + sleep 9 + + for i in $(seq $MDSCOUNT); do + cl_users=(${CL_USERS[mds$i]}) + cl_user1[mds$i]="${cl_users[0]}" + cl_user2[mds$i]="${cl_users[1]}" + + [ -n "${cl_user1[mds$i]}" ] || + error "mds$i: no user registered" + [ -n "${cl_user2[mds$i]}" ] || + error "mds$i: only ${cl_user2[mds$i]} is registered" + + user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec1" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + __changelog_clear mds$i ${cl_user1[mds$i]} +2 + user_rec2=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec2" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + echo "mds$i: verifying user ${cl_user1[mds$i]} clear: " \ + "$user_rec1 + 2 == $user_rec2" + [ $((user_rec1 + 2)) == $user_rec2 ] || + error "mds$i: user ${cl_user1[mds$i]} index expected " \ + "$user_rec1 + 2, but is $user_rec2" + user_rec2=$(changelog_user_rec mds$i ${cl_user2[mds$i]}) + [ -n "$user_rec2" ] || + error "mds$i: User ${cl_user2[mds$i]} not registered" + [ $user_rec1 == $user_rec2 ] || + error "mds$i: user ${cl_user2[mds$i]} index expected " \ + "$user_rec1, but is $user_rec2" + done + + # force cl_user2 to be idle (2nd part) and to reach + # changelog_max_idle_time + sleep 2 + + # force each GC-thread start and block then + # one per MDT/MDD, set fail_val accordingly + #define OBD_FAIL_FORCE_GC_THREAD 0x1316 + do_nodes $mdts $LCTL set_param fail_loc=0x1316 + + # generate more changelogs to trigger fail_loc + createmany -m $DIR/$tdir/${tfile}bis $((MDSCOUNT * 2)) || + error "create $DIR/$tdir/${tfile}bis failed" + + # stop MDT to stop GC-thread, should be done in back-ground as it will + # block waiting for the thread to be released and exit + declare -A stop_pids + for i in $(seq $MDSCOUNT); do + stop mds$i & + stop_pids[mds$i]=$! + done + + for i in $(mdts_nodes); do + local facet + local nb=0 + local facets=$(facets_up_on_host $i) + + for facet in ${facets//,/ }; do + if [[ $facet == mds* ]]; then + nb=$((nb + 1)) + fi + done + # ensure each MDS's gc threads are still present and all in "R" + # state (OBD_FAIL_FORCE_GC_THREAD effect!) + [[ $(do_node $i pgrep chlg_gc_thread | wc -l) -eq $nb ]] || + error "$i: expected $nb GC-thread" + wait_update $i \ + "ps -C chlg_gc_thread -o state --no-headers | uniq" \ + "R" 20 || + error "$i: GC-thread not found in R-state" + # check umounts of each MDT on MDS have reached kthread_stop() + [[ $(do_node $i pgrep umount | wc -l) -eq $nb ]] || + error "$i: expected $nb umount" + wait_update $i \ + "ps -C umount -o state --no-headers | uniq" "D" 20 || + error "$i: umount not found in D-state" + done + + # release all GC-threads + do_nodes $mdts $LCTL set_param fail_loc=0 + + # wait for MDT stop to complete + for i in $(seq $MDSCOUNT); do + wait ${stop_pids[mds$i]} || error "mds$i: stop failed" + done + + # XXX + # may try to check if any orphan changelog records are present + # via ldiskfs/zfs and llog_reader... + + # re-start/mount MDTs + for i in $(seq $MDSCOUNT); do + start mds$i $(mdsdevname $i) $MDS_MOUNT_OPTS || + error "Fail to start mds$i" + done + + local first_rec + for i in $(seq $MDSCOUNT); do + # check cl_user1 still registered + changelog_users mds$i | grep -q "${cl_user1[mds$i]}" || + error "mds$i: User ${cl_user1[mds$i]} not registered" + # check cl_user2 unregistered + changelog_users mds$i | grep -q "${cl_user2[mds$i]}" && + error "mds$i: User ${cl_user2[mds$i]} still registered" + + # check changelogs are present and starting at $user_rec1 + 1 + user_rec1=$(changelog_user_rec mds$i ${cl_user1[mds$i]}) + [ -n "$user_rec1" ] || + error "mds$i: User ${cl_user1[mds$i]} not registered" + first_rec=$($LFS changelog $(facet_svc mds$i) | + awk '{ print $1; exit; }') + + echo "mds$i: verifying first index $user_rec1 + 1 == $first_rec" + [ $((user_rec1 + 1)) == $first_rec ] || + error "mds$i: first index should be $user_rec1 + 1, " \ + "but is $first_rec" + done +} +run_test 160h "changelog gc thread stop upon umount, orphan records delete " \ + "during mount" + +test_160i() { local mdts=$(comma_list $(mdts_nodes)) @@ -12447,7 +12639,7 @@ test_160h() { error "changelogs are off on mds$i" done } -run_test 160h "changelog user register/unregister race" +run_test 160i "changelog user register/unregister race" test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -16241,6 +16433,45 @@ test_258b() { } run_test 258b "verify i_mutex security behavior" +test_259() { + local file=$DIR/$tfile + local before + local after + + [ "$(facet_fstype mds1)" != "ldiskfs" ] && + skip "ldiskfs only test" && return + + stack_trap "rm -f $file" EXIT + + wait_delete_completed + before=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree") + echo "before: $before" + + $LFS setstripe -i 0 -c 1 $file + dd if=/dev/zero of=$file bs=1M count=10 || error "couldn't write" + sync_all_data + after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree") + echo "after write: $after" + +#define OBD_FAIL_OSD_FAIL_AT_TRUNCATE 0x2301 + do_facet ost1 $LCTL set_param fail_loc=0x2301 + $TRUNCATE $file 0 + after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree") + echo "after truncate: $after" + + stop ost1 + do_facet ost1 $LCTL set_param fail_loc=0 + start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "cannot start ost1" + sleep 2 + after=$(do_facet ost1 "$LCTL get_param -n osd-*.*OST0000.kbytesfree") + echo "after restart: $after" + [ $((after - before)) -ge $(fs_log_size ost1) ] && + error "missing truncate?" + + return 0 +} +run_test 259 "crash at delayed truncate" + test_260() { #define OBD_FAIL_MDC_CLOSE 0x806 $LCTL set_param fail_loc=0x80000806 @@ -16487,7 +16718,9 @@ test_270f() { error "Can't set directory default striping" # exceed maximum stripe size - $LFS setstripe -E $(($dom_limit * 2)) -L mdt $dom && + $LFS setstripe -E $((dom_limit * 2)) -L mdt $dom || + error "Can't create file with $((dom_limit * 2)) DoM stripe" + [ $($LFS getstripe -S $dom) -eq $((dom_limit * 2)) ] && error "Able to create DoM component size more than LOD limit" do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=0 @@ -16495,6 +16728,19 @@ test_270f() { lod.$mdtname.dom_stripesize) [ 0 -eq ${dom_current} ] || error "Can't set zero DoM stripe limit" + rm $dom + + # attempt to create DoM file on server with disabled DoM should + # remove DoM entry from layout and be succeed + $LFS setstripe -E $dom_limit -L mdt -E -1 $dom || + error "Can't create DoM file (DoM is disabled)" + [ $($LFS getstripe -L $dom) == "mdt" ] && + error "File has DoM component while DoM is disabled" + rm $dom + + # attempt to create DoM file with only DoM stripe should return error + $LFS setstripe -E $dom_limit -L mdt $dom && + error "Able to create DoM-only file while DoM is disabled" # too low values to be aligned with smallest stripe size 64K do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=30000 @@ -16503,6 +16749,10 @@ test_270f() { [ 30000 -eq ${dom_current} ] && error "Can set too small DoM stripe limit" + # 64K is a minimal stripe size in Lustre, expect limit of that size + [ 65536 -eq ${dom_current} ] || + error "Limit is not set to 64K but ${dom_current}" + do_facet mds1 $LCTL set_param -n lod.$mdtname.dom_stripesize=2147483648 dom_current=$(do_facet mds1 $LCTL get_param -n \ lod.$mdtname.dom_stripesize) @@ -16516,7 +16766,9 @@ test_270f() { error "Can't create DoM component size after limit change" do_facet mds1 $LCTL set_param -n \ lod.$mdtname.dom_stripesize=$((dom_limit / 2)) - $LFS setstripe -E $dom_limit -L mdt ${dom}_big && + $LFS setstripe -E $dom_limit -L mdt ${dom}_big || + error "Can't create DoM file after limit decrease" + [ $($LFS getstripe -S ${dom}_big) -eq $((dom_limit / 2)) ] || error "Can create big DoM component after limit decrease" touch ${dom}_def || error "Can't create file with old default layout" @@ -17668,6 +17920,73 @@ test_316() { } run_test 316 "lfs mv" +test_317() { + local trunc_sz + local grant_blk_size + + if [ "$(facet_fstype $facet)" == "zfs" ]; then + skip "LU-10370: no implementation for ZFS" && return + fi + + stack_trap "rm -f $DIR/$tfile" EXIT + grant_blk_size=$($LCTL get_param osc.$FSNAME*.import | + awk '/grant_block_size:/ { print $2; exit; }') + # + # Create File of size 5M. Truncate it to below size's and verify + # blocks count. + # + dd if=/dev/zero of=$DIR/$tfile bs=5M count=1 conv=fsync || + error "Create file : $DIR/$tfile" + + for trunc_sz in 2097152 4097 4000 509 0; do + $TRUNCATE $DIR/$tfile $trunc_sz || + error "truncate $tfile to $trunc_sz failed" + local sz=$(stat --format=%s $DIR/$tfile) + local blk=$(stat --format=%b $DIR/$tfile) + local trunc_blk=$((((trunc_sz + (grant_blk_size - 1) ) / + grant_blk_size) * 8)) + + if [[ $blk -ne $trunc_blk ]]; then + $(which stat) $DIR/$tfile + error "Expected Block $trunc_blk got $blk for $tfile" + fi + + $CHECKSTAT -s $trunc_sz $DIR/$tfile || + error "Expected Size $trunc_sz got $sz for $tfile" + done + + # + # sparse file test + # Create file with a hole and write actual two blocks. Block count + # must be 16. + # + dd if=/dev/zero of=$DIR/$tfile bs=$grant_blk_size count=2 seek=5 \ + conv=fsync || error "Create file : $DIR/$tfile" + + # Calculate the final truncate size. + trunc_sz=$(($(stat --format=%s $DIR/$tfile) - (grant_blk_size + 1))) + + # + # truncate to size $trunc_sz bytes. Strip the last block + # The block count must drop to 8 + # + $TRUNCATE $DIR/$tfile $trunc_sz || + error "truncate $tfile to $trunc_sz failed" + + local trunc_bsz=$((grant_blk_size / $(stat --format=%B $DIR/$tfile))) + sz=$(stat --format=%s $DIR/$tfile) + blk=$(stat --format=%b $DIR/$tfile) + + if [[ $blk -ne $trunc_bsz ]]; then + $(which stat) $DIR/$tfile + error "Expected Block $trunc_bsz got $blk for $tfile" + fi + + $CHECKSTAT -s $trunc_sz $DIR/$tfile || + error "Expected Size $trunc_sz got $sz for $tfile" +} +run_test 317 "Verify blocks get correctly update after truncate" + test_fake_rw() { local read_write=$1 if [ "$read_write" = "write" ]; then