Received: by 2002:ab2:6309:0:b0:1fb:d597:ff75 with SMTP id s9csp818697lqt; Thu, 6 Jun 2024 22:05:50 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCW2v6/Jd+CXjjOxBxA88dd/OjiezJf5hZsFPE8WOWRvS3LqGawyUAEDNI0YTHvLehhn1xGe7U1JgRSOK4kypzUi9HgtKR0gniyJmGBKxg== X-Google-Smtp-Source: AGHT+IETe6wWZpBt0idMui0rgYB1xJfakAutPEx2WapPgIpQm8uUMJoGeShVIpyrJFjMg0miCawf X-Received: by 2002:a05:6358:5289:b0:186:ea4:b1a3 with SMTP id e5c5f4694b2df-19f1ffab8aamr180950855d.32.1717736750285; Thu, 06 Jun 2024 22:05:50 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717736750; cv=pass; d=google.com; s=arc-20160816; b=r0zS53ftdSbt4U9Y5kcF8UJEsQp8VP/cFYNkrRGRQ1YgE8XJFANjedN3Orfq8vcqg9 14YhRanwAVWFpfVO1yO7sCRwEjfqnBkpwc/yKgNEVeGyV7nZi9SMFS34qauKK99ceI+Q 3sc6f7E8svGcGPNbQyfco2zv1gU9SkiZuD589VHF3Ki9nh1S2HndvxJSWR8Wy6yXRqVT aUirkmIwhOg8KEK5vlxx9Muxrt+FwvtyZy4gLDhUNBxafjGV9q7JOGwiCur1bACAVN96 51VPYPILg3xUchShXvm2/mEFKKoMoROtk9vVS4LWv/oI+8jiux5dap4Ll6FiWkvG7Its qfnQ== ARC-Message-Signature: i=2; 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=8xj6yH8Cf3GJOD84/3mXMiJXsUmyi9wAyFSZHEO2jMk=; fh=yXYChwFvQA/NaaLzCC0IJdkW11OhjXgO4DHXzVmnGFw=; b=c0d00hjiImlYaMlAhfHyXlYUcfxfXHk4lgPrKWj4jFBQCXhkbCXa6BvEWJJsTOk7/+ N9seFkJ9hWwQo1eXQILIaB/+AvIJsv+3KuMt2H9hmu9Le5/BI2eZGO8LYQhJ8JVyDwsI GCdn8Yq6K4F6+3aHWH86wMd2C8y3j5V1Zq0oMNX92NJq8e8EWLSmUSywL+L1Sp44HhHI 2VcBmGf16rbCTQa5S+2BkLX8zyFdS+fXXVz1hFfWUV4b3YJaIIV6EERWXLB924woPkMf N0tBayI4X8LJi+RBdQt5FplhsTrTjWc2FYax3VUrHYKylibqSQICOMrkZ50a0TStXuPm 8nKQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1 spf=pass spfdomain=huawei.com dmarc=pass fromdomain=huawei.com); spf=pass (google.com: domain of linux-kernel+bounces-205387-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-205387-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 41be03b00d2f7-6de275fe2aasi2280981a12.520.2024.06.06.22.05.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Jun 2024 22:05:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-205387-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; arc=pass (i=1 spf=pass spfdomain=huawei.com dmarc=pass fromdomain=huawei.com); spf=pass (google.com: domain of linux-kernel+bounces-205387-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-205387-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 82E5628C148 for ; Fri, 7 Jun 2024 04:54:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D6CBE14EC5C; Fri, 7 Jun 2024 04:31:08 +0000 (UTC) Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) (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 4399414EC4F for ; Fri, 7 Jun 2024 04:31:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.188 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717734668; cv=none; b=f0409WDziAJkJm8oxRVAU57X497v43BxpblVqCZu7VxlThstJ2JZsFIxTnxEAfJTVt/4r7MV9lKhZ7z5+Ke2XwobFxfXA0IksHhV32tvc5ZT5Awoqv3Mznina4JPgB9/jc+Vhg+OWYbc9wvI9zFj/KCLBbGIjmL7iZwcNHioQe0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717734668; c=relaxed/simple; bh=htZlLJFMjR5Uyxfrw6hi7XwHK37Sx94doRV08dDG2BE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=I/1uHHkhoBrrurvhdHEdW3TNN0kR6yaeXsQPYUeShEP9xamh+McIHZ9kePcEvEgCPoFJistgiCyE/AUBSC1/+nDheCpSM62uN8bTjOUjQyEyT4XY7jXxbFoLtyysjCGFINNRR0wasWv++8l7rPib4onBYGiUppAmuV+bT4qUSrE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.188 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.105]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4VwSnc5ZwkzmXhG; Fri, 7 Jun 2024 12:26:28 +0800 (CST) Received: from kwepemm600013.china.huawei.com (unknown [7.193.23.68]) by mail.maildlp.com (Postfix) with ESMTPS id 9BBF1140413; Fri, 7 Jun 2024 12:30:49 +0800 (CST) Received: from huawei.com (10.175.104.67) by kwepemm600013.china.huawei.com (7.193.23.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 7 Jun 2024 12:27:44 +0800 From: Zhihao Cheng To: , , , , , CC: , Subject: [RFC PATCH mtd-utils 105/110] tests: ubifs_tools: fsck_tests: Add random_corrupt+fsck test Date: Fri, 7 Jun 2024 12:26:10 +0800 Message-ID: <20240607042615.2069840-106-chengzhihao1@huawei.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240607042615.2069840-1-chengzhihao1@huawei.com> References: <20240607042615.2069840-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: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemm600013.china.huawei.com (7.193.23.68) Inject random corruption on UBIFS image by writting random data on kinds of mtd devices (eg. nand, nor), check the consistency of UBIFS after fsck. This testcase simulates random bad UBIFS image caused by hardware exceptions(eg. ecc uncorrectable, unwritten), and makes sure that fsck.ubifs could make UBIFS be consistent after repairing UBIFS image. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + configure.ac | 3 +- tests/ubifs_tools-tests/Makemodule.am | 3 +- .../fsck_tests/random_corrupted_fsck.sh.in | 206 +++++++++++++++++++++ 4 files changed, 211 insertions(+), 2 deletions(-) create mode 100755 tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh.in diff --git a/.gitignore b/.gitignore index 1d150f7a..203f01f0 100644 --- a/.gitignore +++ b/.gitignore @@ -119,6 +119,7 @@ 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 +tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh # # Files generated by autotools diff --git a/configure.ac b/configure.ac index 1a7174a5..545fcc41 100644 --- a/configure.ac +++ b/configure.ac @@ -295,7 +295,8 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.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]) + tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh + tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh]) AC_OUTPUT([Makefile]) diff --git a/tests/ubifs_tools-tests/Makemodule.am b/tests/ubifs_tools-tests/Makemodule.am index 2c190e2b..9881ebbe 100644 --- a/tests/ubifs_tools-tests/Makemodule.am +++ b/tests/ubifs_tools-tests/Makemodule.am @@ -4,4 +4,5 @@ test_SCRIPTS += \ 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 + tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh \ + tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh diff --git a/tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh.in b/tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh.in new file mode 100755 index 00000000..64760c94 --- /dev/null +++ b/tests/ubifs_tools-tests/fsck_tests/random_corrupted_fsck.sh.in @@ -0,0 +1,206 @@ +#!/bin/sh +# Copyright (c), 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. 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 & + + 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 + 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" + 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 + fsck.ubifs -yb $DEV 2>&1 > $LOG_FILE + res=$? + cat $LOG_FILE + let "ret=$res&~$FSCK_NONDESTRUCT" + if [[ $ret != $FSCK_OK ]] + then + # Skip superblock error + log=`cat $LOG_FILE | grep "bad node at LEB 0:"` + if [[ "$log" != "" ]] + then + skip=1 + echo "SB is corrupted, skip fsck & mounting" + else + fatal "fsck fail $res" + fi + fi + + if [[ $skip == 0 ]]; then + enable_chkfs + + mount_ubifs $DEV $MNT "noauthentication" "noatime" + res=$? + if [[ $res != 0 ]] + then + fatal "mount fail $res" + fi + + if [[ "$encryption" == "encrypted" ]]; then + # Ignore the encrypting error, root dir could be + # corrupted, the new root dir cannot be + # encrypted because it is not empty. + encryption_set_key $MNT 1 + 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+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 -- 2.13.6