[Ocfs2-test-devel] [PATCH] ocfs2-test: Add testing cases for online filecheck
Eric Ren
zren at suse.com
Mon Mar 28 00:57:04 PDT 2016
This include skeleton for testing online filecheck,
and testing cases for inode block which has been merged
into kernel mainline.
Signed-off-by: Eric Ren <zren at suse.com>
---
programs/Makefile | 3 +-
programs/online_filecheck/Makefile | 9 +
programs/online_filecheck/filecheck_test_run.sh | 187 +++++++++++
programs/online_filecheck/filecheck_utils.sh | 53 +++
programs/online_filecheck/inode_block_test.sh | 407 ++++++++++++++++++++++++
programs/python_common/single_run-WIP.sh | 27 +-
6 files changed, 684 insertions(+), 2 deletions(-)
create mode 100644 programs/online_filecheck/Makefile
create mode 100755 programs/online_filecheck/filecheck_test_run.sh
create mode 100755 programs/online_filecheck/filecheck_utils.sh
create mode 100755 programs/online_filecheck/inode_block_test.sh
diff --git a/programs/Makefile b/programs/Makefile
index 04313f9..b562995 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -59,7 +59,8 @@ SUBDIRS = \
reflink_tests \
directio_test \
discontig_bg_test \
- verify_readonly
+ verify_readonly \
+ online_filecheck
ifdef OCFS2_TEST_DX_DIRS
SUBDIRS += dx_dirs_tests
diff --git a/programs/online_filecheck/Makefile b/programs/online_filecheck/Makefile
new file mode 100644
index 0000000..b16a473
--- /dev/null
+++ b/programs/online_filecheck/Makefile
@@ -0,0 +1,9 @@
+TOPDIR = ../..
+
+include $(TOPDIR)/Preamble.make
+
+DIST_FILES = filecheck_test_run.sh inode_block_test.sh filecheck_utils.sh
+
+BIN_EXTRA = filecheck_test_run.sh inode_block_test.sh filecheck_utils.sh
+
+include $(TOPDIR)/Postamble.make
diff --git a/programs/online_filecheck/filecheck_test_run.sh b/programs/online_filecheck/filecheck_test_run.sh
new file mode 100755
index 0000000..a66d798
--- /dev/null
+++ b/programs/online_filecheck/filecheck_test_run.sh
@@ -0,0 +1,187 @@
+#!/bin/bash
+#
+# filecheck_run.sh
+#
+# descritpion: This script will perform a thorough single node test on online
+# filecheck for OCFS2. Following testcases will be involed.
+#
+# 1. inode block: inode number, inode generation, block ECC
+#
+# Author: Eric Ren, zren at suse.com
+# History: 22 Mar, 2016
+#
+# Copyright (C) 2016 SUSE. All rights reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation, version 2.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+################################################################################
+# Global Variables
+################################################################################
+if [ -f `dirname ${0}`/o2tf.sh ]; then
+ . `dirname ${0}`/o2tf.sh
+fi
+
+USERNAME="`id -un`"
+GROUPNAME="`id -gn`"
+
+SUDO="`which sudo` -u root"
+MKFS_BIN="`which sudo` -u root `which mkfs.ocfs2`"
+MOUNT_BIN="`which sudo` -u root `which mount.ocfs2`"
+UMOUNT_BIN="`which sudo` -u root `which umount`"
+
+LABELNAME=ocfs2-filecheck-tests
+OCFS2_DEVICE=
+MOUNT_POINT=
+MOUNT_OPTS="errors=continue"
+FEATURES="local,metaecc"
+BLOCKSIZE=4096
+CLUSTERSIZE=32768
+WORKSPACE=
+
+DEFAULT_LOG="filecheck-test-logs"
+LOG_OUT_DIR=
+DETAIL_LOG_FILE=
+
+TEST_NO=0
+TEST_PASS=0
+
+set -o pipefail
+
+################################################################################
+# Utility Functions
+################################################################################
+
+f_usage()
+{
+ echo "usage: `basename ${0}` [-o output log dir] <-d <device>> <mountpoint>"
+ echo " -o output directory for logs."
+ echo " -d specify the device to be formated as an ocfs2 volume."
+ echo " <mountpoint> path of mount point where the ocfs2 volume will be mounted on."
+}
+
+f_getoptions()
+{
+ if [ $# -eq 0 ];then
+ f_usage
+ exit 1
+ fi
+
+ while getopts "o:d:" options; do
+ case $options in
+ o ) LOG_OUT_DIR="$OPTARG";;
+ d ) OCFS2_DEVICE="$OPTARG";;
+ * ) f_usage
+ exit 1;;
+ esac
+ done
+ shift $(($OPTIND - 1))
+ MOUNT_POINT=${1}
+}
+
+f_setup()
+{
+ f_getoptions $*
+
+ if [ -z "${MOUNT_POINT}" -o ! -d ${MOUNT_POINT} ];then
+ echo "Mount point ${MOUNT_POINT} does not exist."
+ f_usage
+ fi
+
+ LOG_OUT_DIR="${LOG_OUT_DIR:-$DEFAULT_LOG}/filecheck"
+ mkdir -p ${LOG_OUT_DIR} || exit 1
+
+ LOG_SURFIX=$(date +%Y%m%d-%H%M%S)
+ DETAIL_LOG_FILE="${LOG_OUT_DIR}/filecheck_test-${LOG_SURFIX}.log"
+ RUN_LOG_FILE="$LOG_OUT_DIR/run-filecheck-${LOG_SURFIX}.log"
+
+ WORKSPACE="${MOUNT_POINT}/filecheck_test_place"
+}
+
+f_do_mkfs_and_mount()
+{
+ echo -n "Mkfsing device:" | tee -a ${DETAIL_LOG_FILE}
+
+ echo y | ${MKFS_BIN} --fs-features=${FEATURES} --label ${LABELNAME} -b ${BLOCKSIZE} -C ${CLUSTERSIZE} ${OCFS2_DEVICE} >> ${DETAIL_LOG_FILE} 2>&1
+ RET=$?
+ f_echo_status ${RET} | tee -a ${DETAIL_LOG_FILE}
+ f_exit_or_not ${RET}
+
+ echo -n "Mounting device to ${MOUNT_POINT}:" | tee -a ${DETAIL_LOG_FILE}
+ ${MOUNT_BIN} -t ocfs2 -o ${MOUNT_OPTS} ${OCFS2_DEVICE} ${MOUNT_POINT} >> ${DETAIL_LOG_FILE} 2>&1
+ RET=$?
+ f_echo_status ${RET} | tee -a ${DETAIL_LOG_FILE}
+ f_exit_or_not ${RET}
+
+ ${SUDO} chown -R ${USERNAME}:${GROUPNAME} ${MOUNT_POINT}
+ ${SUDO} chmod -R 777 ${MOUNT_POINT}
+
+ mkdir -p ${WORKSPACE} || exit 1
+}
+
+f_do_umount()
+{
+ echo -n "Umounting device to ${MOUNT_POINT}:" | tee -a ${DETAIL_LOG_FILE}
+
+ rm -rf ${WORKSPACE} || exit 1
+
+ ${UMOUNT_BIN} ${MOUNT_POINT} >> ${DETAIL_LOG_FILE} 2>&1
+ RET=$?
+ f_echo_status ${RET} | tee -a ${DETAIL_LOG_FILE}
+ f_exit_or_not ${RET}
+}
+
+f_runtest()
+{
+ # put testing units here
+ f_do_mkfs_and_mount
+
+ ((TEST_NO++))
+ echo -ne "[${TEST_NO}] Inode block corrupt & check & fix:" | tee -a ${RUN_LOG_FILE}
+ ./inode_block_test.sh -d ${OCFS2_DEVICE} -m ${MOUNT_POINT} -l ${LOG_OUT_DIR}
+ RET=$?
+ f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+ f_exit_or_not ${RET}
+ ((TEST_PASS++))
+
+ f_do_umount
+}
+
+function f_cleanup()
+{
+ :
+}
+
+################################################################################
+# Main Entry
+################################################################################
+
+#redefine the int signal hander
+trap 'echo -ne "\n\n">>${RUN_LOG_FILE}; echo "Interrupted by Ctrl+C,Cleanuping \
+... "|tee -a ${RUN_LOG_FILE}; f_cleanup; exit 1' SIGINT
+
+f_setup $*
+
+START_TIME=${SECONDS}
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Filecheck tests start: `date`\
+=====================\n"
+f_LogMsg ${DETAIL_LOG_FILE} "=====================Filecheck tests start: `date`\
+====================="
+
+f_runtest
+
+END_TIME=${SECONDS}
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Filecheck tests end: `date`\
+=====================\n"
+f_LogMsg ${DETAIL_LOG_FILE} "=====================Filecheck tests end: `date`\
+====================="
+
+f_LogRunMsg ${RUN_LOG_FILE} "Time elapsed(s): $((${END_TIME}-${START_TIME}))\n"
+f_LogRunMsg ${RUN_LOG_FILE} "Tests total: ${TEST_NO}\n"
+f_LogRunMsg ${RUN_LOG_FILE} "Tests passed: ${TEST_PASS}\n"
diff --git a/programs/online_filecheck/filecheck_utils.sh b/programs/online_filecheck/filecheck_utils.sh
new file mode 100755
index 0000000..c63f770
--- /dev/null
+++ b/programs/online_filecheck/filecheck_utils.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+PATH=$PATH:/usr/sbin/
+
+DEBUGFS_BIN="`which sudo` -u root `which debugfs.ocfs2`"
+FSWRECK_BIN="`which sudo` -u root `dirname ${0}`/fswreck"
+SUDO_BASH="`which sudo` -u root bash -c"
+SUDO_CAT="`which sudo` -u root `which cat`"
+
+f_check_file()
+{
+ local inode=$1
+ local check_file=$2
+ local error_type=$3
+ local log_file=$4
+
+ echo -e "${SUDO_BASH} \"echo ${inode} > ${check_file}\"" >> ${log_file} 2>&1
+ ${SUDO_BASH} "echo ${inode} > ${check_file}"
+ sleep 0.1
+ ${SUDO_CAT} ${check_file} > .tmp 2>&1
+ cat .tmp | head -n 1 >> ${log_file} 2>&1
+ LINE=`cat .tmp | tail -n 1`
+ rm -f -- .tmp
+ echo -e "${LINE}" >> ${log_file}
+ local ERROR=`echo ${LINE} | awk '{print $3}'`
+ f_LogMsg ${log_file} "Error type: ${ERROR}"
+ if [ ${ERROR} != "${error_type}" ];then
+ f_LogMsg ${log_file} "Unexpected error type, exit..."
+ false
+ fi
+}
+
+f_fix_file()
+{
+ local inode=$1
+ local fix_file=$2
+ local log_file=$3
+
+ echo -e "${SUDO_BASH} \"echo ${inode} > ${fix_file}\"" >> ${log_file} 2>&1
+ ${SUDO_BASH} "echo ${inode} > ${fix_file}"
+ sleep 0.1
+ ${SUDO_CAT} ${fix_file} > .tmp 2>&1
+ cat .tmp | head -n 1 >> ${log_file} 2>&1
+ LINE=`cat .tmp | tail -n 1`
+ rm -f -- .tmp
+ echo -e "${LINE}" >> ${log_file}
+ local RESULT=`echo ${LINE} | awk '{print $3}'`
+ f_LogMsg ${log_file} "Fix result: ${RESULT}"
+ if [ ${RESULT} != "SUCCESS" ];then
+ f_LogMsg ${log_file} "Failed to fix! Exit..."
+ false
+ fi
+}
diff --git a/programs/online_filecheck/inode_block_test.sh b/programs/online_filecheck/inode_block_test.sh
new file mode 100755
index 0000000..3f39fa1
--- /dev/null
+++ b/programs/online_filecheck/inode_block_test.sh
@@ -0,0 +1,407 @@
+#!/bin/bash
+
+################################################################################
+# Global Variables
+################################################################################
+if [ -f `dirname ${0}`/o2tf.sh ]; then
+ . `dirname ${0}`/o2tf.sh
+fi
+
+if [ -f `dirname ${0}`/filecheck_utils.sh ]; then
+ . `dirname ${0}`/filecheck_utils.sh
+fi
+
+PATH=$PATH:/usr/sbin/
+
+FSWRECK_BIN="`dirname ${0}`/fswreck"
+DEBUGFS_BIN="`which debugfs.ocfs2`"
+SUDO_DEBUGFS="`which sudo` -u root `which debugfs.ocfs2`"
+SUDO_FSWRECK="`which sudo` -u root `dirname ${0}`/fswreck"
+SUDO_BASH="`which sudo` -u root bash -c"
+SUDO_CAT="`which sudo` -u root `which cat`"
+
+DEVICE=
+MOUNT_POINT=
+MOUNT_OPTS="errors=continue"
+FEATURES="local,metaecc"
+
+LOG_DIR=
+DETAIL_LOG_FILE=
+
+SYSDIR_OCFS2=/sys/fs/ocfs2
+SYSDIR_DEVICE=
+CHECK_FILE=
+FIX_FILE=
+SET_CACHE=
+CACHE_MIN=10
+CACHE_MAX=100
+
+TEST_NO=0
+TEST_PASS=0
+
+set -o pipefail
+
+################################################################################
+# Utility Functions
+################################################################################
+function f_usage()
+{
+ echo "usage: `basename ${0}` <-d device> <-m mountpoint> <-l log-dir>"
+}
+
+function f_getoptions()
+{
+ if [ $# -eq 0 ]; then
+ f_usage;
+ exit 1
+ fi
+
+ while getopts "d:m:l:h" options; do
+ case $options in
+ d ) DEVICE="$OPTARG";;
+ m ) MOUNT_POINT="$OPTARG";;
+ l ) LOG_DIR="$OPTARG";;
+ h ) f_usage;;
+ * ) f_usage;;
+ esac
+ done
+}
+
+function f_setup()
+{
+ f_getoptions $*
+
+ if [ ! -x ${FSWRECK_BIN} ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Fswreck tool must be provided to proceed testing..."
+ exit 1
+ fi
+
+ if [ ! -x ${DEBUGFS_BIN} ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Debugfs.ocfs2 tool must be provided to proceed testing..."
+ exit 1
+ fi
+
+ LOG_SURFIX="`date +%Y-%m-%d_%H-%M-%S`"
+ DETAIL_LOG_FILE="${LOG_DIR}/inode_block_test-${LOG_SURFIX}.log"
+
+ SYSDIR_DEVICE="${SYSDIR_OCFS2}/`basename ${DEVICE}`"
+ CHECK_FILE="${SYSDIR_DEVICE}/filecheck/check"
+ FIX_FILE="${SYSDIR_DEVICE}/filecheck/fix"
+ SET_CACHE="${SYSDIR_DEVICE}/filecheck/set"
+}
+
+function f_cleanup()
+{
+ :
+}
+
+
+################################################################################
+# Core Function
+################################################################################
+function f_runtest()
+{
+ local ERR_TYPE_ARRY="inode_gen inode_ecc inode_block_num cache_size"
+
+ for type in ${ERR_TYPE_ARRY}; do
+ ((TEST_NO++))
+
+ case "${type}" in
+ inode_gen )
+ f_inode_gen_check;;
+ inode_ecc )
+ f_inode_ecc;;
+ inode_block_num )
+ f_inode_block_num;;
+ cache_size )
+ f_cache_size;;
+ * ) echo -e "Unknown testing unit: ${type}" >> ${DETAIL_LOG_FILE}
+ false
+ esac
+
+ if [ $? -eq 0 ];then
+ ((TEST_PASS++))
+ fi
+ done
+}
+
+function f_inode_gen_check()
+{
+ echo -e "\n[${TEST_NO}] Inode generation number:" >> ${DETAIL_LOG_FILE}
+
+ #fswreck
+ echo -e "\n[*] Corrupt inode generation number:" >> ${DETAIL_LOG_FILE}
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_FSWRECK} -c INODE_GEN ${DEVICE}"
+ ${SUDO_FSWRECK} -c INODE_GEN ${DEVICE} > .tmp 2>&1
+ f_exit_or_not $?
+ cat .tmp >> ${DETAIL_LOG_FILE} 2>&1
+
+ local LINE=`cat .tmp | tail -n 1`
+ echo -e "Got the last line: ${LINE}" >> ${DETAIL_LOG_FILE}
+ rm -f -- .tmp
+
+ local TMP=${LINE#*#}
+ local INO=${TMP%,*}
+ f_LogMsg ${DETAIL_LOG_FILE} "Got inode number: ${INO}"
+ local GOOD_GEN=`echo ${LINE}|awk '{print $7}'`
+ f_LogMsg ${DETAIL_LOG_FILE} "Got good generation number: ${GOOD_GEN}"
+
+ #check
+ echo -e "\n[*] Check inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_check_file ${INO} ${CHECK_FILE} "GENERATION" ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: FAILED"
+ fi
+
+ #fix
+ echo -e "\n[*] Fix inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_fix_file ${INO} ${FIX_FILE} ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: FAILED"
+ fi
+
+ #verify
+ echo -e "\n[*] Verify:" >> ${DETAIL_LOG_FILE} 2>&1
+ f_verify_inode_gen ${INO} ${GOOD_GEN} ${DEVICE} >> ${DETAIL_LOG_FILE} 2>&1
+
+ if [ $? -ne 0 ]; then
+ echo "Fail: fix inode#${INO} generation." >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+ echo -e "Verify: PASSED" >> ${DETAIL_LOG_FILE} 2>&1
+}
+
+function f_inode_ecc()
+{
+ echo -e "\n[${TEST_NO}] Inode ecc:" >> ${DETAIL_LOG_FILE}
+
+ #fswreck
+ echo -e "\n[*] Corrupt inode block ecc:" >> ${DETAIL_LOG_FILE}
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_FSWRECK} -c INODE_BLOCK_ECC ${DEVICE}"
+ ${SUDO_FSWRECK} -c INODE_BLOCK_ECC ${DEVICE} > .tmp 2>&1
+ RET=$?
+ f_exit_or_not ${RET}
+ cat .tmp >> ${DETAIL_LOG_FILE} 2>&1
+
+ local LINE=`cat .tmp | tail -n 1`
+ rm -f -- .tmp
+ local TMP=${LINE#*#}
+ local INO=${TMP%,*}
+ local BAD_CRC32=0x1234
+ local BAD_ECC=0x1234
+
+ #check
+ echo -e "\n[*] Check inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_check_file ${INO} ${CHECK_FILE} "BLOCKECC" ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: FAILED"
+ fi
+
+ #fix
+ echo -e "\n[*] Fix inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_fix_file ${INO} ${FIX_FILE} ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: FAILED"
+ fi
+
+ #verify
+ echo -e "\n[*] Verify:" >> ${DETAIL_LOG_FILE} 2>&1
+ f_verify_inode_meta_ecc ${INO} ${BAD_CRC32} ${BAD_ECC} ${DEVICE} >> ${DETAIL_LOG_FILE} 2>&1
+ if [ $? -ne 0 ]; then
+ echo "Fail: fix inode#${INO} meta ecc." >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+ echo -e "Verify: PASSED" >> ${DETAIL_LOG_FILE} 2>&1
+}
+
+function f_inode_block_num()
+{
+ echo -e "\n[${TEST_NO}] Inode block number:" >> ${DETAIL_LOG_FILE}
+
+ #fswreck
+ echo -e "\n[*] Corrupt inode block number:" >> ${DETAIL_LOG_FILE}
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_FSWRECK} -c INODE_BLKNO ${DEVICE}"
+ ${SUDO_FSWRECK} -c INODE_BLKNO ${DEVICE} > .tmp 2>&1
+ RET=$?
+ f_exit_or_not ${RET}
+ cat .tmp >> ${DETAIL_LOG_FILE} 2>&1
+
+ local LINE=`cat .tmp | tail -n 1`
+ rm -f -- .tmp
+ local TMP=${LINE#*#}
+ local INO=${TMP%,*}
+ local GOOD_BLOCKNUM=`echo ${LINE}|awk '{print $7}'`
+
+ #check
+ echo -e "\n[*] Check inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_check_file ${INO} ${CHECK_FILE} "BLOCKNO" ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Check: FAILED"
+ fi
+
+ #fix
+ echo -e "\n[*] Fix inode#${INO}:" >> ${DETAIL_LOG_FILE}
+ f_fix_file ${INO} ${FIX_FILE} ${DETAIL_LOG_FILE}
+ if [ $? -eq 0 ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: PASSED"
+ else
+ f_LogMsg ${DETAIL_LOG_FILE} "Fix: FAILED"
+ fi
+
+ #verify
+ echo -e "\n[*] Verify:" >> ${DETAIL_LOG_FILE} 2>&1
+ f_verify_inode_block_num ${INO} ${GOOD_BLOCKNUM} ${DEVICE} >> ${DETAIL_LOG_FILE} 2>&1
+ if [ $? -ne 0 ]; then
+ echo "Fail: fix inode#${INO}'s block number." >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+ echo -e "Verify: PASSED" >> ${DETAIL_LOG_FILE} 2>&1
+}
+
+#cache size to save check records
+function f_cache_size()
+{
+ echo -e "\n[${TEST_NO}] Cache size setting:" >> ${DETAIL_LOG_FILE}
+
+ #see if case size is valid
+ local SIZE=`${SUDO_BASH} "cat ${SET_CACHE}"`
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_BASH} \"cat ${SET_CACHE}\""
+ f_LogMsg ${DETAIL_LOG_FILE} "Cache size: ${SIZE}"
+ if [ ${SIZE} -gt ${CACHE_MAX} -o ${SIZE} -lt ${CACHE_MIN} ];then
+ f_LogMsg ${DETAIL_LOG_FILE} "Cache size should be in [${CACHE_MIN}, ${CACHE_MAX}]."
+ return 1
+ fi
+
+ #positive test case
+ echo -e "\nPositive testing:" >> ${DETAIL_LOG_FILE}
+ for size in ${CACHE_MIN} ${CACHE_MAX}; do
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_BASH} \"echo ${size} > ${SET_CACHE}\""
+ ${SUDO_BASH} "echo ${size} > ${SET_CACHE}" >> ${DETAIL_LOG_FILE} 2>&1
+ if [ $? -ne 0 ]; then
+ f_LogMsg ${DETAIL_LOG_FILE} "Faild to set case size to $size"
+ return 1
+ fi
+ done
+ echo -e "PASSED" >> ${DETAIL_LOG_FILE}
+
+ #negative test case
+ echo -e "\nNegative testing:" >> ${DETAIL_LOG_FILE}
+ for size in ${CACHE_MIN}-1 ${CACHE_MAX}+1; do
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_BASH} \"echo ${size} > ${SET_CACHE}\""
+ ${SUDO_BASH} "echo ${size} > ${SET_CACHE}" >> ${DETAIL_LOG_FILE} 2>&1
+ if [ $? -eq 0 ]; then
+ f_LogMsg ${DETAIL_LOG_FILE} "We should *NOT* set case size to $size successfully."
+ return 1
+ fi
+ done
+ echo -e "PASSED" >> ${DETAIL_LOG_FILE}
+}
+
+f_verify_inode_gen()
+{
+ local -i inode=$1
+ local -i gen=$2
+ DEVICE=$3
+
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_DEBUGFS} -R \"stat <${inode}>\" ${DEVICE}|grep \"FS Generation:\""
+ fix_result=`${SUDO_DEBUGFS} -R "stat <${inode}>" ${DEVICE}|grep "FS Generation:"`
+ f_LogMsg ${DETAIL_LOG_FILE} "echo ${fix_result} | awk '{print \$3}'"
+ fix_gen=`echo ${fix_result} | awk '{print $3}'`
+ if [ -z $fix_gen ];then
+ echo -e "Failed to get FS generation number using debugfs.ocfs2" >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+
+ echo -e "fs generation=$fix_gen, wanted=$gen" >> ${DETAIL_LOG_FILE} 2>&1
+ if [ $fix_gen -ne $gen ];then
+ echo -e "Verify: failed to fix." >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+}
+
+f_verify_inode_block_num()
+{
+ local -i inode=$1
+ local -i block_num=$2
+ DEVICE=$3
+
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_DEBUGFS} -R \"stat <${inode}>\" ${DEVICE}|grep \"Inode:\""
+ fix_result=`${SUDO_DEBUGFS} -R "stat <${inode}>" ${DEVICE}|grep "Inode:"`
+ f_LogMsg ${DETAIL_LOG_FILE} "echo ${fix_result} | awk '{print \$2}'"
+ fix_block_num=`echo ${fix_result} | awk '{print $2}'`
+ if [ -z $fix_block_num ];then
+ echo -e "Failed to get inode block number using debugfs.ocfs2" >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+
+ echo -e "inode block number=$fix_block_num, wanted=$block_num" >> ${DETAIL_LOG_FILE}
+ 2>&1
+ if [ $fix_block_num -ne $block_num ];then
+ echo -e "Verify: failed to fix." >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+}
+
+f_verify_inode_meta_ecc()
+{
+ local -i inode=$1
+ local crc32=`printf "%d" $2`
+ local ecc=`printf "%d" $3`
+ DEVICE=$4
+
+ f_LogMsg ${DETAIL_LOG_FILE} "${SUDO_DEBUGFS} -R \"stat <${inode}>\" ${DEVICE}|grep \"CRC32:\""
+ fix_result=`${SUDO_DEBUGFS} -R "stat <${inode}>" ${DEVICE}|grep "CRC32:"`
+ f_LogMsg ${DETAIL_LOG_FILE} "echo ${fix_result} | awk '{print \$2}'"
+ fix_crc32=`echo ${fix_result} | awk '{print $2}'`
+ if [ -z $fix_crc32 ];then
+ echo -e "Failed to get inode block crc32 using debugfs.ocfs2" >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+ fix_crc32=`printf "%d" 0x${fix_crc32}`
+
+ f_LogMsg ${DETAIL_LOG_FILE} "echo ${fix_result} | awk '{print \$4}'"
+ fix_ecc=`echo ${fix_result} | awk '{print $4}'`
+ if [ -z $fix_ecc ];then
+ echo -e "Failed to get inode block ecc using debugfs.ocfs2" >> ${DETAIL_LOG_FILE} 2>&1
+ return 1
+ fi
+ fix_ecc=`printf "%d" 0x${fix_ecc}`
+
+ echo "crc32=$fix_crc32, bad crc32=$crc32; ecc=$fix_ecc, bad ecc=$ecc" >> ${DETAIL_LOG_FILE} 2>&1
+}
+
+################################################################################
+# Main Entry
+################################################################################
+
+#redefine the int signal hander
+trap 'echo -ne "\n\n">>${DETAIL_LOG_FILE};echo "Interrupted by Ctrl+C,Cleanuping ... "|tee
+-a ${DETAIL_LOG_FILE}; f_cleanup; exit 1' SIGINT
+
+f_setup $*
+
+START_TIME=${SECONDS}
+f_LogMsg ${DETAIL_LOG_FILE} "=====================Inode block testing start: `date`====================="
+
+f_runtest
+
+END_TIME=${SECONDS}
+f_LogMsg ${DETAIL_LOG_FILE} "=====================Inode block testing end: `date`========================="
+
+f_LogMsg ${DETAIL_LOG_FILE} "Time elapsed(s): $((${END_TIME}-${START_TIME}))"
+f_LogMsg ${DETAIL_LOG_FILE} "Tests total: ${TEST_NO}"
+f_LogMsg ${DETAIL_LOG_FILE} "Tests passed: ${TEST_PASS}"
+
+if [ ${TEST_NO} -ne ${TEST_PASS} ]; then
+ false
+fi
diff --git a/programs/python_common/single_run-WIP.sh b/programs/python_common/single_run-WIP.sh
index c6fcb77..f8a7d33 100755
--- a/programs/python_common/single_run-WIP.sh
+++ b/programs/python_common/single_run-WIP.sh
@@ -870,6 +870,26 @@ run_reflink_test()
log_end ${RC}
}
+run_filecheck_test()
+{
+ log_message "run filecheck_test" $@
+ if [ "$#" -lt "3" ]; then
+ echo "Error in run_filecheck()"
+ exit 1
+ fi
+
+ logdir=$1
+ device=$2
+ mountpoint=$3
+
+ log_start "filecheck_test"
+ ./filecheck_test_run.sh -o ${logdir} -d ${device} ${mountpoint}
+ RC=$?
+
+ log_end ${RC}
+}
+
+
# Following cases aim to test tools
run_mkfs()
{
@@ -975,7 +995,8 @@ if [ -z ${TESTCASES} ]; then
fi
SUPPORTED_TESTCASES="all create_and_open directaio fillverifyholes renamewriterace aiostress\
- filesizelimits mmaptruncate buildkernel splice sendfile mmap reserve_space inline xattr reflink mkfs tunefs backup_super"
+ filesizelimits mmaptruncate buildkernel splice sendfile mmap reserve_space inline xattr\
+ reflink mkfs tunefs backup_super filecheck"
for cas in ${TESTCASES}; do
echo ${SUPPORTED_TESTCASES} | grep -sqw $cas
if [ $? -ne 0 ]; then
@@ -1068,6 +1089,10 @@ for tc in `${ECHO} ${TESTCASES} | ${SED} "s:,: :g"`; do
run_reflink_test ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
fi
+ if [ "$tc"X = "filecheck"X -o "$tc"X = "all"X ];then
+ run_filecheck_test ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
+ fi
+
# For tools test.
if [ "$tc"X = "mkfs"X -o "$tc"X = "all"X ];then
--
2.6.2
More information about the Ocfs2-test-devel
mailing list