aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhihao Cheng <chengzhihao1@huawei.com>2024-11-11 17:08:23 +0800
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-11-11 10:32:46 +0100
commite06aa684857345f8be397a481cf726a1051734d7 (patch)
tree00ac8c3cfadeb65a9224a43bd8ef19e5d132c6c0
parent075e40c91c1a9ae0ce415699b0278d880c098128 (diff)
tests: ubifs_tools: fsck_tests: Add cycle_powercut+fsck test
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>
-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/cycle_powercut_mount_fsck.sh.in148
4 files changed, 153 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index ea99a61..1d150f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/configure.ac b/configure.ac
index 47efd40..7b92945 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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])
diff --git a/tests/ubifs_tools-tests/Makemodule.am b/tests/ubifs_tools-tests/Makemodule.am
index 932a2bc..2c190e2 100644
--- a/tests/ubifs_tools-tests/Makemodule.am
+++ b/tests/ubifs_tools-tests/Makemodule.am
@@ -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
index 0000000..6af1b54
--- /dev/null
+++ b/tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh.in
@@ -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