]> www.infradead.org Git - mtd-utils.git/commitdiff
tests: ubifs_tools: fsck_tests: Add powercut+fsck+mount test
authorZhihao Cheng <chengzhihao1@huawei.com>
Mon, 11 Nov 2024 09:08:21 +0000 (17:08 +0800)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Mon, 11 Nov 2024 09:32:46 +0000 (10:32 +0100)
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>
.gitignore
configure.ac
tests/ubifs_tools-tests/Makemodule.am
tests/ubifs_tools-tests/fsck_tests/powercut_fsck_mount.sh.in [new file with mode: 0755]

index 7de38e8690910c28ffe93834e03eb2ff04f9c9f3..b63b98686b6584d07baadaa63e0acd3f7db9be20 100644 (file)
@@ -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
index bcd9b63aa7db964859bf6026ba2ee266d3fa238b..460109e7c37a35b07740d08ddaf544bf033f79d7 100644 (file)
@@ -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])
 
index 68c77a6295cddfdaf15a5de1d4822c7a9239a90b..d54514da3344c3a4ab4cd94d300cbf6a9816c3cb 100644 (file)
@@ -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 (executable)
index 0000000..ac7128b
--- /dev/null
@@ -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