]> www.infradead.org Git - mtd-utils.git/commitdiff
tests: ubifs_tools: fsck_tests: Add cycle mount+fsck test
authorZhihao Cheng <chengzhihao1@huawei.com>
Mon, 11 Nov 2024 09:08:20 +0000 (17:08 +0800)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Mon, 11 Nov 2024 09:32:46 +0000 (10:32 +0100)
Do fsstress and fsck, check whether there are any files(and their data)
are lost after fsck. This testcase mainly checks whether fsck.ubifs could
corrupt the filesystem content in common case.

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

index 799290a4d8ad83472a5883f2cabdb639007fec8f..7de38e8690910c28ffe93834e03eb2ff04f9c9f3 100644 (file)
@@ -115,6 +115,7 @@ tests/ubi-tests/runubitests.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
 
 #
 # Files generated by autotools
index 45f51abb678316dbf14ece78dc3c7bd4745a44eb..bcd9b63aa7db964859bf6026ba2ee266d3fa238b 100644 (file)
@@ -294,7 +294,8 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh
        tests/ubi-tests/runubitests.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/authentication_refuse.sh
+       tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh])
 
 AC_OUTPUT([Makefile])
 
index 6b533982d22c0df853ed4d8c0743ce7131a2e10f..68c77a6295cddfdaf15a5de1d4822c7a9239a90b 100644 (file)
@@ -1,3 +1,4 @@
 test_SCRIPTS += \
        tests/ubifs_tools-tests/lib/common.sh \
-       tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh
+       tests/ubifs_tools-tests/fsck_tests/authentication_refuse.sh \
+       tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh
diff --git a/tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh.in b/tests/ubifs_tools-tests/fsck_tests/cycle_mount_fsck_check.sh.in
new file mode 100755 (executable)
index 0000000..c9972e2
--- /dev/null
@@ -0,0 +1,154 @@
+#!/bin/sh
+# Copyright (c), 2024, Huawei Technologies Co, Ltd.
+# Author: Zhihao Cheng <chengzhihao1@huawei.com>
+#
+# Test Description:
+# Do many cycles of mount/fsstress/umount/fsck/mount, check whether the
+# filesystem content before fsck and after fsck are consistent.
+# Running time: 10h
+
+TESTBINDIR=@TESTBINDIR@
+source $TESTBINDIR/common.sh
+
+ID="0xec,0xa1,0x00,0x15" # 128M 128KB 2KB 512-sub-page
+
+function run_test()
+{
+       encryption=$1
+       modprobe nandsim id_bytes=$ID
+       mtdnum="$(find_mtd_device "$nandsim_patt")"
+       flash_eraseall /dev/mtd$mtdnum
+
+       dmesg -c > /dev/null
+
+       modprobe ubi mtd="$mtdnum,2048" || fatal "modprobe ubi fail"
+       ubimkvol -N vol_test -m -n 0 /dev/ubi$UBI_NUM || fatal "mkvol fail"
+       modprobe ubifs || fatal "modprobe ubifs fail"
+
+       echo "Do cycle mount+umount+fsck+check_fs_content test ($encryption)"
+
+       if [[ "$encryption" == "encrypted" ]]; then
+               encryption_gen_key
+       fi
+
+       round=0
+       while [[ $round -lt 20 ]]
+       do
+               echo "---------------------- ROUND $round ----------------------"
+               let round=$round+1
+
+               mount_ubifs $DEV $MNT "noauthentication" "noatime" || fatal "mount ubifs fail"
+               if [[ "$encryption" == "encrypted" ]]; then
+                       encryption_set_key $MNT
+               fi
+
+               per=`df -Th | grep ubifs | awk '{print $6}'`;
+               if [[ ${per%?} -gt 95 ]]; then
+                       # Used > 95%
+                       echo "Clean files"
+                       rm -rf $MNT/*
+                       check_err_msg
+               fi
+
+               fsstress -d $MNT -l0 -p4 -n10000 &
+
+               sleep $((RANDOM % 30))
+
+               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
+
+               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
+               sync
+
+               # Record filesystem information
+               rm -f $TMP_FILE 2>/dev/null
+               read_dir $MNT "md5sum"
+
+               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
+                       # 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/
+                       log=`cat $LOG_FILE | grep "dbg_check_ltab_lnum: invalid empty space in LEB"`
+                       if [[ "$log" == "" ]]; then
+                               fatal "fsck fail $res"
+                       fi
+                       if [[ $res != $FSCK_NONDESTRUCT ]]; then
+                               fatal "fsck fail $res"
+                       fi
+               fi
+
+               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  # Ensure that all files are accessible
+               ret=$?
+               if [[ $ret != 0 ]]; then
+                       fatal "Cannot access all files"
+               fi
+               check_err_msg
+
+               # Check filesystem information
+               parse_dir "md5sum"
+               rm -f $TMP_FILE 2>/dev/null
+
+               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)
+for encryption in "encrypted" "noencrypted"; do
+       run_test $encryption
+done
+end_t=$(date +%s)
+time_cost=$(( end_t - start_t ))
+echo "Success, cost $time_cost seconds"
+exit 0