Received: by 2002:a05:7412:b995:b0:f9:9502:5bb8 with SMTP id it21csp3699148rdb; Wed, 27 Dec 2023 17:35:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IGdZOSaL3oi4u0ETLBEX+/70QA2pfC8XGHijeEWKQkQsybxTwy+BL5g6kq6fi/KuU2uD8R/ X-Received: by 2002:a05:6e02:2189:b0:35f:ea84:83d9 with SMTP id j9-20020a056e02218900b0035fea8483d9mr13492945ila.27.1703727327575; Wed, 27 Dec 2023 17:35:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727327; cv=none; d=google.com; s=arc-20160816; b=fJcbTwbjLgU3p78sZvcuCGDnixiMzAQ6tnCCDxzD8xAuJmxIgW/vigsIjBa9rIMU38 WL2ljynvxzlEHaNi1OLKxJd/ASiClYj/oNGPUZnWz3/FfEw+k8kZJnRMXqW7KBpFOi8+ WRaNHHF2Yj6tD/3Ao7ahMmyZtPA76abjxEbZT0nVE5RhdDSOuCJ8k7hEHK/yS4KK5sPh tkSmJelXU2kewiTdVim8RujzhZVSq7jDhhsgrnnuUNqaBQUkqfujAz9HOlKfYqCKUsIa sZJ75lQwKFnEmIOV4L+dOmtZUJwqn/s97v7/REJmt28W3mFjl3Tm58pP+Ee19FUCKTUf hH6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=g1hrKcGeXaosEfR6NXu+aHaULaddQCV24xfWqmSV814=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=TkrdXHNzxG1N2QrqMYa3PGSH5hzQFOb96QFCb831b8ujK+1er3Djop7/dIcMK2P9Xu mjEUEQ9r6mt++WN+LbtZ34HTAK0fp8sqVK4/dtxBjpcA7kUmxFmtZ4mCQIlOGNnIT1Kz 0VFtSjvdY58XzQ4+WSRTZmpWy17CP6Zr7MiKGKE+7nkU1TnlB17y6J4NgliDoCK4P4mo NjZpebQcH9mS4EBeN02f2Wl0Um3pfSTUGL/GAPa99PSagAyF+lD/ExrMlXAEOCmU+2qI ACZAZ+T9p4/wdxzbyjTM4b+c85DIGlIKPbx6AhcjvEQOTUMl6Uh6/j18MJxTz2DNdTFb g1uQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12343-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12343-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id s17-20020a656911000000b005cdf992367dsi9616331pgq.730.2023.12.27.17.35.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:35:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12343-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12343-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12343-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 790592816AF for ; Thu, 28 Dec 2023 01:35:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7A23064E; Thu, 28 Dec 2023 01:34:31 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga07-in.huawei.com (szxga07-in.huawei.com [45.249.212.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFB4010E3 for ; Thu, 28 Dec 2023 01:34:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga07-in.huawei.com (SkyGuard) with ESMTP id 4T0rcD4mJrz1R5Yg; Thu, 28 Dec 2023 09:33:00 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 3BA5E1A0192; Thu, 28 Dec 2023 09:34:06 +0800 (CST) Received: from huawei.com (10.175.127.227) by kwepemm000013.china.huawei.com (7.193.23.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Thu, 28 Dec 2023 09:33:36 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 07/11] tests: ubifs_repair: Add random_corrupt+repair test Date: Thu, 28 Dec 2023 09:36:35 +0800 Message-ID: <20231228013639.2827205-8-chengzhihao1@huawei.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228013639.2827205-1-chengzhihao1@huawei.com> References: <20231228013639.2827205-1-chengzhihao1@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) Inject random corruption on UBIFS image by writting random data on kinds of mtd devices (eg. nand, nor), check the consistency of UBIFS after repairing. This testcase simulate random bad UBIFS image caused by hardware exceptions(eg. ecc uncorrectable, unwritten), and makes sure that ubifs_repair could make UBIFS be consistent after repairing UBIFS image. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + configure.ac | 3 +- tests/ubifs_repair-tests/Makemodule.am | 3 +- .../tests/random_corrupted_repair.sh.in | 205 +++++++++++++++++++++ 4 files changed, 210 insertions(+), 2 deletions(-) create mode 100755 tests/ubifs_repair-tests/tests/random_corrupted_repair.sh.in diff --git a/.gitignore b/.gitignore index 7077b8d..dbe63b7 100644 --- a/.gitignore +++ b/.gitignore @@ -118,6 +118,7 @@ tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh tests/ubifs_repair-tests/tests/powercut_repair_mount.sh tests/ubifs_repair-tests/tests/cycle_corrupted_repair_fault_inject.sh tests/ubifs_repair-tests/tests/cycle_powercut_mount_repair.sh +tests/ubifs_repair-tests/tests/random_corrupted_repair.sh # # Files generated by autotools diff --git a/configure.ac b/configure.ac index b3dd453..11d34bd 100644 --- a/configure.ac +++ b/configure.ac @@ -360,6 +360,7 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh tests/ubifs_repair-tests/tests/powercut_repair_mount.sh tests/ubifs_repair-tests/tests/cycle_corrupted_repair_fault_inject.sh - tests/ubifs_repair-tests/tests/cycle_powercut_mount_repair.sh]) + tests/ubifs_repair-tests/tests/cycle_powercut_mount_repair.sh + tests/ubifs_repair-tests/tests/random_corrupted_repair.sh]) AC_OUTPUT([Makefile]) diff --git a/tests/ubifs_repair-tests/Makemodule.am b/tests/ubifs_repair-tests/Makemodule.am index 4a7f5ed..323102b 100644 --- a/tests/ubifs_repair-tests/Makemodule.am +++ b/tests/ubifs_repair-tests/Makemodule.am @@ -4,4 +4,5 @@ test_SCRIPTS += \ tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh \ tests/ubifs_repair-tests/tests/powercut_repair_mount.sh \ tests/ubifs_repair-tests/tests/cycle_corrupted_repair_fault_inject.sh \ - tests/ubifs_repair-tests/tests/cycle_powercut_mount_repair.sh + tests/ubifs_repair-tests/tests/cycle_powercut_mount_repair.sh \ + tests/ubifs_repair-tests/tests/random_corrupted_repair.sh diff --git a/tests/ubifs_repair-tests/tests/random_corrupted_repair.sh.in b/tests/ubifs_repair-tests/tests/random_corrupted_repair.sh.in new file mode 100755 index 0000000..61ec64e --- /dev/null +++ b/tests/ubifs_repair-tests/tests/random_corrupted_repair.sh.in @@ -0,0 +1,205 @@ +#!/bin/sh +# Copyright (c), 2023-2024, Huawei Technologies Co, Ltd. +# Author: Zhihao Cheng +# +# Test Description: +# For many kinds of flash, do following things +# 1. mount UBIFS +# 2. fsstress && unmount +# 3. inject corruption into UBIFS image randomly +# 3. repair ubifs +# 4. check UBIFS mounting result +# Running time: 10h + +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}KiB" + 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,0,0,1" fm_autoconvert || 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 & + + while true; + do + per=`df -Th | grep ubifs | awk '{print $6}'`; + if [[ ${per%?} -gt 95 ]]; then + # Used > 95% + break; + fi + done + + 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 + + # injection + times=$((RANDOM % 10)) + let times=$times+10 + i=0 + tot_peb=`cat /sys/class/ubi/ubi$UBI_NUM/total_eraseblocks`; + + modprobe -r ubifs + modprobe -r ubi # Stop wear-leveling & erasing worker + while [[ $i -lt $times ]] + do + let i=$i+1; + peb=$((RANDOM % $tot_peb)); + pg=`expr $peb_size \* 1024`; + peb_off=`expr $pg \* $peb` + pages=`expr $pg / $page_size`; + pg=`expr $pages - 2`; + pg=$((RANDOM % $pg)); + pg_off=`expr $pg + 2`; + pg_start=`expr $pages \* $peb`; + pg=`expr $pg_start + $pg_off`; + vid_pg=`expr $pg_start + 1`; + dd if=/dev/mtd$mtdnum of=$TMP_FILE bs=$page_size skip=$vid_pg count=1 2>/dev/null; + content=`cat $TMP_FILE | grep UBI!`; # vid header magic + if [[ "$content" == "" ]]; then + # Skip free PEB, otherwise data could be overwritten in ubifs repairing process + continue; + fi + if [[ $((RANDOM % 2)) == 0 ]]; then + # Corrupts 1 page + dd if=/dev/urandom of=/dev/mtd$mtdnum bs=$page_size seek=$pg count=1; + else + # Erase 1 LEB, TNC points to an unmapped area + flash_erase /dev/mtd$mtdnum $peb_off 1 + fi + done + rm -f $TMP_FILE 2>/dev/null + sync + + skip=0 + modprobe ubi mtd="$mtdnum,$page_size,0,0,1" fm_autoconvert + ret=$? + if [[ $ret != 0 ]] + then + skip=1 + echo "UBI layout volume is corrupted, skip" + fi + + if [[ $skip == 0 ]]; then + modprobe ubifs || fatal "modprobe ubifs2 fail" + dmesg -c > /dev/null + echo 'format "UBIFS DBG repair" +pflmt' > /sys/kernel/debug/dynamic_debug/control + echo "$DEV" > /sys/kernel/debug/ubifs/repair_fs + res=$? + if [[ $res != 0 ]] + then + log=`dmesg | grep "bad node at LEB 0:"` + if [[ "$log" != "" ]] + then + skip=1 + echo "SB is corrupted, skip repairing & mounting" + else + fatal "repair fail $res" + fi + fi + + check_memleak + + if [[ $skip == 0 ]]; then + dmesg -c > /dev/null # repairing corrupted image could reproduce error messages + + enable_chkfs + + mount_ubifs $DEV $MNT + 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 is not suggested in this testcase, because + # ubi_io_read(triggered by wear_leveling_worker -> ubi_eba_copy_leb) + # could print stack if ecc uncorrectable errors are detected. + + umount $MNT + res=$? + if [[ $res != 0 ]] + then + fatal "unmount fail $res" + fi + fi + modprobe -r ubifs + modprobe -r ubi + fi + modprobe -r $simulator + + echo "----------------------------------------------------------------------" +} + +check_fsstress +start_t=$(date +%s) +echo "Do random_corrruption+repair+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 -- 2.13.6