+test_169() {
+ # do directio so as not to populate the page cache
+ log "creating a 10 Mb file"
+ multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file"
+ log "starting reads"
+ dd if=$DIR/$tfile of=/dev/null bs=4096 &
+ log "truncating the file"
+ multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file"
+ log "killing dd"
+ kill %+ || true # reads might have finished
+ echo "wait until dd is finished"
+ wait
+ log "removing the temporary file"
+ rm -rf $DIR/$tfile || error "tmp file removal failed"
+}
+run_test 169 "parallel read and truncate should not deadlock ==="
+
+test_170() {
+ $LCTL clear # bug 18514
+ $LCTL debug_daemon start $TMP/${tfile}_log_good
+ touch $DIR/$tfile
+ $LCTL debug_daemon stop
+ sed -e "s/^...../a/g" $TMP/${tfile}_log_good > $TMP/${tfile}_log_bad ||
+ error "sed failed to read log_good"
+
+ $LCTL debug_daemon start $TMP/${tfile}_log_good
+ rm -rf $DIR/$tfile
+ $LCTL debug_daemon stop
+
+ $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 ||
+ error "lctl df log_bad failed"
+
+ local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
+ local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
+
+ $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1
+ local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}')
+
+ [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] ||
+ error "bad_line good_line1 good_line2 are empty"
+
+ cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
+ cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt
+ cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt
+
+ $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1
+ local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}')
+ local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}')
+
+ [ "$bad_line_new" ] && [ "$good_line_new" ] ||
+ error "bad_line_new good_line_new are empty"
+
+ local expected_good=$((good_line1 + good_line2*2))
+
+ rm -f $TMP/${tfile}*
+ if [ $bad_line -ne $bad_line_new ]; then
+ error "expected $bad_line bad lines, but got $bad_line_new"
+ return 1
+ fi
+
+ if [ $expected_good -ne $good_line_new ]; then
+ error "expected $expected_good good lines, but got $good_line_new"
+ return 2
+ fi
+ true
+}
+run_test 170 "test lctl df to handle corrupted log ====================="
+