summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhihao Cheng <chengzhihao1@huawei.com>2024-11-11 17:08:21 +0800
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-11-11 10:32:46 +0100
commitfcc70be5f29872c11e3c8be36c9d3b9c0d016080 (patch)
treedd57ea15919018d7d8de773c9412c9b7a8c56cc3
parent5fca379e9ed7ecbf643422c7b4ae0f7caaf94a19 (diff)
tests: ubifs_tools: fsck_tests: Add powercut+fsck+mount test
Inject powercut while doing fsstress on mounted UBIFS for kinds of flashes (eg. nand, nor). This testcase mainly makes sure that fsck.ubifs can make UBIFS image be consistent on different flashes (eg. nand, nor). Because the min_io_size of nor flash is 1, the UBIFS image on nor flash will be different from nand flash after doing powercut, so we need make sure fsck.ubifs can handle these two types of flash. Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--.gitignore1
-rw-r--r--configure.ac3
-rw-r--r--tests/ubifs_tools-tests/Makemodule.am3
-rwxr-xr-xtests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in148
4 files changed, 153 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 7de38e8..b63b986 100644
--- a/.gitignore
+++ b/.gitignore
@@ -116,6 +116,7 @@ tests/ubi-tests/ubi-stress-test.sh
tests/ubifs_tools-tests/lib/common.sh
tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh
tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh
+tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh
#
# Files generated by autotools
diff --git a/configure.ac b/configure.ac
index bcd9b63..460109e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -295,7 +295,8 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh
tests/ubi-tests/ubi-stress-test.sh
tests/ubifs_tools-tests/lib/common.sh
tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh
- tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh])
+ tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh
+ tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh])
AC_OUTPUT([Makefile])
diff --git a/tests/ubifs_tools-tests/Makemodule.am b/tests/ubifs_tools-tests/Makemodule.am
index 68c77a6..d54514d 100644
--- a/tests/ubifs_tools-tests/Makemodule.am
+++ b/tests/ubifs_tools-tests/Makemodule.am
@@ -1,4 +1,5 @@
test_SCRIPTS += \
tests/ubifs_tools-tests/lib/common.sh \
tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh \
- tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh
+ tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh \
+ tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh
diff --git a/tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in b/tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in
new file mode 100755
index 0000000..ac7128b
--- /dev/null
+++ b/tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in
@@ -0,0 +1,148 @@
+#!/bin/sh
+# Copyright (c), 2024, Huawei Technologies Co, Ltd.
+# Author: Zhihao Cheng <chengzhihao1@huawei.com>
+#
+# Test Description:
+# For many kinds of flash, do following things
+# 1. mount UBIFS
+# 2. fsstress & powercut & unmount
+# 3. fsck UBIFS
+# 4. check UBIFS mounting result
+# Running time: 1h
+
+TESTBINDIR=@TESTBINDIR@
+source $TESTBINDIR/common.sh
+
+function run_test()
+{
+ local simulator="$1";
+ local size="$2";
+ local peb_size="$3";
+ local page_size="$4";
+ local encryption=$5;
+
+ echo "======================================================================"
+ printf "%s" "$simulator: ${size}MiB PEB size ${peb_size}KiB"
+ if [ "$simulator" = "nandsim" ]; then
+ printf " %s" "page size ${page_size}Bytes"
+ fi
+ printf " $encryption\n"
+
+ if [ "$simulator" = "nandsim" ]; then
+ $TESTBINDIR/load_nandsim.sh "$size" "$peb_size" "$page_size" || echo "cannot load nandsim";
+ mtdnum="$(find_mtd_device "$nandsim_patt")"
+ elif [ "$simulator" = "mtdram" ]; then
+ load_mtdram "$size" "$peb_size" || echo "cannot load mtdram"
+ mtdnum="$(find_mtd_device "$mtdram_patt")"
+ else
+ fatal "$simulator is not supported"
+ fi
+
+ flash_eraseall /dev/mtd$mtdnum
+ modprobe ubi mtd="$mtdnum,$page_size" || fatal "modprobe ubi fail"
+ ubimkvol -N vol_test -m -n 0 /dev/ubi$UBI_NUM || fatal "mkvol fail"
+ modprobe ubifs || fatal "modprobe ubifs fail"
+ mount_ubifs $DEV $MNT || fatal "mount ubifs fail"
+ if [[ "$encryption" == "encrypted" ]]; then
+ encryption_gen_key
+ encryption_set_key $MNT
+ fi
+
+ fsstress -d $MNT -l0 -p4 -n10000 &
+ sleep $((RANDOM % 120))
+ powercut
+
+ ps -e | grep -w fsstress > /dev/null 2>&1
+ while [ $? -eq 0 ]
+ do
+ killall -9 fsstress > /dev/null 2>&1
+ sleep 1
+ ps -e | grep -w fsstress > /dev/null 2>&1
+ done
+
+ while true
+ do
+ res=`mount | grep "$MNT"`
+ if [[ "$res" == "" ]]
+ then
+ break;
+ fi
+ umount $MNT
+ sleep 0.1
+ done
+
+ fsck.ubifs -a $DEV 2>&1 > $LOG_FILE
+ res=$?
+ cat $LOG_FILE
+ if [[ $res != $FSCK_OK ]]
+ then
+ # Powercut during layout_leb_in_gaps may change index LEBs
+ # without updating LPT.
+ idx_log=`cat $LOG_FILE | grep "Inconsistent properties" | grep "is_idx 1"`
+ # The lpt nodes could be parsed incorrectly because the lpt disk
+ # layout is too simple. See details in
+ # https://lore.kernel.org/linux-mtd/97ca7fe4-4ad4-edd1-e97a-1d540aeabe2d@huawei.com/
+ lpt_log=`cat $LOG_FILE | grep "dbg_check_ltab_lnum: invalid empty space in LEB"`
+ if [[ "$idx_log" == "" ]] && [[ "$lpt_log" == "" ]]; then
+ fatal "fsck fail $res"
+ fi
+ if [[ $res != $FSCK_NONDESTRUCT ]]; then
+ fatal "fsck fail $res"
+ fi
+ fi
+
+ dmesg -c > /dev/null # powercut could reproduce error messages
+
+ enable_chkfs
+
+ mount_ubifs $DEV $MNT "noauthentication" "noatime"
+ res=$?
+ if [[ $res != 0 ]]
+ then
+ fatal "mount fail $res"
+ fi
+
+ if [[ "$encryption" == "encrypted" ]]; then
+ encryption_set_key $MNT
+ fi
+
+ du -sh $MNT > /dev/null # Make sure all files are accessible
+ ret=$?
+ if [[ $ret != 0 ]]; then
+ fatal "Cannot access all files"
+ fi
+ check_err_msg
+
+ umount $MNT
+ res=$?
+ if [[ $res != 0 ]]
+ then
+ fatal "unmount fail $res"
+ fi
+
+ check_err_msg
+
+ modprobe -r ubifs
+ modprobe -r ubi
+ modprobe -r $simulator
+
+ echo "----------------------------------------------------------------------"
+}
+
+check_fsstress
+start_t=$(date +%s)
+echo "Do powercut+fsck+mount test in kinds of flashes"
+for simulator in "mtdram" "nandsim"; do
+ for encryption in "encrypted" "noencrypted"; do
+ run_test "$simulator" "16" "16" "512" $encryption
+ run_test "$simulator" "64" "16" "512" $encryption
+ run_test "$simulator" "128" "64" "2048" $encryption
+ run_test "$simulator" "256" "128" "2048" $encryption
+ run_test "$simulator" "512" "128" "2048" $encryption
+ run_test "$simulator" "1024" "512" "2048" $encryption
+ done
+done
+end_t=$(date +%s)
+time_cost=$(( end_t - start_t ))
+echo "Success, cost $time_cost seconds"
+exit 0