]> www.infradead.org Git - mtd-utils.git/commitdiff
tests: ubifs_tools: fsck_tests: Add cycle_powercut+fsck test
authorZhihao Cheng <chengzhihao1@huawei.com>
Mon, 11 Nov 2024 09:08:23 +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, check the
consistency of UBIFS after fsck.
This testscase mainly makes sure that fsck.ubifs can make UBIFS
image be consistent in common stress cases and powercut cases.

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/cycle_powercut_mount_fsck.sh.in [new file with mode: 0755]

index ea99a6143e7735e7ba695b322669654cb9249fa7..1d150f7ab8715bd1c4617586b335615c9d57bc33 100644 (file)
@@ -118,6 +118,7 @@ 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
 tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh
+tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh
 
 #
 # Files generated by autotools
index 47efd40c85f6c6c2b7bf6dc994038f5468d2f231..7b9294595a7d8f90dce23db85c402cd0ee51d67c 100644 (file)
@@ -297,7 +297,8 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.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
-       tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh])
+       tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh
+       tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh])
 
 AC_OUTPUT([Makefile])
 
index 932a2bcb8cb0ded2ec73c69c9434d5be78342b1b..2c190e2b2fcb67a941c5171d354fc701c0ded122 100644 (file)
@@ -3,4 +3,5 @@ test_SCRIPTS += \
        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 \
-       tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh
+       tests/ubifs_tools-tests/fsck_tests/cycle_corrupted_fsck_fault_inject.sh \
+       tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh
diff --git a/tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh.in b/tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh.in
new file mode 100755 (executable)
index 0000000..6af1b54
--- /dev/null
@@ -0,0 +1,148 @@
+#!/bin/sh
+# Copyright (c), 2024, Huawei Technologies Co, Ltd.
+# Author: Zhihao Cheng <chengzhihao1@huawei.com>
+#
+# Test Description:
+# Do many cycles of mount/fsstress/powercut/umount/fsck/mount, check whether
+# mount is successful.
+# Running time: 9h
+
+TESTBINDIR=@TESTBINDIR@
+source $TESTBINDIR/common.sh
+
+ID="0x20,0xa7,0x00,0x26" # 4G 256KB 4KB 2KB-sub-page
+
+function run_test()
+{
+       local encryption=$1
+
+       echo "Do cycle mount+powercut+fsck+umount($encryption) test"
+       modprobe nandsim id_bytes=$ID
+       mtdnum="$(find_mtd_device "$nandsim_patt")"
+       flash_eraseall /dev/mtd$mtdnum
+
+       dmesg -c > /dev/null
+
+       modprobe ubi mtd="$mtdnum,4096" || fatal "modprobe ubi fail"
+       ubimkvol -N vol_test -m -n 0 /dev/ubi$UBI_NUM || fatal "mkvol fail"
+       modprobe ubifs || fatal "modprobe ubifs fail"
+
+       if [[ "$encryption" == "encrypted" ]]; then
+               encryption_gen_key
+       fi
+
+       round=0
+       while [[ $round -lt 60 ]]
+       do
+               echo "---------------------- ROUND $round ----------------------"
+               let round=$round+1
+
+               mount_ubifs $DEV $MNT || fatal "mount ubifs fail"
+               if [[ "$encryption" == "encrypted" ]]; then
+                       encryption_set_key $MNT
+               fi
+
+               if [[ $(($round % 30)) == 0 ]]
+               then
+                       echo "Clean files"
+                       rm -rf $MNT/*
+                       check_err_msg
+               fi
+
+               fsstress -d $MNT -l0 -p4 -n10000 &
+               sleep $((RANDOM % 30))
+
+               per=`df -Th | grep ubifs | awk '{print $6}'`;
+               if [[ ${per%?} -gt 95 ]]; then
+                       dmesg -c > /dev/null # The ENOSPC error messages may exist
+               else
+                       check_err_msg # Make sure new operations are okay after fsck
+               fi
+               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
+
+               disable_chkfs
+       done
+
+       modprobe -r ubifs
+       modprobe -r ubi
+       modprobe -r nandsim
+}
+
+check_fsstress
+start_t=$(date +%s)
+run_test "encrypted"
+run_test "noencrypted"
+end_t=$(date +%s)
+time_cost=$(( end_t - start_t ))
+echo "Success, cost $time_cost seconds"
+exit 0