From patchwork Thu Dec 28 01:36:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 183599 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1755879dyb; Wed, 27 Dec 2023 17:34:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IFzttchKWjg3MFky+uq1FnP0OrEKPktaBDU5+igWclW5dk8xDZ/H5pySeDaCOSzYBFhr031 X-Received: by 2002:a05:6214:4112:b0:67f:428f:350 with SMTP id kc18-20020a056214411200b0067f428f0350mr16612752qvb.91.1703727272981; Wed, 27 Dec 2023 17:34:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727272; cv=none; d=google.com; s=arc-20160816; b=cNioiTh69+k9kmvlXDiE9b5qZd4UkOkkc+AKfguDhzals2EBdsqjF0ZrVCMnnbSn4y NHRt7OfmGu6Cb6jm2XpxfwhiyDfPJyh9EL0HUSREhr2Gp6Wkl7vvduW+5SYnD+vw5hc6 La+Az1en+cg7JXc4UmITdPXpHlCydqARyQMNK9z2jAeL35IuyigrYDVwtRJBu8VsLTtv q1FCx0tHOLVzZhGU2dybeicL3rNrHvRLPAYNeUhkVyO9OJkJIVA++ccz9GjDxA0sOrQi CloQQE7GZUmZq79WwsYaq54W2e5xDLYrZd0ZcvoVzGYHRQUGqwzgyAxVGT+jZK1MzMon H8aA== 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=mj0EL1WGIU+DMKuQ2zBnGOcv66VmxcqKE1t1tZxdFx8=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=W+h+5SIGehmaMUVBGZolwek0tLhOdhQKCRVVzmzXGJDdQdi+sPg19j6pw2oemIav/w Sbr4SVYJvtJOeaEabNOu10XbpPHYgTFtpk89kTTiETtTPmCwH+sXTX3x8cwhqjfebGbM kU7ifOEoOhTBe8TA+zrw8QBFv+uSvfKtyeoGIYbbJnEXGV6TFYmGmf1Y3jSqm8dYHpoc 7BuH2566O3tIAXaZdoVLVuA5moGPuKZqDVE75qFwDAv53P/+JfocRri+QyozfxYM5sC7 Zgn3Sr4EOwLy6SOBH0ffkSwlnTSc0Q/JzJnt9fdQtfl+OJeZPyyRA+WKClkH319Hhsu+ eOOQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12338-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12338-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id d10-20020a0cdb0a000000b0067f2c4029easi8024570qvk.476.2023.12.27.17.34.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:34:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12338-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12338-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12338-ouuuleilei=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 ny.mirrors.kernel.org (Postfix) with ESMTPS id B488A1C21064 for ; Thu, 28 Dec 2023 01:34:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6FCEF4695; Thu, 28 Dec 2023 01:33:46 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) (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 1EF2210E6 for ; Thu, 28 Dec 2023 01:33:41 +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.163.44]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4T0rbK2BGFz29dNf; Thu, 28 Dec 2023 09:32:13 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 82ABD140120; Thu, 28 Dec 2023 09:33:33 +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:32 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 01/11] tests: Add common libs for ubifs_repair test Date: Thu, 28 Dec 2023 09:36:29 +0800 Message-ID: <20231228013639.2827205-2-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487529089836357 X-GMAIL-MSGID: 1786487529089836357 This is a preparation for adding ubifs_repair testcases. Add some common functions, for example: powercut, load_mtdram, mount_ubifs, encryption operations, etc. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + Makefile.am | 1 + configure.ac | 3 +- tests/ubifs_repair-tests/Makemodule.am | 2 + tests/ubifs_repair-tests/lib/common.sh.in | 347 ++++++++++++++++++++++++++++++ 5 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 tests/ubifs_repair-tests/Makemodule.am create mode 100755 tests/ubifs_repair-tests/lib/common.sh.in diff --git a/.gitignore b/.gitignore index 8c51ee5..c811883 100644 --- a/.gitignore +++ b/.gitignore @@ -112,6 +112,7 @@ tests/fs-tests/stress/fs_stress00.sh tests/fs-tests/stress/fs_stress01.sh tests/ubi-tests/runubitests.sh tests/ubi-tests/ubi-stress-test.sh +tests/ubifs_repair-tests/lib/common.sh # # Files generated by autotools diff --git a/Makefile.am b/Makefile.am index dd14d96..1454233 100644 --- a/Makefile.am +++ b/Makefile.am @@ -63,6 +63,7 @@ include tests/jittertest/Makemodule.am include tests/checkfs/Makemodule.am include tests/fs-tests/Makemodule.am include tests/mtd-tests/Makemodule.am +include tests/ubifs_repair-tests/Makemodule.am endif if UNIT_TESTS diff --git a/configure.ac b/configure.ac index cd48bb0..d3d3589 100644 --- a/configure.ac +++ b/configure.ac @@ -354,6 +354,7 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh tests/fs-tests/stress/fs_stress00.sh tests/fs-tests/stress/fs_stress01.sh tests/ubi-tests/runubitests.sh - tests/ubi-tests/ubi-stress-test.sh]) + tests/ubi-tests/ubi-stress-test.sh + tests/ubifs_repair-tests/lib/common.sh]) AC_OUTPUT([Makefile]) diff --git a/tests/ubifs_repair-tests/Makemodule.am b/tests/ubifs_repair-tests/Makemodule.am new file mode 100644 index 0000000..caa503d --- /dev/null +++ b/tests/ubifs_repair-tests/Makemodule.am @@ -0,0 +1,2 @@ +test_SCRIPTS += \ + tests/ubifs_repair-tests/lib/common.sh diff --git a/tests/ubifs_repair-tests/lib/common.sh.in b/tests/ubifs_repair-tests/lib/common.sh.in new file mode 100755 index 0000000..656b609 --- /dev/null +++ b/tests/ubifs_repair-tests/lib/common.sh.in @@ -0,0 +1,347 @@ +#!/bin/sh +# Copyright (c), 2023-2024, Huawei Technologies Co, Ltd. +# Author: Zhihao Cheng +# +# Provide basic functions. +# Notice, all loaded modules(mtdram/nandsim/ubi/ubifs) won't be removed +# if errors occur, it is useful to debug on problem ubifs image. + +UBI_NUM=0 +DEV=/dev/ubi0_0 +MNT=/mnt/test_file_system +TMP_FILE=/tmp/ubi_test_file +KEY_FILE=/tmp/key +nandsim_patt="NAND simulator" +mtdram_patt="mtdram test device" + +function fatal() +{ + echo "Error: $1" 1>&2 + exit 1 +} + +function cleanup_handler() +{ + local ret="$1" + + # Below is magic to exit with correct exit code + if [ "$ret" == "0" ]; then + umount $MNT >/dev/null 2>&1 ||: + modprobe -r ubifs >/dev/null 2>&1 ||: + modprobe -r ubi >/dev/null 2>&1 ||: + modprobe -r nandsim >/dev/null 2>&1 ||: + modprobe -r mtdram >/dev/null 2>&1 ||: + exit 0 + else + exit 1 + fi +} +trap 'cleanup_handler $?' EXIT +trap 'cleanup_handler 1' HUP PIPE INT QUIT TERM + +function find_mtd_device() +{ + printf "%s" "$(grep "$1" /proc/mtd | sed -e "s/^mtd\([0-9]\+\):.*$/\1/")" +} + +function powercut() +{ + dmesg -c > /dev/null + echo 1 > /sys/kernel/debug/ubifs/tst_recovery; + while true; + do + msg=`dmesg -c | grep "Power cut emulated"`; + if [[ "$msg" != "" ]]; + then + break; + fi + done + echo 0 > /sys/kernel/debug/ubifs/tst_recovery +} + +# Load mtdram with specified size and PEB size +# Usage: load_mtdram +# 1. Flash size is specified in MiB +# 2. PEB size is specified in KiB +function load_mtdram() +{ + local size="$1"; shift + local peb_size="$1"; shift + + size="$(($size * 1024))" + modprobe mtdram total_size="$size" erase_size="$peb_size" +} + +function check_fsstress() +{ + cmd=`fsstress | grep "op_name"` + if ! [[ "$cmd" =~ "op_name" ]]; then + fatal "fsstress is not found" + fi +} + +# Check error messages +function check_err_msg() +{ + msg=`dmesg | grep -E "dump_stack|UBIFS error|switched to read-only mode"`; + if [[ "$msg" != "" ]] + then + dmesg + fatal "error message detected!" + fi + dmesg -c > /dev/null +} + +# Check memleak +function check_memleak() +{ + # CONFIG_DEBUG_KMEMLEAK=y + if ! [ -f /sys/kernel/debug/kmemleak ]; then + echo "kmemleak is not enabled, skip checking" + return; + fi + + echo scan > /sys/kernel/debug/kmemleak + memleak=`cat /sys/kernel/debug/kmemleak` + if [[ "$memleak" != "" ]]; then + echo $memleak + fatal "kmemleak detected!" + fi +} + +# Iterate all files under certain dir +# $1: dir +# $2: "md5sum" means that need record md5 for regular file, otherwise don't record md5 for regular file +function read_dir() { + for file in `ls -a $1` + do + cur_f=$1"/"$file + if [ -b $cur_f ] + then + major=`stat -c %t $cur_f` + minor=`stat -c %T $cur_f` + echo "block $cur_f $major $minor" >> $TMP_FILE + elif [ -c $cur_f ] + then + major=`stat -c %t $cur_f` + minor=`stat -c %T $cur_f` + echo "char $cur_f $major $minor" >> $TMP_FILE + elif [ -L $cur_f ] + then + link=`stat -c %N $cur_f` + echo "symlink $cur_f $link" >> $TMP_FILE + elif [ -S $cur_f ] + then + echo "sock $cur_f" >> $TMP_FILE + elif [ -p $cur_f ] + then + echo "fifo $cur_f" >> $TMP_FILE + elif [ -f $cur_f ] + then + sz=`stat -c %s $cur_f` + if [[ "$2" != "md5sum" ]]; then + echo "reg $cur_f $sz" >> $TMP_FILE + else + md5=`md5sum $cur_f | awk '{print $1}'` + echo "reg $cur_f $md5 $sz" >> $TMP_FILE + fi + elif [ -d $cur_f ] + then + if [[ $file != '.' && $file != '..' ]] + then + echo "dir $cur_f" >> $TMP_FILE + read_dir $1"/"$file $2 + fi + else + fatal "record unknown file type $cur_f" + fi + done +} + +# Check whether there are files lost after repairing UBIFS +# $1: "md5sum" means need record md5 for regular file, otherwise don't record md5 for regular file +function parse_dir() +{ + while read line + do + array=(${line//\ / }); + f_type=${array[0]}; + cur_f=${array[1]}; + cur_info="" + if [[ "$f_type" =~ "block" ]] + then + major=`stat -c %t $cur_f` + minor=`stat -c %T $cur_f` + cur_info="block $cur_f $major $minor" + elif [[ "$f_type" =~ "char" ]] + then + major=`stat -c %t $cur_f` + minor=`stat -c %T $cur_f` + cur_info="char $cur_f $major $minor" + elif [[ "$f_type" =~ "symlink" ]] + then + link=`stat -c %N $cur_f` + cur_info="symlink $cur_f $link" + elif [[ "$f_type" =~ "sock" ]] + then + cur_info="sock $cur_f" + elif [[ "$f_type" =~ "fifo" ]] + then + cur_info="fifo $cur_f" + elif [[ "$f_type" =~ "reg" ]] + then + sz=`stat -c %s $cur_f` + if [[ "$1" != "md5sum" ]]; then + cur_info="reg $cur_f $sz" + else + md5=`md5sum $cur_f | awk '{print $1}'` + cur_info="reg $cur_f $md5 $sz" + fi + elif [[ "$f_type" =~ "dir" ]] + then + cur_info="dir $cur_f" + else + fatal "parse unknown file type $cur_f" + fi + if [[ "$cur_info" != "$line" ]] + then + fatal "current info $cur_info, but expect $line" + fi + done < $TMP_FILE +} + +function authentication() +{ + keyctl clear @s + res=$? + if [[ $res != 0 ]]; then + fatal "keyctl is not found" + fi + keyctl add logon ubifs:foo 12345678901234567890123456789012 @s +} + +function encryption_gen_key() +{ + # CONFIG_FS_ENCRYPTION=y + head -c 64 /dev/urandom > $KEY_FILE + cmd=`fscryptctl -h | grep "set_policy"` + if ! [[ "$cmd" =~ "set_policy" ]]; then + fatal "fscryptctl is not found" + fi +} + +function encryption_set_key() +{ + mnt=$1 + # https://github.com/google/fscryptctl + key=$(fscryptctl add_key $mnt < $KEY_FILE) + fscryptctl set_policy $key $mnt + #fscryptctl get_policy $mnt + ret=$? + if [[ $ret != 0 ]]; then + fatal "set encryption policy failed" + fi +} + +function mount_ubifs() +{ + dev=$1 + mnt=$2 + auth=$3 + if [[ "$auth" == "authentication" ]]; then + authentication + mount -t ubifs -o auth_key=ubifs:foo,auth_hash_name=sha256 $dev $mnt + else + mount -t ubifs $dev $mnt + fi +} + +function enable_chkfs() +{ + echo 1 > /sys/kernel/debug/ubifs/chk_fs + echo 1 > /sys/kernel/debug/ubifs/chk_general + echo 1 > /sys/kernel/debug/ubifs/chk_index + echo 1 > /sys/kernel/debug/ubifs/chk_lprops + echo 1 > /sys/kernel/debug/ubifs/chk_orphans +} + +function disable_chkfs() +{ + echo 0 > /sys/kernel/debug/ubifs/chk_fs + echo 0 > /sys/kernel/debug/ubifs/chk_general + echo 0 > /sys/kernel/debug/ubifs/chk_index + echo 0 > /sys/kernel/debug/ubifs/chk_lprops + echo 0 > /sys/kernel/debug/ubifs/chk_orphans +} + +function inject_mem_err() +{ + # CONFIG_FAILSLAB=y + # CONFIG_FAIL_PAGE_ALLOC=y + local pid=$1; + + if ! [ -f /sys/kernel/debug/failslab/probability ]; then + fatal "failslab is not enabled, injection failed" + fi + if ! [ -f /sys/kernel/debug/fail_page_alloc/probability ]; then + fatal "fail_page_alloc is not enabled, injection failed" + fi + + echo 1 > /proc/$pid/make-it-fail + + echo Y > /sys/kernel/debug/failslab/task-filter + echo 1 > /sys/kernel/debug/failslab/probability # 1% failure + echo 10000 > /sys/kernel/debug/failslab/times + echo 1 > /sys/kernel/debug/failslab/verbose + echo N > /sys/kernel/debug/failslab/ignore-gfp-wait + + echo Y > /sys/kernel/debug/fail_page_alloc/task-filter + echo 1 > /sys/kernel/debug/fail_page_alloc/probability + echo 10000 > /sys/kernel/debug/fail_page_alloc/times + echo 0 > /sys/kernel/debug/fail_page_alloc/verbose + echo N > /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait +} + +function cancel_mem_err() +{ + echo 0 > /sys/kernel/debug/failslab/probability + echo 0 > /sys/kernel/debug/failslab/times + echo 0 > /sys/kernel/debug/failslab/verbose + echo N > /sys/kernel/debug/failslab/task-filter + echo Y > /sys/kernel/debug/failslab/ignore-gfp-wait + + echo 0 > /sys/kernel/debug/fail_page_alloc/probability + echo 0 > /sys/kernel/debug/fail_page_alloc/times + echo 1 > /sys/kernel/debug/fail_page_alloc/verbose + echo N > /sys/kernel/debug/fail_page_alloc/task-filter + echo Y > /sys/kernel/debug/fail_page_alloc/ignore-gfp-wait +} + +function inject_io_err() +{ + if ! [ -f /sys/kernel/debug/ubi/ubi$UBI_NUM/tst_emulate_io_failures ]; then + fatal "tst_emulate_io_failures is not enabled, skip injection" + fi + + echo 1 > /sys/kernel/debug/ubi/ubi$UBI_NUM/tst_emulate_io_failures +} + +function cancel_io_err() +{ + echo 0 > /sys/kernel/debug/ubi/ubi$UBI_NUM/tst_emulate_io_failures +} + +sysctl -w kernel.panic_on_warn=1 +sysctl -w kernel.panic_on_oops=1 + +if ! [ -d $MNT ]; then + mkdir -p $MNT +fi + +modprobe ubi || fatal "common.sh: cannot load ubi" +modprobe ubifs || fatal "common.sh: cannot load ubifs" +if ! [ -f /sys/kernel/debug/ubifs/repair_fs ]; then + fatal "common.sh: ubifs_repair is not supported" +fi +modprobe -r ubifs +modprobe -r ubi From patchwork Thu Dec 28 01:36:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 183600 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1755884dyb; Wed, 27 Dec 2023 17:34:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IHyksbxd/UIfs00lJTsprk3a6OME6whcD6kg3hpC0IiDr55TM7UlBJs73uYYNILhIohREnb X-Received: by 2002:a05:620a:260a:b0:781:1e52:11de with SMTP id z10-20020a05620a260a00b007811e5211demr12266949qko.151.1703727273311; Wed, 27 Dec 2023 17:34:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727273; cv=none; d=google.com; s=arc-20160816; b=xoUmtAINwBTB3xriM+oFO5VjeltDbD09+9YXnnAGoijdlWLFxqTRzMffPnBmY0qy9a 2tYSDfRzooNKYmc9NDOZhPEMySPxeWVlp0DJpAeKfpS8CNMuGOc7zKaCVqp8JjZR/HxM C1DjpWMPVD+nQcJw8JWtqI7W3LWueTQN6LPdCjKxrHygcBu7P+CMWmGXHX+KgQT9Fr2i lL6KakIsKXayiAB2Ult5a3VujAxej6uDMq3svBf1LUv7/MHHqeiNeHxRiMAaoX31u2ak wZ80l216Ld23LrOOAFnPYjBqkTkYpPG7x2rIcNRkQTcPEsvDJe71PAZ728yHLOD/0IGl JNhw== 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=RgvoDHwCUzB938jHwVHI4JctAo8UoU+lI6d4A2uRNyQ=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=P9Dnbhuau7wc4DYkyMAvATtiWCrGF3pd4q/3YAw/M7McyeLlKzYxle+SN1l/8/SaKe kHD8pKQeeoiQfavgxgni1+OlWST/70DjDOXy1ijnkSTEIBgPk3itg46blB3wr9HSsA/1 Fc4ye5CLcRT7OXHbLstITuL9u1VxdAr7qq7oBZZN7tgM6WjQa62gfRUN7nSOdn79hXwk Oll1vqGAzaFcZB5ZcJscoQgM9qJ4NHcAydsO9AZJYr0eWbnQ5IigkomMl2Nf1tPRWW2t nTdFDAgO4+ZbnAfFZyTxi3HV5k2p0kK3Gm3cRjIlAiedilFwIVKp56fuiDTU1q7zzC53 flrg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12337-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12337-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id vu28-20020a05620a561c00b00781330cafb3si11043658qkn.25.2023.12.27.17.34.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:34:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12337-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12337-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12337-ouuuleilei=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 ny.mirrors.kernel.org (Postfix) with ESMTPS id 20BA31C21048 for ; Thu, 28 Dec 2023 01:34:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6FD7B469D; Thu, 28 Dec 2023 01:33:46 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) (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 D8D2310E5 for ; Thu, 28 Dec 2023 01:33:41 +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.163.252]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4T0rcQ6SDTzMprQ; Thu, 28 Dec 2023 09:33:10 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 27DF6180075; Thu, 28 Dec 2023 09:33:34 +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:33 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 02/11] tests: ubifs_repair: Add authentication refusing test Date: Thu, 28 Dec 2023 09:36:30 +0800 Message-ID: <20231228013639.2827205-3-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487528986058931 X-GMAIL-MSGID: 1786487528986058931 Authenticated UBIFS image is not support for UBIFS repair, add testcase to check that. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + configure.ac | 3 +- tests/ubifs_repair-tests/Makemodule.am | 3 +- .../tests/authentication_refuse.sh.in | 69 ++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100755 tests/ubifs_repair-tests/tests/authentication_refuse.sh.in diff --git a/.gitignore b/.gitignore index c811883..7613349 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,7 @@ tests/fs-tests/stress/fs_stress01.sh tests/ubi-tests/runubitests.sh tests/ubi-tests/ubi-stress-test.sh tests/ubifs_repair-tests/lib/common.sh +tests/ubifs_repair-tests/tests/authentication_refuse.sh # # Files generated by autotools diff --git a/configure.ac b/configure.ac index d3d3589..a42a55d 100644 --- a/configure.ac +++ b/configure.ac @@ -355,6 +355,7 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh tests/fs-tests/stress/fs_stress01.sh tests/ubi-tests/runubitests.sh tests/ubi-tests/ubi-stress-test.sh - tests/ubifs_repair-tests/lib/common.sh]) + tests/ubifs_repair-tests/lib/common.sh + tests/ubifs_repair-tests/tests/authentication_refuse.sh]) AC_OUTPUT([Makefile]) diff --git a/tests/ubifs_repair-tests/Makemodule.am b/tests/ubifs_repair-tests/Makemodule.am index caa503d..c0a6ea1 100644 --- a/tests/ubifs_repair-tests/Makemodule.am +++ b/tests/ubifs_repair-tests/Makemodule.am @@ -1,2 +1,3 @@ test_SCRIPTS += \ - tests/ubifs_repair-tests/lib/common.sh + tests/ubifs_repair-tests/lib/common.sh \ + tests/ubifs_repair-tests/tests/authentication_refuse.sh diff --git a/tests/ubifs_repair-tests/tests/authentication_refuse.sh.in b/tests/ubifs_repair-tests/tests/authentication_refuse.sh.in new file mode 100755 index 0000000..b322121 --- /dev/null +++ b/tests/ubifs_repair-tests/tests/authentication_refuse.sh.in @@ -0,0 +1,69 @@ +#!/bin/sh +# Copyright (c), 2023-2024, Huawei Technologies Co, Ltd. +# Author: Zhihao Cheng +# +# Test Description: +# Refuse repairing authenticated UBIFS image +# Running time: 10s + +TESTBINDIR=@TESTBINDIR@ +source $TESTBINDIR/common.sh + +ID="0xec,0xa1,0x00,0x15" # 128M 128KB 2KB 512-sub-page + +function run_test() +{ + echo "Do authentication_refused test" + + modprobe nandsim id_bytes=$ID + mtdnum="$(find_mtd_device "$nandsim_patt")" + flash_eraseall /dev/mtd$mtdnum + + modprobe ubi mtd="$mtdnum,2048,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 "authentication" || fatal "mount ubifs failed" + fsstress -d $MNT/fsstress -l0 -p4 -n10000 & + sleep $((RANDOM % 5)) + + 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 + + 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 + fatal "repair should not be success!" + fi + + check_memleak + + modprobe -r ubifs + modprobe -r ubi + modprobe -r nandsim +} + +start_t=$(date +%s) +run_test +end_t=$(date +%s) +time_cost=$(( end_t - start_t )) +echo "Success, cost $time_cost seconds" +exit 0 From patchwork Thu Dec 28 01:36:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 183602 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1756010dyb; Wed, 27 Dec 2023 17:35:01 -0800 (PST) X-Google-Smtp-Source: AGHT+IEUCZOxHVAiUwKGh0s8R8Aq1a2HrVjvU4uOdHhyglWoF6WdU5QMvyfcq3bkFWMCxgMJHsuF X-Received: by 2002:a17:903:120a:b0:1d4:85a8:5f6 with SMTP id l10-20020a170903120a00b001d485a805f6mr1168292plh.108.1703727301461; Wed, 27 Dec 2023 17:35:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727301; cv=none; d=google.com; s=arc-20160816; b=SDmNYmYIHZcFJmma3kd4uH+4RhdAIuhXTRBlP7Sq/CZFlFhs3MU9RgWEZfWUAEOHej kn+HwgUtNtCz8eP8FOWtkscEF+7M+SBLf8OGMmernKwQ4oy2Hzgre3KH8ySX93qJzb3S ckvJH/9b4vK5VXTrVDXKvIQjRYt8Erqx9CEzp6XhI0m3OPSA2Va6oajvFKprRCANqyHU VCxiixy2mTBkyzW0zvGM4l2DKmel/RS8v5T7HyaJIngjHuIwFeXHCHwKsmDUrO+FjQWE Q/Qlam1nS0EyA8TDZiCNgAJwFuDppell3RqMd6bOPUj4+ELUg8Fc6SI8oSlUCixhOGgQ AEQQ== 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=9ZNvxyKSjkZvRcksHFuuB6Ai063/O3sWmyjt3fNx1AY=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=MpkzoMqpQ+CBdlURV+UhRyHAeFBm778BMOdq5vzrgiLWoOJ6PX6eloBwHjxgfFLfU8 vI97K4Sy/QW++SVQapdAwJA8UR5B1IYQ6t7YyOuTQyCx6knEadCIGg7iZjWegyRmxquq 4bUF5fK+xTMrZrJ11s7raUw0Hcs1GBohc0qkxij88u4qbf431IH3UPyPgmEmlSkJai+4 YM0sPOIn14ogpVNNhSS/ss+/jJwJOjvgW02pStuv96xIvHG/6HlO90HBdvXm2WmlAMtD DW9QFhlu8K7r/mXo9WYwYCTcb8vLR14G+mDGx2E8wUc3ORzrOzKElYXjrAqIXN4f4FE8 a+gA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12340-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12340-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id l2-20020a170902f68200b001d43ebbd741si7687700plg.387.2023.12.27.17.35.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:35:01 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12340-ouuuleilei=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-12340-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12340-ouuuleilei=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 5B65F283A06 for ; Thu, 28 Dec 2023 01:34:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 856C163C5; Thu, 28 Dec 2023 01:33:48 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (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 1192710F2 for ; Thu, 28 Dec 2023 01:33:43 +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.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4T0rXR3vnZz1FGHJ; Thu, 28 Dec 2023 09:29:43 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 764441A0172; Thu, 28 Dec 2023 09:33:35 +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:34 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 04/11] tests: ubifs_repair: Add powercut+repair+mount test Date: Thu, 28 Dec 2023 09:36:32 +0800 Message-ID: <20231228013639.2827205-5-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487558545176956 X-GMAIL-MSGID: 1786487558545176956 Inject powercut while doing fsstress on mounted UBIFS for kinds of flashes (eg. nand, nor). This testcase mainly makes sure that ubifs_repair can make UBIFS image be consistent on different flashes (eg. nand, nor). Because the min_io_size of nor flash is 1, the UBIFS image on nor flash will be different from nand flash after doing powercut, so we need make sure ubifs_repair can handle these two types of flash. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + configure.ac | 3 +- tests/ubifs_repair-tests/Makemodule.am | 3 +- .../tests/powercut_repair_mount.sh.in | 138 +++++++++++++++++++++ 4 files changed, 143 insertions(+), 2 deletions(-) create mode 100755 tests/ubifs_repair-tests/tests/powercut_repair_mount.sh.in diff --git a/.gitignore b/.gitignore index 1a5fe7e..d47282c 100644 --- a/.gitignore +++ b/.gitignore @@ -115,6 +115,7 @@ tests/ubi-tests/ubi-stress-test.sh tests/ubifs_repair-tests/lib/common.sh tests/ubifs_repair-tests/tests/authentication_refuse.sh tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh +tests/ubifs_repair-tests/tests/powercut_repair_mount.sh # # Files generated by autotools diff --git a/configure.ac b/configure.ac index 73a3853..349e4ad 100644 --- a/configure.ac +++ b/configure.ac @@ -357,6 +357,7 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh tests/ubi-tests/ubi-stress-test.sh tests/ubifs_repair-tests/lib/common.sh tests/ubifs_repair-tests/tests/authentication_refuse.sh - tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh]) + tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh + tests/ubifs_repair-tests/tests/powercut_repair_mount.sh]) AC_OUTPUT([Makefile]) diff --git a/tests/ubifs_repair-tests/Makemodule.am b/tests/ubifs_repair-tests/Makemodule.am index c2556f5..92f288a 100644 --- a/tests/ubifs_repair-tests/Makemodule.am +++ b/tests/ubifs_repair-tests/Makemodule.am @@ -1,4 +1,5 @@ test_SCRIPTS += \ tests/ubifs_repair-tests/lib/common.sh \ tests/ubifs_repair-tests/tests/authentication_refuse.sh \ - tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh + tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh \ + tests/ubifs_repair-tests/tests/powercut_repair_mount.sh diff --git a/tests/ubifs_repair-tests/tests/powercut_repair_mount.sh.in b/tests/ubifs_repair-tests/tests/powercut_repair_mount.sh.in new file mode 100755 index 0000000..a5c7da6 --- /dev/null +++ b/tests/ubifs_repair-tests/tests/powercut_repair_mount.sh.in @@ -0,0 +1,138 @@ +#!/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 & powercut & unmount +# 3. repair 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}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 & + sleep $((RANDOM % 120)) + 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 + + 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 + fatal "repair fail $res" + fi + + check_memleak + + dmesg -c > /dev/null # powercut and repairing 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 + + umount $MNT + res=$? + if [[ $res != 0 ]] + then + fatal "unmount fail $res" + fi + + check_err_msg + + modprobe -r ubifs + modprobe -r ubi + modprobe -r $simulator + + echo "----------------------------------------------------------------------" +} + +check_fsstress +start_t=$(date +%s) +echo "Do powercut+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 From patchwork Thu Dec 28 01:36:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 183603 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1756332dyb; Wed, 27 Dec 2023 17:36:07 -0800 (PST) X-Google-Smtp-Source: AGHT+IEcvMxzijGiPuk2mC/MxSezW3QAUsMKDIpZdxSJqob2CxPKmPHtOKcUetN3whZJqwytLnDq X-Received: by 2002:a17:903:48f:b0:1d3:efc2:827 with SMTP id jj15-20020a170903048f00b001d3efc20827mr10987804plb.12.1703727367101; Wed, 27 Dec 2023 17:36:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727367; cv=none; d=google.com; s=arc-20160816; b=pzHMnH1CleBoPA9xmNgyyoAxsffjvNc0YvEeKnXKxXfopjJanIbgXCc4ElGl7OpUTL K1+24X57dQW/BQWpkFelyaM/DAi+x84lfX++QKtQj38Ke7qgob6v8I5oUXGOmWwGzzHS qBfPe4kxjymazIkBRINnLN0nFKlJOdtOaHXP/IfZzAdDl+PnOEEHePDfi+o+wdC/TpLn B9hbLC/3BwKrHItOiJkYH1OqXQajz9wJxSR7jv3inxolzAaZamdye4jDDZZJudSk3BU/ Ov7FYTI5h62lBKjmcfdvVWdSEZUQwvcNOsa5L9+y8S1ZjYnzD1nGujs2k4ZXWttNWaA4 XSSQ== 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=5+9S8JPBTH/o+pOCb8SfLzndKZqj115mLhl+AJsmArg=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=tpnJ7mY1EegPPJKhI+kHCQeg0DspUaPCoxqJpkZvhr1YEA7GVPZQZxqBmlSJVSbAev CIjfZmhDeZJX92JQ5e6yZypi0qJCxaFjk7eeVTSI6bOhPD5ZTO37eP7rtpBcoHpNkSm0 itCrk7k0xEw6dDH8JrzJMHtVWwvdok793/geEEJfeIlxBaicvAScQflrsShBjek1njFj 9xEGRuULD89JJuQSW8iXyz0ScxmhuaBGS0D9WjXefi2ewRRNep2ZWDfNEtCxf2YLkZLU JvXNUWbCI0DVelwXI0QaN2NB1+qxbwziKqnS4a3zRLRi9zvQzzDLn8YzNRRjpVF423uv nUrQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12345-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12345-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id t20-20020a1709028c9400b001d4152a6177si10350690plo.112.2023.12.27.17.36.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:36:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12345-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12345-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12345-ouuuleilei=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 2ECC0281709 for ; Thu, 28 Dec 2023 01:36:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 972AC5244; Thu, 28 Dec 2023 01:35:00 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) (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 DA31410E5 for ; Thu, 28 Dec 2023 01:34:44 +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 szxga06-in.huawei.com (SkyGuard) with ESMTP id 4T0rdt0vwyz1vqLt; Thu, 28 Dec 2023 09:34:26 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 482541A0198; Thu, 28 Dec 2023 09:34:21 +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:37 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 08/11] tests: ubifs_repair: Add corrupted images Date: Thu, 28 Dec 2023 09:36:36 +0800 Message-ID: <20231228013639.2827205-9-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487627489855723 X-GMAIL-MSGID: 1786487627489855723 This is a preparation for adding repairing testcase. There is no debugfs tools (for example: debugfs[ext4], xfs_db) for UBIFS, so no way to inject precise corruption into UBIFS image, we have to prepare inconsistent UBIFS images in advance like e2fsprogs[1] does. (Goto [2] to see how to generate inconsistent UBIFS images). Here's a descriptons of the various test images: ========================================================================= image | Description | expectancy ------------------------------------------------------------------------- good | good image contains | repair success, fs content is | kinds of files. | not changed. ------------------------------------------------------------------------- sb_fanout | invalid fanout in | repair failed. | superblock. | ------------------------------------------------------------------------- sb_fmt_version | invalid fmt_version | repair failed. | in superblock. | ------------------------------------------------------------------------- sb_leb_size | invalid leb_size in | repair failed. | superblock. | ------------------------------------------------------------------------- sb_log_lebs | invalid log lebs in | repair failed. | superblock. | ------------------------------------------------------------------------- sb_min_io_size | invalid min_io_size | repair failed. | in superblock. | ------------------------------------------------------------------------- master_highest_inum | invalid highest_inum| repair success, fs content is | in master nodes. | not changed. ------------------------------------------------------------------------- master_lpt | bad lpt pos in | repair success, fs content is | master nodes. | not changed. ------------------------------------------------------------------------- master_tnc | bad tnc pos in | repair success, fs content is | master nodes. | not changed. ------------------------------------------------------------------------- master_total_dead | bad total_dead in | repair success, fs content is | master nodes. | not changed. ------------------------------------------------------------------------- master_total_dirty | bad total_dirty in | repair success, fs content is | master nodes. | not changed. ------------------------------------------------------------------------- master_total_free | bad total_free in | repair success, fs content is | master nodes. | not changed. ------------------------------------------------------------------------- log | corrupted log area. | repair success, fs content is | | not changed. ------------------------------------------------------------------------- lpt_dirty | bad dirty in pnode. | repair success, fs content is | | not changed. ------------------------------------------------------------------------- lpt_flags | bad flags in pnode | repair success, fs content is | (eg. index). | not changed. ------------------------------------------------------------------------- lpt_free | bad free in pnode. | repair success, fs content is | | not changed. ------------------------------------------------------------------------- lpt_pos | bad pos in nnode. | repair success, fs content is | | not changed. ------------------------------------------------------------------------- tnc_lv0_key | bad key in lv0 | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- tnc_lv0_len | bad len in lv0 | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- tnc_lv0_pos | bad pos in lv0 | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- tnc_noleaf_key | bad key in non-leaf | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- tnc_noleaf_len | bad len in non-leaf | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- tnc_noleaf_pos | bad pos in non-leaf | repair success, fs content is | znode. | not changed. ------------------------------------------------------------------------- inode_data | bad data node. | repair success, file content | | is changed, other files are | | not changed. ------------------------------------------------------------------------- inode_mode | bad inode mode for | repair success, soft link | solf link file. | file is dropped, other files | | are not changed. ------------------------------------------------------------------------- inode_nlink | wrong nlink for | repair success, nlink is | file. | corrected, fs content is not | | changed. ------------------------------------------------------------------------- inode_size | wrong inode size | repair success, inode size is | for file. | corrected, fs content is not | | changed. ------------------------------------------------------------------------- inode_xcnt | wrong inode | repair success, xattr_cnt is | xattr_cnt for file. | corrected, fs content is not | | changed. ------------------------------------------------------------------------- soft_link_data_len | bad inode data_len | repair success, soft link | for solt link file. | file is dropped, other files | | are not changed. ------------------------------------------------------------------------- dentry_key | bad dentry key for | repair success, dentry is | file. | removed, other files are | | not changed. ------------------------------------------------------------------------- dentry_nlen | inconsistent nlen | repair success, dentry is | and name in dentry | removed, other files are | for file. | not changed. ------------------------------------------------------------------------- dentry_type | inconsistent type | repair success, dentry is | between dentry and | removed, other files are | inode for file. | not changed. ------------------------------------------------------------------------- xinode_flags | lost UBIFS_XATTR_FL | repair success, xattr is | in xattr inode | removed, other files are | flags for file. | not changed. ------------------------------------------------------------------------- xinode_key | bad xattr inode key | repair success, xattr is | for file. | removed, other files are | | not changed. ------------------------------------------------------------------------- xinode_mode | bad xattr inode | repair success, xattr is | mode for file. | removed, other files are | | not changed. ------------------------------------------------------------------------- xentry_key | bad xattr entry key | repair success, xattr is | for file. | removed, other files are | | not changed. ------------------------------------------------------------------------- xentry_nlen | inconsistent nlen | repair success, xattr is | and name in xattr | removed, other files are | entry for file. | not changed. ------------------------------------------------------------------------- xentry_type | inconsistent type | repair success, xattr is | between xattr entry | removed, other files are | and xattr inode for | not changed. | file. | ------------------------------------------------------------------------- dir_lost | bad dentry for dir. | repair success, dir and files | | under dir are removed, other | | files are not changed. ------------------------------------------------------------------------- root_dir | bad '/'. | repair success, create new | | root dir('/'). ========================================================================= [1] https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/tests/README [2] https://bugzilla.kernel.org/show_bug.cgi?id=218327 Signed-off-by: Zhihao Cheng Signed-off-by: Zhihao Cheng --- Makefile.am | 1 + tests/ubifs_repair-tests/Makemodule.am | 42 +++++++++++++++++++++ tests/ubifs_repair-tests/images/dentry_key.gz | Bin 0 -> 5377 bytes tests/ubifs_repair-tests/images/dentry_nlen.gz | Bin 0 -> 5386 bytes tests/ubifs_repair-tests/images/dentry_type.gz | Bin 0 -> 5384 bytes tests/ubifs_repair-tests/images/dir_lost.gz | Bin 0 -> 5381 bytes tests/ubifs_repair-tests/images/good.gz | Bin 0 -> 5251 bytes tests/ubifs_repair-tests/images/inode_data.gz | Bin 0 -> 5297 bytes tests/ubifs_repair-tests/images/inode_mode.gz | Bin 0 -> 5383 bytes tests/ubifs_repair-tests/images/inode_nlink.gz | Bin 0 -> 5383 bytes tests/ubifs_repair-tests/images/inode_size.gz | Bin 0 -> 5384 bytes tests/ubifs_repair-tests/images/inode_xcnt.gz | Bin 0 -> 5388 bytes tests/ubifs_repair-tests/images/log.gz | Bin 0 -> 5232 bytes tests/ubifs_repair-tests/images/lpt_dirty.gz | Bin 0 -> 5360 bytes tests/ubifs_repair-tests/images/lpt_flags.gz | Bin 0 -> 5361 bytes tests/ubifs_repair-tests/images/lpt_free.gz | Bin 0 -> 5350 bytes tests/ubifs_repair-tests/images/lpt_pos.gz | Bin 0 -> 5374 bytes .../images/master_highest_inum.gz | Bin 0 -> 5034 bytes tests/ubifs_repair-tests/images/master_lpt.gz | Bin 0 -> 5035 bytes tests/ubifs_repair-tests/images/master_tnc.gz | Bin 0 -> 5024 bytes .../ubifs_repair-tests/images/master_total_dead.gz | Bin 0 -> 5033 bytes .../images/master_total_dirty.gz | Bin 0 -> 5032 bytes .../ubifs_repair-tests/images/master_total_free.gz | Bin 0 -> 5030 bytes tests/ubifs_repair-tests/images/root_dir.gz | Bin 0 -> 1298 bytes tests/ubifs_repair-tests/images/sb_fanout.gz | Bin 0 -> 5322 bytes tests/ubifs_repair-tests/images/sb_fmt_version.gz | Bin 0 -> 5326 bytes tests/ubifs_repair-tests/images/sb_leb_size.gz | Bin 0 -> 5324 bytes tests/ubifs_repair-tests/images/sb_log_lebs.gz | Bin 0 -> 5323 bytes tests/ubifs_repair-tests/images/sb_min_io_size.gz | Bin 0 -> 5328 bytes .../images/soft_link_data_len.gz | Bin 0 -> 5389 bytes tests/ubifs_repair-tests/images/tnc_lv0_key.gz | Bin 0 -> 5414 bytes tests/ubifs_repair-tests/images/tnc_lv0_len.gz | Bin 0 -> 5420 bytes tests/ubifs_repair-tests/images/tnc_lv0_pos.gz | Bin 0 -> 5404 bytes tests/ubifs_repair-tests/images/tnc_noleaf_key.gz | Bin 0 -> 5430 bytes tests/ubifs_repair-tests/images/tnc_noleaf_len.gz | Bin 0 -> 5437 bytes tests/ubifs_repair-tests/images/tnc_noleaf_pos.gz | Bin 0 -> 5418 bytes tests/ubifs_repair-tests/images/xentry_key.gz | Bin 0 -> 5378 bytes tests/ubifs_repair-tests/images/xentry_nlen.gz | Bin 0 -> 5386 bytes tests/ubifs_repair-tests/images/xentry_type.gz | Bin 0 -> 5386 bytes tests/ubifs_repair-tests/images/xinode_flags.gz | Bin 0 -> 5384 bytes tests/ubifs_repair-tests/images/xinode_key.gz | Bin 0 -> 5383 bytes tests/ubifs_repair-tests/images/xinode_mode.gz | Bin 0 -> 5386 bytes 42 files changed, 43 insertions(+) create mode 100644 tests/ubifs_repair-tests/images/dentry_key.gz create mode 100644 tests/ubifs_repair-tests/images/dentry_nlen.gz create mode 100644 tests/ubifs_repair-tests/images/dentry_type.gz create mode 100644 tests/ubifs_repair-tests/images/dir_lost.gz create mode 100644 tests/ubifs_repair-tests/images/good.gz create mode 100644 tests/ubifs_repair-tests/images/inode_data.gz create mode 100644 tests/ubifs_repair-tests/images/inode_mode.gz create mode 100644 tests/ubifs_repair-tests/images/inode_nlink.gz create mode 100644 tests/ubifs_repair-tests/images/inode_size.gz create mode 100644 tests/ubifs_repair-tests/images/inode_xcnt.gz create mode 100644 tests/ubifs_repair-tests/images/log.gz create mode 100644 tests/ubifs_repair-tests/images/lpt_dirty.gz create mode 100644 tests/ubifs_repair-tests/images/lpt_flags.gz create mode 100644 tests/ubifs_repair-tests/images/lpt_free.gz create mode 100644 tests/ubifs_repair-tests/images/lpt_pos.gz create mode 100644 tests/ubifs_repair-tests/images/master_highest_inum.gz create mode 100644 tests/ubifs_repair-tests/images/master_lpt.gz create mode 100644 tests/ubifs_repair-tests/images/master_tnc.gz create mode 100644 tests/ubifs_repair-tests/images/master_total_dead.gz create mode 100644 tests/ubifs_repair-tests/images/master_total_dirty.gz create mode 100644 tests/ubifs_repair-tests/images/master_total_free.gz create mode 100644 tests/ubifs_repair-tests/images/root_dir.gz create mode 100644 tests/ubifs_repair-tests/images/sb_fanout.gz create mode 100644 tests/ubifs_repair-tests/images/sb_fmt_version.gz create mode 100644 tests/ubifs_repair-tests/images/sb_leb_size.gz create mode 100644 tests/ubifs_repair-tests/images/sb_log_lebs.gz create mode 100644 tests/ubifs_repair-tests/images/sb_min_io_size.gz create mode 100644 tests/ubifs_repair-tests/images/soft_link_data_len.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_lv0_key.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_lv0_len.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_lv0_pos.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_noleaf_key.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_noleaf_len.gz create mode 100644 tests/ubifs_repair-tests/images/tnc_noleaf_pos.gz create mode 100644 tests/ubifs_repair-tests/images/xentry_key.gz create mode 100644 tests/ubifs_repair-tests/images/xentry_nlen.gz create mode 100644 tests/ubifs_repair-tests/images/xentry_type.gz create mode 100644 tests/ubifs_repair-tests/images/xinode_flags.gz create mode 100644 tests/ubifs_repair-tests/images/xinode_key.gz create mode 100644 tests/ubifs_repair-tests/images/xinode_mode.gz new file mode 100644 index 0000000000000000000000000000000000000000..9acd3ecc4e1c1416a91ab0896331f33e6fbab2c6 GIT binary patch literal 5386 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 literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..1d020b718953ef13ca800b503b17d154c2e1a237 GIT binary patch literal 5360 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 D4=A_J literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..31c46a0f6277f96a0b04c362c1fb84442333f5e7 GIT binary patch literal 5350 zcmcgwXH=8h($>pSP()Nf6aCBl zfM=s8khVkSwhqFR$S)TS3T!QfU_-VRu+#J-uY}ixe0Mq81eY}pW?!H0Kw1j4qz{&YDXUp#1UGie_QFZr|XgabE~~ z6`tugbnlzpJ!3hUt)oJn{5k#HdR5FvL%y#kA=CqYO zNKSb$c<4VTnmgzLzo{cvV9Jk!8ww1$YObc{b*JUx7$6mZ#=rC2&J)o~z6R4JLbS+> z^!nR29c)S#0Phn$yTH~_bJRaxLcXb8VF)dI(s+)9pUn*1zH;2vVTiOXcuLJH^m~zH z3lAq^ZgwvS*x2tpAMBpYUOu(pf$I*wT z8Q^xJu_&?zm!Djlg7aSF04a~HHy-SNYgS+NB zjuC`PkktV2`jMsVH)AOyuxOHs{YKPA;Ba|Lz_aUmbl}fLG7l9rzu@M-8AKIR!@{faqhxwlPBFVZ!4!= z5I&G)(k_fwCno&J)x~PlewwGrs{1-#Wvm^$4;2&bc2d1Ai8O=A?x9|7-?mVK*_LJ| zi5+@IGE)7qA-Dv3`039X|F);k_$R>LFr9$yq|wy+$|gxvWxb@0sn5XoZn8;mK6go0 zY5^x1b)ZVp?p0%DrEFcsVGQ*XcLJjU>aBddpr_Dhtut{?xxlGky0@wSX9FRoHYS@; zyG@bS868e``fsZ#Hoc6)PR+013g6og%|uyL%a*oE$RkeX?!a73>vHR21pcs6LtPrig@Rl{VIR6U%b$vHm%n8RV^+moFGzotx70l#yHaO?|K7=4)F{@$Ur0?5$><5*m;v<{S zTMuMS8@zoW@%RDnqpx~a!EgT8CQx4nyxT=Ao3q9MsvJ{kEo1?Eg9C^&eH+pIn(gt@ zrJCIzk5+$tR<`oz|JvjNR3MuKJbINZz)ToXUR8(_RkUk#GCqs3l;b;S@v>>F+97&4 ztdVAYyu@3!8MXC#ShvnB2<3dsXsLdN^$`q_^?*2B9r*cpi9X)WjBhIyB7*XR`tsTW zjC83=6+Bd6`#2Fap9~g~!|2-p3l^5#Xz7aP9lZV*)lYqEK_US}ic%xlSnR!;Ihu>! z3R(^8G|M)_aCP#_v)_bCb$^)^<153FzA&#SBk~$Azm{G47fLk$xZu85<{2SdNUI7qw zog0c@R{K90X*>0a+ci|-3@m;{#1{jR?3Yx~lHud%s7XBzpk-hSKzPApAJ0S00pRX& zB7(8;M9_Bb=n8^zX=b-_eC{h3#-NM>xU4S>oanKziWifuoBvJ(jgR4iAed*n0Q9yV zz!v=l$9KREwTt)^+G!Hnx(hsmD9Q>4MgEfY|Bk7HuoXa6$r3=gc|B&*IOW$cyjLPS z{oeLi;y@p4MlQ@y0C|pc_`I@3c29)=F82;E{&5Xcqd_$Ii)YF1Ff4%50eHC3>yK1S)(w_*UFpakmdF#01{Yg*76=dzOirrLy6|YgiI{ zr(bm%Z{}UDnd7*w5F^ewEIA3A8Raiko< z+baYH2R*AUiKbuZK>VnKB(Jv#I2gg|nc^!}1#5Scs^;bJW>gQARt1(GmMr*Mo(;e2 zpPmP}+jf0kpY=H<6)T~pF;k80~8~dJA`?CYjZB`Sd z(68vgDDP8Fl2+Wh&>yS3zw9O3pS0Xolh+ODCHu*R7w|VY(jbjS3M@>@~44?IY(l%xLaSE1~ZC%OkHj<@xr;(uffH%pvUf(DpF?X z@e-E>99`D|=NcQ)?sRV8be8&=B$B2)*_-2gb*w^Ui*WZEC39Z*n3x*=!yVh6mkA8& zfHBIKmg*D49Tteuk3^jed$)S05Vax+h2!Q)FTM38SE-9vFV;oj8p*G;(2>Xq8w6IM!Hmir~(b!^&WubVL=mhaGo;}0obROEH;q;ILr`Jk*5Bhua$ z&*Eaw;vym{fg*#lr(puGe8n19ReVbg3O#+VWki&P$x#nO3r`2x`}NjLnjqIFY-Jin z0>7y**#_Y>DtKhMRx~271T+0s7T*&KneLezbR|>81iJY(>5GaRj$Ic9)++?54gGMx zrMXNoqlros)^ldq=8>K9gq=oeQ0IL=U#;RFLm0V!>-$RnRQ!PqGBF=1IQ~)Mgn!Ob zx(5%oe76~&voIA>?lmGo%Crkn$kEI5>B6Jf#V=WTQxcsJ-^OE2RioX41lZ}L-e))_ zF*16V@Yj+-5y4hY?+EX0L?DSYR~$8oU+qPly0ZF9@6&@$1fv&n5gK*#bv&_P=$TV? z<&)k0$ohr~qJtZy3|d5rkQ8B8bb3TIb|M9*CIWJqd&iPaCCo-iF0|+{*{-OJWvxmW zyiSL0gkAfFS@6M8<;sA}+5-6GoxJxeBiof*7eiVpG9gs*+o=5sJ}ZJ|;E)v`OH~$! zqMYFX33Co9I8mOEvGx#%F$AVaclXDS$@|@5h>_0?SI$T!^=m%LK(qRlu*xb;VTShpj(70x}2N?2p zN=|PIoV`NJ{S{Si`l#BFKfH8i2sg*osT}1JCpL}GRVFJs`as25;ku>zm8~Lb7(-2A z36JX=q>beoO~(2PdLi_lP`um%6c;CHp%{sr-5zq@F7j#CJ*&XV=+rUFpD^N|Kq_wS z&PBpDPpCUL1~p{WZGM^AltZftW;V^o98$pP_%$vzmCZlfJENYsT2x7Hxw!NU1iwQX zVcu#^;fGU>{OA|MHQEqk@8zWe)kSbi=kn?NH_k#?x#?S1J?104c6{ z-u|5RMoA=wJ<@J9W#xhos*spIaZkFM`1vzj{A7ZTlgj9b=a%Ml(z|uARzF8&{`)A{ zgqKdw+DlolS5r)qW0B<+2d~t%jI^yL)u%;wg(yQsumWY_T=>n{WDP?T2PrJ-EeW&o zu0LdLTJ4rOc)6wvGLZO}6c(JkmmBp^UW7Fay;@{@ayW z;r8=`qn$nTaxaulHv+xW`3+tEJVsvb9#>>O(Bz8_ft9q7zAEKdXf&nyo)!}0knzM- z3iESnK0f8LpqQzpcu8$Xj{u`jFss%O+fSA^1y$Zz(J0DZB=UGLX zWH3E=C@^uSj`6194MRw`1T-n{$6^>1C|`c=E9ImT>QGwRS(lLvIZbTBm-L99M6ZQ$ zTM0OBWfq&i|I*RfeLn8vuHLm@t|TS%4>iWt8B0UTQ>y!26j#Feg!F!OPX!Fow@E$4Pu{Ski4d0&AfPHNZFI{^sj#P_i&|dUjX%^2=%e1Y+ z$#Wd<-7^U`fI8#xZF?1@WPQ980c5SK%ECvzXFe*SWxvmtwtj#Zd4%1ZBos zqCIDzB5qNu*BOlh-Kz^6dlAhOiyYH#(8*KCk$1D%o|H{_q;Kk-9iP|)#_TxtbSk)s zrCXVuQT%3GbJ^S9!zpxRJ;elUPfr_rP(QOwYny_>SgIY2@kSL$k!X>G!hj@M^sw0? zxi_xj06rHCUV9(m7_cSQ+x?0j%Lga?>%Tu=f3KfP0$zTRC7wJidIdHu{xYq4Xv4~A#DjlL(v#wNLxi~D5a<&aj02P zMPg2iQX!}*h)7L|Avi>kL2}RizUTfpJ?Hy#f84u&?PtI1*=y~0?e*+;FF^dELn2La zV1a$mhk;MQ0U$4krx!TzDG1^Vg9^~e2W`cPl+JbX{{6p*TZ!u5`yyy>TcGsl=GVPq zw!iF=6^wgyGp?m$ul&6)Vqxe9$I#clxXQ=vmvB=PeSL!7T&XW4E9QoLvVp+m2BwoU z8-l3~+kI_#T_gHP;|=Z7Gf8xEJC&?3HmPoGu_4+OL^i?i7x?D^s*qyx{}~bxZ`{k| z5B8Vx5t1k7ZO2%9{@HE^bamJ0pCN(hBsStdK!OzFC?B`%rWr4-3Gq=Sa?_!;Xylhu@VcYRDZS#f zk$ktdi)>ci>aH2UsphqJRkmFuQP0jn<0Ir%>i~OKr{*ADgJd$lQl|Z>TYYTk^M*^4 zyGu9nWpZ5E%6|w>=?JBW$9KEH5Vs@i5Cex*18=nCcgJ#Fz<4B_m8caR+w2Vj<%j&T zW^*$2ut@121LA`{{Ljy_@Y+XhMO{xi4GvztpxFSU^>x3V@)zQm!aWcH-lFqV$)LUe za@pZ9hWk73KX5-}iF}`kg7}!F&Mmo8>>QKdg(L)|X>-(-ui2Uiopc~+^enHT?7D4T z`5qi%V5DGZE9FrtM(Q|*gzs0e%PFTmf7OQ%!h{+=JtMS=UlRU9PB);Iq6A#~a>W(T za1QsUm0*^13d(lHwS*oc@H%!~b&7NCv$mYik>FMZJ9y%t72zD`54}lFLO8`+u2VAD z|H8$`J;ZBw-s7;vN7yQ)y1wN+h4WilobO(Us<+JOua>Cd`5f%x*_Za^(bwj;Z3gV# zSg^R6%gG#Hxr8$aBO1T{sIcsOVz9${@{{@OOSgD86<2rV5s~uEqpW*X1ZXoStiy5qqES_A$0KI&#i&VRIJ;gVJXonOIDake1G{W?_tu)o2xrZwGi-u? zi*H@V;!W>9JiYrV9K_&_>2bJ;8f};*INgG=n)jHfxR%dO0pB?IbaR_|ikZjMG5B_V z=&Dz%;|XV1#5KsYBP(LIhH_3tf~2=!Hll+Pfq+s7H6D)BA-x>+$dCvR@izAR-jM+< z)#SCPZ7eloo|DDlOhR^lEVW?@&+vJfWp?CS<9&Bo*UJ=3IX1DPs3>D9bNi6owvX`0 zx{2L{P+93I{)_bp0=H{L8dP1h#NIN#1dDn-*ZVO7__86gKO-?rhvRoXe@aALbh$}XgT{&>9OWMlB zyo;@wMnT|H8xa6y&kZ}t-y%`T&z|K||2%`?2K%tgp?*;FsZ|i>lm;ZS?^(&d^TN@) z>T4pAA%^$2b>?9WWWJ_cu9(!u?s&3JKX;ro4HxuS3i+~wwO>ZdIev-+vFw@Y6uqFa}vc{2Dw zDI0hD(c}1S=_Mr%6`zTz{z7}+NfphU^F<|2H4fuMka2Yt5`QICEUp!w^(*utPlmRp znL<1AnDV5I0HWUXHxf=!UKJkUETU|`_t}F%ewmLzvS|^gEFleltsX`n z#MGt2UrsYDS3t5aNA9LR#?DETKpU(rnHXf6c@8`KrtLLLKDrfyz-W3B#@HA$p z4AM}cZjtJ`pQ3{ByFMhim<6^L^Qm~6FzVVE0j>?BT~jz&4xA`H{>kG;Vdll6R5=@v zN7n8}XGt#SY4#;1Ftu@K{~dTightR@?W^&J?LbtCs6(yk@E@9-tP#$-EvdRsFSE*r z<(x@NZuG?Y+MUDd#Te@M3Hz%P>$Sfw5IRW^?W1=`yGP^Rgj&(^pi6-1L`2TJcMv&^ zON91j^H?XaoJZj)RQ(rAdycnd6aKK9!jQ9YF~GY>O2^Q1P&e^zO=Q;7T1Y@$4<>%O zLZmxFCWx`<2UBM1Jq#HigLEVt&MxooIN*`pNd%&6dcHxgyJT1Ue}|-3#O}P))rZWc z@7T(T0X=SuWOJmB%!5pg1kMgS>xu3zGi(*4hBR$r97rq zmsomitaJP#zylb9-xb5P(gSXvW1|uA8@w1}j_P28+?=IBo6(geScU}Vbx@V8ULPWq z>wFJsg9H-BjKFrgldBf`WJ6@YO^2CD|J&bfre%+ej$CB9e^1e&5i-*{>FL5r^^W0; z-sdfsd84}_vKBQ#OpOcr&Mv#ZmX_YE(v+xVDtY`-lyoE6q>b>bu&}GHnVP4YAKH5< zR+2ZwF+Z{K#Kt!uj@ZGrqjxbiC`R-mh^V2^zQlWB6wJXe@rp*TnBAxk-Q`=Skd`$w z_4TACI;PZ58@oDGcZ~u(8;K5dB%@hKxBg({%5mLWo-M;mUVi)hG8CpPst63%F~u6{ z7lm2+)+#Ayh(E2D>R=N*@+P;qu63(dL3Yw~a#KB#jMVJwC(cx}7ZPk`&kf0xg4c|o zj0Zg*_S>0Zh`x2fB!D%O=G4f(NNVm-Cc9lG-`pg77L+#?PtMIX8Xc zPQc|4GL4jrShdu~Yay)$%usN>P-{9sp(t~hY58#*4iZJLq`L*^<5Ip;eN&$w(q zL-c1uyXY%O_wY->z0#!5qxyKm7Fb}*_Uf9{yTMwl3;B!&l>B)hl7se`=+PKm>A~a6 zp0@ff$B4+->eR0d=gg<+4UZ_bGInwz{rn6MFL|Wp*fvs;39=@noVy~3iSVglDOBNR zdBAsh_QC$B3w_#3`Ki;h;&Ay-GY=Mp$hFDuq?7cwtyGpO-Oe)rniXHzdAbZWIt)3k z6~GFipga?8Ot(%27dmxp2lXg=I&Zyd^!C7LTFb0*>04*9uZ4xFExak3_q?9#2fvu7 z_idKEk+ic#oxQN97kyws4>py{*)#=qBlhIU3CNqxG(>NO9P9&j`9cHLy3)Vnm_qs3 z06X=5zci!ck^2r}df+Ue zD=7F|A2~RP#T0HL?c5&bz{mM(uN&^r32%25#*=v#Y=E?T^k9Hbp+nKV;>8imugnDEE{c9d1zV5hQ zEy^A?z=%sH3}%n1k~Ouj0ktsY&yfYhAKpZOVw$gn{(q%7r_R& zC8#8GS6COuIySS;u;zdv0Owc7h>~VgtzsLiPAofK35VI#aZ#uzYx}bF6Q*m!a#fA>sNA@AfJfhpTPu6Z0F%M@gS8af`3D_juZoJg`(e5{ z{dX5-w2gM|B7K@RCr&Km0xJ1#LhWZGUC^?*&Yt8tVnY0r1R z@@CG7s<0%7?BOSinLiqJ&;(3uED)zo6lA+`3Pro02g<(m^sC${;eHRH`Sz6GS@e0g zG&eW177?;KLuxshqL_{v+I+E|wMP%GR&0X6D)}MW`JdCsg}X8+Wtj#gOHUfJ8)kTX z>OJ8025-dks#OvoJ@JIS?+P8#nEkl_l*X%}RZ^vUyeT9~6&2mp@Qt@xUv^SVBC^4@3$RktbFqh8im@k1UfGdr_;@%r8R5E6 z_i3nKvaRbyXIpIg*8VGMB|`mFVOa@%=G}*gzJGtu|D~n4ps?VC!K=q&_GrDnoqzo| zi{GV=sgAg+J&+eWW+o(5J$Sw2dbQ|_Ukg5d6Gb;aOT0HR4pDfKn0T*KE+|U<_tVM= z3t^XfdD)qSBja1y|CVP1NtIm0X`(TYzr^LqZ?S*ssr*n|!1HOGZobi)R#`WKo6+m3| z4s>A{r(o<&ah_`*N7!DGbjrcM%EM>;=~xE8WoG9C@@tPZOnHtWn+6BBM${ztNTm9r z(>yjvG=U@T7u>gjDe+8a_}!}|eyMO3*`3-HSA%zhY_yLQA+;88B)gXlAFYBV2o1%L z$8?50j;o5_V}nN#Vc)TKn7IK6{<-Y=y*Me+_R= zfC%mLyB`z`fr5km-GpeQgSL_ca@Qtl|NdVjt;O~3d=a*{eXsoBdgopV+h6v`2`4IBe3fVTbCXb93LE|(Ou}Tsm;k#PpprpB6ukKU@ZHo$-a)~E^DYUc&6!hb zvL{8S#WhT!eP+;qB%FTt?7iiS(>Em^@-R-rJ~z*N@sSW!eA&_Mlv#Pw@KleMi(F3K zI?r6esph3mb*^0uLD$Yf{e$<5)-MR>rWKH`g%qal0$8M4D+9Q$|P zXRtGJ1c7h#`^4ufT}=5h%mPEujle-Ov^Z+#jciRtjyn+5`&KuQc0IPP0uK%$C`LHE zmHZ$bEqw${>>apZmsde~@&ex*f({1;pB7o~T@n2*uLG?mD+4yZ7`XP*oudM&rRWvy z_vJiEO_7K2UTwSXI;Dm7d0Wos7)Yz4T}1MbHSR3uyY3VxDT?eP-*q%J@ZzP1eFURh zZ?Tw?-`E$3b@fr>!lFGS+t_dWM+Y@kQa56EFqEuC zP7a4N<;|N}X+syC7Vxvn?MOE!@V8ml%9YAEpm=d)tO4qn-tk&_ARZn_8pTh&jpS>9osS*LvL(DbEC`h1nN4j z%-)c2)e)^T0a>bfmuE;~ngGjcp;5X!aLu3=`Jv@6^2>)TtxUpY7mpe2P|+VBIJMk+ zmtuu9Mg}o%`_kEMAxYdmLsY!!$!3Kd7su&di}6gj0jR1wF9PF|u{OErVr#DcJ}4L@ zra<0fY$Ay%?asY0z56S*I0B%094o06)_m06oF5P!dG>)gXAr=z`*5*s1fWWwdI#w=nEwi}?A_?> zO0Yt;-BpCNJZ+vfG5@uY>$X=d&5&@>u`1$(wc|Kbe6mbrU@ei~(2_ZbtvrqO5JWef zN|1GgM5Cg>&3E|*5YZZLgjgaCgF2O`dPmz+e3pfL1cdBK`qWCc&_F2K!BPO=(T4dpF+=R#j&=mWvYuWPv6V1*y3){ z!}2GG2eS8PO*034s-37Dt&ofWMXCzYk`x3&atDdEzgN z9u$hgM|(a1Ezy@siL`6vE@OY!m*QAVn}8ktx$EYyg}@4cofMb)-f! zeP0lVm<7GIJMJ!Z(6Q6VJ}~wFdMl_y30|||v$hH-frGhDVeKOxh%4tzEAt|_2sO){qQgpbm~UsER(^`H1~7dU|F^d zkFKdY>lk#^n>WGG=PJ6(LWM2NseXVRr3KXpUOc5WEQ5aSlZ$-S1Ru5UIeKB#r9e^wqcc?WR`L4mq8Rcx+5mqt<9lkx*GnViw+?rb8x1unc49|P>##>(fGOoSZBHjri z?@@FDS^ve#p5tTH)O*NHaoAb3M8T(6S{vv&q?3HRCMGAi)*D*ahfZ9r6zhqW4WTaw zz|J#t?}tr{dv~M)=U4Z49Pr5PA^=b|eP8{qx#WHf{N|lm8Nd5RN6&jcbJteBJ?Bzo zTRC__GGv#Ei;q5$qT&LrSZ+8H5+BlkC|8<46kh-CqhFSdc!iv!eT|MzVMc3K)BMxz zt=ABQ;^=CozP|dExtuW=?&b2DvAR5l1P*xM;K*B%jIDQ;BhRF=WEbbnuhYDSyl(rv zN4ph|F^DNDDPmB7{#&17jrnE}cTw?%(t6ad)?3T!kk9SU7 zR`39X_3|XJtu*M(vuqSRaf|=lgrhRlAirRx-)3mA0?U#@zYM9C)5XKXxz2YGAOrw6 zZV0jCO|4t%k$?#3b%(jBz?)DDNb8fZ0mmz*0)9VGcz=B$K);FZz4Ao*>NT=2PNS_B|I4FkBJYZs+I<8kJwz1v+$98VoU^31x+mk)FvQ zGvkUk|(XXcAW9}l#KjqEy?#yo?0DJn{7;ZIY27Ij_U1w0SF3tI6(P|p;1 z^}~WM`NBf(ZJ)1TQx(~bnB&JMyG9D^`pTveWMl$k00; zfQBE~*A0)9Ykt*bHkEKpMN(?lPrlMQ>Pj96eI$Q3yu{@VWHT^l{sbyp3+oF`;pYxW z64aV~Q){$6!a6&6_K`{!`f074*@dJLg`B1&oMy^vnq%FF+jyecfinu-A)#OKq|gu+ zL$rywdyB~EbLZ5V)VLg_RLQ7+^)a~zhfN?M{5t*;kZ})NlMGNkeSHlU6kE5oK($2V3VTXi&u^4@*_X8dv1C6T_I zohver7_JSg)ipL_@)KH65B$>`YkSKTresptiR+9Y*}!;t*TY&IH;NWUQL21QM~%6w zg&@}GjXC97P51jzKQXannVM>gZ_@MK>^Pr;wPf4HdmSXN%F4RCkve$;x0hwL40mrM ze4Dl>kF8>%RRTAW_A@aqD7k!RPf{HrDe=?SN)Q_mG3|o8GDl#x&v!q})kpPsMPs$Z zvNG`H#~VHCmj~O|*1Z8<)`7-Rx$D#tlJj&cnUR$hBf4@w#zl1txt&4U&O25enc|Q; z@@P4GrcoP(L&wJhuxbQhwi~BNyyr=f+%wOBs@+oVw=k-IU&XCu-#04@3v(OMVe50m zmg8wknaJVor<*x@bR$$tOyL;i0C>CLa|Wr1CyP8U+n{XaNoDlFfJdg^D%{-Sk9uCU zPEp8AK4$N~M)PjWeK>GJ{l)M)vC2Ks%sW;E8Q0zNNI23aq8-NuPTAuQV=`NoS)^z7 z8LN#e2Xs~IRICMGcGFCwb0M}%urjl=@rPPUFvo~qxiK5Pi4mAoxa(5gr{RI4ZQW11 z+Tt^r`wdh}MFuFMa#DJX+xOx4e|^vYsinB!$k1V7Ysv0CVM*@I?hkz1rL8i@-8L@X zGM(seyJoL)T5dx59OVA2;vLrBE1zm>+!Tx475f5HA|V!Pq97A}O9UPmiWl_j;7I)S zf624K7dc$G0pTiNFt^QAVe)^Nsm!RB_6RVVX#)79cHXU(gHF@ZUX`FB5KtS~cvnZg(9Zr=4|o_hL6RBHn~QB!XUvZ|#Uv_G z1$3~5m;uVMQT0|l7rxOx#Qk$rcuOEKp-~n79oP(J*PCzn6Jk;Y2mjsk@$Q1)2m1an bVEs65dSS``A%f6csFUy654ha1hL1fAU literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..2286669f87a908dbd409fdb988ae2ddceb6ad03a GIT binary patch literal 5032 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 literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..ed846363fb4229ce01951c8bc60c067da0a52310 GIT binary patch literal 1298 zcmb2|=HPhwv@4Z?xhOxsBt9jxh~e!W`;0lIGRHqY*E>6ZS@Xi?EgdGVtfd=XUTD(D z6_6>>;LvpvT;d^{<$A=Pm36iPN7<_85G^OMr59Xpuk*U-7*Zfu_#((9R%FSFW@pRy zhUZPECseOIdpuq^UjN6_ca`tz%HQ7+He%U#^ZNzm@-3^hZ{0P$8*8lo-sWSF>4ATz z=i16Lpn?Z&Z;k)+qlz&c)t&i2Klc2e{|D!87Wewjj4FK~D&e0zsu05|OhcaDeetKh z{QtGE*Qd03%(q|OD=feF|DkRBbPv~lUp-%Ke*W1xGppDBN(?Wp^Dg~3?N#T^R~e?8 zf6MpZ+p#+IEKlg-$)Tk`UVeMO_^Wd0%YJkxh8;O|=0AVcGg0Ng?DyZ)e!TI`S6Erv zZvWq_W$&LHIW+m$tWf@6`D>nCKcoJ+f9ve4S=SepP!y&x08t~ z|8vt{{_npd8`sy>{Ox{!PItG}ip!d@AkS4U{r`^<$(O4SPWt)3YDwL$sAqrvgFUu?w$iT8g#qm?r;1)@B6m=SrU@_-!`8tJ-c(| zyQupuYx2*XH9fxd(tL3wYd}nuHD~_RXaC4}e*N4b<=yY!-K{S8_OJi*G=Q4($l=N+ph7fm5egpl9qAy z!mNd+&eRoHv+Y_a(64*0gg*a&{pkompZfE^==NK6+q}(nrqk5&jI%p_KL0QN zcK@`mf7$!zSAO39cD93YkKX@{8#HfKC4(2SwFvi>E4X< zcP3q*QCd< zSKp;jV`hz;w$13`*#6&}opnCA`Pu&LXZx?u`}Iry*VDP)i}wmY z`~N@O>;FI0tkW?2B-i=>{Jb|dE&TuB%S~tYS3lnu=ie>gWB%VZQum)a<5GL{jP*nR z4lo0?7ML=0)Ex^*Hs~|{|P9PvCRZ0jXgdTzmiWN|VAXVud5lH9( z0Yi_35+EdzW`GEYA(XV=|K0zmJ-hpUeeb6^GtW75XU?5_pZmx@J9yCS{ZpTP0&q_c zUr3loxDO2O4-MY;jdI9Y%uyD<*(`DLxQ(&VY?oq)fZOQtpF%BcRrdGqzkbc(#Oq(Q zPKIa=DxSc~HM$K73H53?%%Y7|ZWg<#YP=i|q5HI{g%pS6N7ir9qmeFR(VDGC=U(V{eyj0pWiST^o&|uz^{gqGLsy{K+)TZ5V#0)(FxNezAn*-V~%_ zEY_?P_dI0OcFNYV@3-??PfvV0{8ACXXw;RMKOPs^y7J4}->xBDt+~d1b^HrDfh%d) z>m!&#gp6kOD_xxl=VjWj0}iKni#pI9kRQhJ$wGxz*nlS4b0JkXIHfKm3hr=zE%e{F zw(sP_pIN{vx*VY4HeoPZ`hThJ3&iFv--D&f0wT_N>ce)h4ok9~U$k47{k0}*EZXn; z1>14sOCib0;}W%E#@Q8}bRC)%3uvv@Y@FoKa)Ia}iL+lh`e&mchsr5ny&7|P6C{%M5?tB?i%N2jXkF&!&odX zSLfl@;NG^=8o%ykxB+605wdjtM|(L!(w$i8XI8FQlaQ>AN)gUxrQ@3y*Y5rLx(UHy zzqbM2v5I?BQ<&5S{7P|=?X%)%12pSy=MIA?&MQW0TI(_Kk2J!b8tL8j?luO+Sv3H| zJ^tyL$M^tMd49WOi@F@84QEn9?|f)z7+;rLG?btikQo8 zDm8+)CA1U1sZDfHwYFmK(@?eWcGDZEbypKznp&Q4%tYl z?eH4!NZ`OrMTCWXH?KK{TJyn4{HmHhlKJ!A;dUI$Ly^XqrQuUDO(s)kj@{t%)Vkh2 zO4A#0j4LFHtj5ve9@FCAMR7PLDZ9lb+pO}2PZkw{DE?v6jt&!dZ?Mn2v4H?Q=Xh;c z%*xI%**bf{AoJwLS2I7j&zPn9KsED^)q{a;9c-HzzV%m289zm&wDKKGYGi-wO#Ttz z8`qDoQxpMNV^$u)8LGOUqh)6SjfxoZMEcA;{2~F+o#sOpL!+Q!tcUm`hO!gNJAzr* zd{pLk=!am$83*eCWf5Fi!*<&EOJRAB?m_-6X1oD$H@&dP8=r4srn70Guj((FQ^=SRpM3bxDFOniEChjzQJ7AFU z5}V&+GSl%Rdbe#Ry3BD;yW2CONIjLkkRR*38=ZKvD>_VL%X#cp0QUF~lGm_SJu~ik z;~?1x)HlUk2e0K5RPN|TYfg3;q;E&Qc(lJBNWcN(*|OSipM-b#4FOr_GJ$&nle=1q zskQI-VwO0&V)WWF!0^C7CJ*%ZuciNo6eaNh8e+y4?! zc@R0b(sDlOW`tM8tu;CSoSFs*h`X|RfXJ_Y$j#y@EIjoO@Lpm&*D2d7;H+!zi4!8K zr^1seh@0n%y~NWnpdx1f{@-CpTy>m#{==&y=GFajq{?T=vjJATX15rn?OyS*@tFYx zW`57At-i+P76jyA7)5cxE)=bxOt?8oSkDDMfDAqrQqvQnPNF~1(K^>T9;#`HSL<3AnZ)Z6n4nj z9{81HAa#q*i7gB6&meXT7V%h%Ug*!>8H_`{25@;R-{z9Fez#MLgu0x$`-iM3;M3I| z9VS^F7%pO{rToM%bBVh1 z1|_iO&~>!uy{_w21A=a-NE1oN%g5F)($>YdKjEoP_p@`As(lqlKU_+v8j$;6n|z21 zaGnJa-yN<7NE1|A4{u200UOX-r-ef$5RW8oI{BnJN_jgTa7n-Zzc#r52{3E~>Lu@M z>5;6Oeg5-8w6$4HeD{Qvf{$+%9pAsQ*s)c-gK4fkVMlg~)?bk=j|<4({Tcr_Wi+Ul zIgx?6O~lkqUPZ2)cTZh`D;=)A?FM}RF(@O3);;Wk3O(ZtU{jj-{t9kct^;R?Z0xJ7 zA6h3v*LqQU#%`j|W^aSeqId#u@;0&a`A=CaTzR2CO(T{aJHwzE%^WzqxAVYKuO_dP zec8$l@Hd;&%2_(*&m%8s<$o6Wkq@NKYF)pHQJYw|TfC!@|K8YajBfQ$2N+N?)OoJMm38vss* z@<2-E2-?l{xBMN$n{I$31F36J%g<&5*t8~oM1tr@V}@=dAFzMQ-jV%h?k|ALe!lZWU>m$8Pv(^q)mA*hn~vZ zaxcA51Iv>y(&veJ}k z*pSjJ8{F-eaPp4g=fS7G#SvagBnWk==LKx&?^Gf7CN{CJWR2a+Lwp?4p02Prihgb9 zq{rmUaT`5)_ri`!&$}1SX%?29AG~b6`9X%B7i~DUjW-oX#$M1KCL+~K?E9uvNJ7Hr zkLF4;`>VPxADf)DX$$!FrI4I8$=MEJ%;lN95vB?0s8JLVgW(GSGE~G+Ydhfb8l6k+ z-4su8ax<@NhUbhz5}I~n5H;GReC^gztk)|wR}+>svoWTW*9!}_w~t7153Z>}h6j-^ zWhW8L82$$SAp5k(X478D3`8cImx;96b}(Gi!%{z#<+#=>&9d8XFRcp>Tf0Udm1^?w zZhxQnm^}G}HOvTV_%7o}^51>bq%MelaD7Aibp3p5kAplD?5^lLakU;cxi0IpcC1CE zA!ub{5-;4c4%UK9ZcXp#3%0uIL|hWBZ+d5hC^a$yXR1k2jrOLOSbl$PQMVXMd5 zej)Ctu;|t@%N-4zVm++7ASS$R`jK?$m%cKoXt5K6Jyn6TA>dVMqaDixCb~vf`rwud z?M*$3RX{5ny{7k0f#l9-`>*4I! zGuFSfvc7%q-%Rwzj-}aY`8c~$A`L?bQ*d0hBzhJ?{4gmcn&m(d<&!}X9HiSv)hc>? zk@%r(!_9iPyIcw@LoFq;p|Jwy_tYI7r4W1ROoUYHv`<0I#UzRVp?4>DN#`yXS{&C* z^GDmx)_wjec4K&l#s0WVbjH3?dH1AFSQojHv&eq`fb*Oqm`tdEH!TeGlkv(G`C}}n zB#)G$92IdrnyfST`?n=ui$HY8UT>RFUZv{gB&eNmafdldT2Ur-moQZ zLQ}ql3;~w^K&XhusI@0*c2!5j*|g0_q>GAE-&3HHuRYpOpYFn;ZF!X}>&I>IKQxRheY8#zxN^fZ(ObhNo0@ZV zU^R%jVT!)*VxZ4mt`Qo8y4%rMSLueo`6c$LhX!Z4qwAAccrjPlGjQmL0 zlf7|7SJU&cjygXGgha3%-fn}hC~S-h4V4&j)t7_Pb@<&%#t3J-uR*!3#TR-|U)Nnm zHl2Z{o5?Keo~`XD=(VsU{|do(n-Zjn7p{S-8#$mo6BPkPY0&~kO6VK$xUo2&v=hmV zV__9D-fKWNfu7n91(SZ;35o%%{hC80+Mm~dmeyUvyIo22|Rqmn1JeB7!p&aC*PTMJrNgp<+-CAA^*YzXUJ*1dTvGp4m5?$NkzyY0_XUmn9)DLo76vG(HscE`%;Sw{Na`0H6RBNFVb~98S&26g> zKVsC#Py8;wkUO8XqZz=6@SZxBz{<|3#8~q}eP&*qH6zP{`V3g_tMh$&58ny$bn`UF zZ%ZF1-e3FUvC*VaY^-UuxWT2ghBD?iL4S^dhxs%LO6qBTlud56tP+pJzA_ry`gEI# zwVVo)&iy<+x!?E zE+1PSUE51fAndi6oEF5dZ_bVpul8%zxOm?8?Y@@}O0k4yfSbWvXptC{e&(y)tD&9W z8zEaJf}or^_25w-`oLQ0`1au8HeDFmlTevvwdNUt;K7sfm}Qm1xKnWT*! zElMw55g@Q>np*i1#B!fPBMaB?b%VXv(Icyy$kWudiUnz=MQhiSxxi1z@yJa7zE^=q z27Dc#P*ta*Kd)mzMPDOsxOj1J=D=&L1Z1~oX~H*Qf1JAy;+fz1iIh3PWbA+ zx}Kre@~z>5f+BiLO|{w3mX*WbfsJutBe zcy-J6tkPljw8J^6m-~q(-37BJPa0>-oxF6gKQ-j+_=TdI;LinCim=feK}zl+lE1$! zu-Ml7u0kJqvoRv&3zv)}RF&uI=yLh~{PGW*4cWZh%DmVnw^;79<;wS4WV|Szm`s(u ziiEKe^469y*xJ(C3qB=tHu&U^^BGkm z2@x3j>)7U0T_RYe853Gi77R6IPE^2`QkYpsIN6nd@NO(nTF~ipn7e^Z{?lpiJ)A`h zGBVQrp5u+%2|xdpeZ?2w>H|uDRXhtAYHmgSy2|?7zoiqFnhIFEoAXgEOegy)l-Ccg zke!5oe=<(;ROVGtZvMtgCZ(ACk*?WuNnY=<-0>lgwmcr@Qrj_cv`l4sU39J*_KU|M zc8qHYxI&bz<~5OLuw#I(86Hs@mu2nzJsU7bSOi4vcbV0k8q1|#tHmB%z!<+Daoqst zIrw#UrfISvBvZx-WMyX;lJ>U6eQ3BiFzzBPY(y9c$y;V( zx=vS{3DG1tv8e8k3V(`aoj*ia8-Jy#-<5YMT+}$@Z!%Q;(l!2HVSo0lK;a*H+i2R~ k)w%fPe&BCaUE5j&e)?-SiPBdvC~#C%c{A+4;NGm{U*Mk`QnR)YDhDGpcsz=P4II@c zFi@*<^s=%T&E-jy)#`QPfEHOldg2b1;004NP)n!KKYor&BR^1Mw48deGXStA$LbdLIRS zp$56gME^m{F-vgwl}lSMPkuf8Mi#)RR2Le@4GV6`{C45WO@xE_o_=>V@3Ol0QYuz= z0Fwt7SFK3VP#=LTQh)EYKFgg`_uH}cz<}dtOF>V1Rmm>1$r`>%)&8L{>r3>2f8N@@ z)6aip0?VipfQs7)476PMFQ@wfwRq2SW-2m);EOI=fje01d5N|kYE6rtpwUW`md75x z_x7TSps!yKi&P2eXO*@ss8h|DKvRWk-6)5e4TOCYx$u*tbs-dbsAS4sv(gw=Zm;2@ z-aCtCZ2xic5wEn8BpqQH&IEjWy(C_#RTaCkz%fgyU8)AwBj_T>kCC@ zt3TiBV{O~edDU-%wBge<|M^RsEhX?XPQ)^gJ0-G}(XW+}Ndj5SG){;s zCkx;Mv!E+Ei9xBwFBRllCKM#}Qq4Oct=gfS6k2j>({bT1R02zh^g*|ynKlJc^up|& z_?qB6+)I(4*)H6oEQYGV7*hfFKiAd{uS(A8h)ijdX;+i_2;SGmI!#k*I5>)5R?skBKdJ}JX+Gi&^9#L>Pk{TIDjrtJE;TR_E78GtXOKQKGlzJn1heVGyEJ95Fz9}W7r)eVh2(Yr} z!BfuhK!@Dd&zp-XvzY7JlS-*m2ewmw_&t!^8+`Vq*s7Q638x z)D$oy$oM?GUe^U^r;=RlTTHa(1E7q%UXn*w&X77mSL&&f75fE~P6-LyOy2eCqrJiA zb{bB!ZiekPPlOeNS!x|F!THL`?AhE1$ZlB7>GrTEDqE1D+g{icnY z+`NMb47#@*v@gjsJ~rh33eF7I<3u)oBqqW}muVkHx9W(? zzJwhz)9`!`ORPRW*Sf}e=sXS!^pjB#+p9uVgh=GlJGFa3Ne84VE_kS(!0VF`D4yZZv7^F!u zYjFSbhiGm#8(DV=EV4hbm49OY(p>9S!49UO>f}ALO_A>aHWOzS$=(gwi-{hYUCm0kBE+JWpxIOo!g{L^d`ha}#tr zfZm1F)OS3UFnQPZ0+P!IBX1Mi5`W2L;!5&7sVWidhzS~1Z{omV*3MH?&B~lM_H{Ey z!1K;D2t9w?lS`fl<$f33%mtDsLAtkiY>zoitO=jr_F!|vMMNIN>PJz=HrvRUEP9KF zkaXn&qBHD;qd3tkI&04>aP{t7s`d=qITOS)vTcZ70CWsWsNR3Scv0B)bCrOtj%$5! zOwep6o7LCJmNz2b<>uG|vLAUIx>P05Mys|93*=`4z||Qxb<(*oQl%l94FIPDxVCa7 zaH_%Td)|(Yfg=E>AvCnBcv)-!n_ABcjy^R|m#z`Q1FT-McO?Gq`v+k6X9ib?^xg?+ zX9NE(mqg%^e>eL-4duZ8WdJO11t6s_j!Fe1O~AZgj^-*jx@`^PBrM9hP%~7dEK;!~ zY<~&C#`)A2yP?|db23~l+w9yTiHx*4KMVJHYy!9C09MVq(QsVC_r)=a`a&{e%ciwGy9HDQvIpRLFR16LD_7K7q$ zQ><98$=tJ*3HH9eAAz>_Kui>wo6>9Avh1kAihfK=i!|~pf9VwHV$~mDW~M4$yC$ky z+_&2!V&fLd%YlupL=xVJL?3Ha&hc8)+9`*#MmDf168cUh{_fVPFPGSB`Mt~4bJ?+cps5~skwHMIbCZ&BHlt_|TN z8%N`^1{it}8eP8|4zE-z;;A(aVqH^|91NM}jJoh5ZdahMl~r((lW%1uBFKk)Ei0CA zhvup6X={}lcW2!7H4UD@=4K$wwykyOnpn!`Vzfhz+$6i@?))l$zqv!$QPFyLx0X*a zapci>W4=&FPb{dl87tLnBIzoXZU;u_-c1K`)z+##Ch}I znwTr=JsUA@*rC*WAa{tvREUm0VGM?=ID?vm5jT~26GUOUlhw1qVk0g zW$A3xI6l~$Vx}u4h1AxS270`7LWN34Tst2u+BEL|G5l)m6d$2$CwpG~!Jc11WCPU` zWjR^>{io2a{v9U!%OVkiO;Pv|UoD`4SVGUSKRx9na`;~pN@4Z0y**^Sd};0w(p_Z_0L$!n}E1hm2t=o}b9Q zAED9^kJ!l*A|NcjtXRrpt8KF6WBTPaW?EpaY`x4b8Y4$k zr5edlVDTAT;Z(R%ON?rJMR24=^Mpt$*>MW%F*u6I^8%l(o+cWSR2s|Z_S?%oLmbNz zKN@AN6^O?WS5o>Cz9o1L^zuejhzAEaI|#IQ6q7T!M`h@0|)Gn;5iWof=1V=lBz9dKhX zjwaUpU_=xDglehf!dJ#q8?3EKv*S>=TniVqBG-7IYlr2&n8)(T+%k%BQ?baRpl|dp z`!LpwP>=1jwe}V(j}7@b-J>!~WcD7cgkE3bhF*qO5MKqy1T}qEkMK@%>&sS~Hp-TA z98JT)H@RpILvEdKXr=aP_dUFB-y$M&%e#(f6PSP{njhDow2A;&T zhT-k?i9@Z`9#ANWVA;Rj3|o?38$9-{P-jnh(I-uv*CD45hur(=ligHsxfA(w)ox$| z0@NG4W}0_yZHM~Zd=l$f%Ku?Qgf#NX!CP?+ZObxL;FA?Q^^uko@J={#DAGOk6AqYr)HB7b-CMlN^?C%^Qk8P=)bn6|)Yh`s>B@@0h)lTe z-VftDgD9 zO`4sEs9D317Sv1*98j-JSS%}}e3smr(g`;m8()Cr%`?KL4j%6oZOXI3ZUji7_L^&g zj_B3#V%DW*vu84QRJ~}yZez!znOW&&7;|ob`^2jYcgPa9-P+7g6}j$RhwuBiIJy|) zx5Z8nAJd=3>5b||L>N^FYhO#PEoQ9ndvc_mjmMFGq|SyHS>z_ua^Vncir&!H*Sid? z>6njL_V@8`;6?5CY?gOV!O$bo{0R6Ddz&y+rnB!SW+Fyh;XX;x&G&X^htfMs2Yk6$ z$O+kJlgtAmKx=S#e8(8oBe4OEtbmz{&rZr}$T9dd9 zcfjc?lK0T2m)LSH_HIwk_$MgjRW_~T9#UBw>FC$ti{(W70O-JhaKA1u`0?X9{sW6d z=`|AP5p2K18uQ2mH$W|dtkJdhN=*DD^vtNQ`$)C|?yG2dB&mx^@1(ySs8+ftPg27U z=BE`b@e$ZmRZy-7vBW)3&%_~URh#uTY+!io%^1iZ6uZgbilSBF!5|U3J61a8$qWatY=hdxaHTC1@Gf|ia7Y+2b zHP;oXE8m(pvf->VyNIU3u+6P?TCAG1@#T~%CZ=i?39DXT{QhKP{dQlIt5J#obx9*s zbIsS*gU!t*7{U07nZfR9RpI0Isv}D46(2Yz11ⓈR2M^Gc;ZhSV$4I9a>Mj$k$PVy&;2e- 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%0AE{Yf-xP4nh0-ThP?jRwI5%XIzMsFm`j*YG z!uKb?r&)swe5jl2Uj&Yj4d}tg3KhPW2U;eI;cxm^Sv8^ax{%6hU5~=y6bS@jPZ91raVE>Oyo>rh#=eJ#bZSA`2Mes`Y2r|AWTX@8s$ySVhI z*V|MH5r*mHy6w?X&6EobrKQiK_?wX>UnDX>- zU-K=l>dU$_MGR6Ihg0du82NfX2PpctuCDDaVS##gy-G|S8&yx7C|D_x>+{EqXb=L) zgPA5>^(8Lm4_Nt`VR_Id9b%2q^(}F0jbfo3DPK^ff|c**&lclfg>~n7OY!2#Q>Q^* zGUv@$%Sr)3zh(aMR{ZqY{8yGf^~?&}ftE3-{L!n80UO^#YS7~pFNcU7CdRx#1D900 z^7f9JoEC7P{Z*CKIQUmRM{4h0ZPo+>%BO_gRb<&Gg1P#(7#w$PZ~m%{6xdc6K6u*# z)_@CJc;b3(_F|MnakC&ORQr7S!wNvY};z zZ+Av2lolZ?Ys2PO58< zJ?iLmfyA{Qetq%Jy$y&{N>0J8@?X@>`p9t=lDuV3t=QFfu)c{u?2Vm_TO67;o5x6+ zgxl9upgzx5fXyE9R{zj9pu;goXO};DJO+oYCba%x4J=&n@S#bvZPZu7zR^I)t=x0Y zAmapwpUYF8rhC2igLWuqEgYp3Ci<#Yy0vhRBBtu^)P(R8z3zD*h^Go`hY8;j9Z~kF z8Y7JX4alIXXsDRj62j>!C%V^MqJMBX5)#|4zO2o(==xHUepteAOqW;IOr>6iV7`Zt z;=)>n`3bQBcgMXCANkffabw}qrx{K1kJzFfojXp!3&F;o^e&iBmH*xvSv?clx$kAq zsuKG@L@^Yw?kP|LDDX%s8_Zlh>^`HM^gV5$=VYH&weREm!IRT0)t7~r%rqQTR+g)7 z+a3V58OAGKc6Bp}xF9Nm>zmmHP)Z(Wd5kn&3}q&c*G;UBTWR5=!<>mq)7G9-?@>Pv zyFFLpWCQum63ZewCT(lZ*LbF@u%hL|WR@k?+PsL674ZhG&6_Lyk|tDCI#4fk8%J>q zhonoDm3$YPeiq3hyu$H>lnTLoYXuOZ7i9bDxrA~2u3f4M!@;IJ!nE!2_)%Mb4&%v^ znQL)0MJ2r~kLEc((Y2D~SiyX2r?ziltb8gdwfBmDR5)oR+`!CZ0l8M!0h&F-Dk=WP%w}b?%2@L#mVvzG9SBMP zE&nV+(94z_9iGz$6~ZOJfnlT1L8+$gPt$e7eS+%zT?#Mo?jw5=DR`n1Y;tRQc+=P9 z$cUQ0lg{!C9=8{f)KCG_&`FuB7)yr=dChBFBPI-X6&TCNi7Zf}(={pPPFUvJauce~ z@gCO!rSU&N$erOOB2b+Z0;q|w@O%M)R-(xr8? zdvw1ZzWC{9US=X=AMTBLhSvFzuQhMVN0(G->t%)?a=qTxK56YV7|{yGsyjFs8X#t> zw@b$+-Zgo<5y1L9-dv*ja!w~MTfegDzAfiNPwd$p9^!kdsr1MuNu&?_M*H*5!TeKL zYSVyjaNL6jZDjH0+?xMr(cXb@b3h1p={FJZWkk2mh52{mOtfSD?}phyqBjr7$ejfo zRS(RG3k%$EN&{R8_1h#(Oe>h8ESs(1C}aD?&1_@h|f!g&sQck)Ly_kqOY5u66&LaJ|VdMc{yBhh&sV`ctn|| zy2AXM^Yu*l7VNM`?ZIx_wsYHm E0S~zARsaA1 literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..60cbe7a71b18b647e1efeee448172853887de9ff GIT binary patch literal 5418 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 D5d-{u literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..96215b7663446b9b1934f56a08fa5a765dfde49d GIT binary patch literal 5386 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 az~47MY5YG3zz2cAZx=l!Lig-Bu;<@2Ldw7Z literal 0 HcmV?d00001 new file mode 100644 index 0000000000000000000000000000000000000000..83e2a10e270f67698d7cb5c3d5c8971a0789d30c GIT binary patch literal 5384 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 N^r3)t=+Kcv{|92Yws`;m literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/dir_lost.gz b/tests/ubifs_repair-tests/images/dir_lost.gz diff --git a/tests/ubifs_repair-tests/images/good.gz b/tests/ubifs_repair-tests/images/good.gz new file mode 100644 index 0000000000000000000000000000000000000000..0611528fce68959068509fda7ccf420e757652ae GIT binary patch literal 5251 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/inode_data.gz b/tests/ubifs_repair-tests/images/inode_data.gz diff --git a/tests/ubifs_repair-tests/images/inode_mode.gz b/tests/ubifs_repair-tests/images/inode_mode.gz new file mode 100644 index 0000000000000000000000000000000000000000..e82fed94e6a84f8f8149d872e6fad8704b1cdf5c GIT binary patch literal 5383 zcmcgwXIRtO(&y?`R#`oSr9})L8Ti)?+Ly4 zMFa!{q$Ltc=q*5KA%ukdU-$jA&t31=J0H$7XXZTT%rkT5ocWD-)GxodjYT^19Cq{a zc5;Toe+)dU6US`ySwQC|`j*tqa=lo|cz8F2Bmw{J<-44%9^v0IT{WvKFVcR!>|E4( zD!D92+v-|(vx~4qZ+h9=owhjmJ~hkNkHHq`Y8OPew`&cNcwouzR%g!`5Krzj%I1e^N;?T6^UD&z`*U47X8_>;x#|In-EaUzvRt0AdSuN`F;8}X+Vwt+Bj^>RZ#_wXDcOnD zU-7D6t;eta@%na6x#xqV+m8g@ffljHa_@Q`jyOYdWs=ikC>m1J=dH@xUv7lH1&Qt7 zhZvY*N!8H~&vTnSop7avGfP5bmQOY$7*= z_~`@N`FkgmUhzj4xq9cPrmYV*p#uy1i*pV;2Z=ZPxgQe{N<<#|e|KbCP6EI`4*wIZ z{=?%LIg{$U2?xMmaqCtF|J;2%;-NAJz!q{Dz@8PIEl%>j3Q`T(70GSf!qA!p2}M8b zy+xutExbg!Er5$Y_ehJ_{<`y!ed8J>Ghb<@EKSisV;nhv@oS7$Y>9p15pc1P9fc5Z zD)(}LV-pO;GZKh)5E`3tntz@)QBX=HJyL<@2lO4E;pXlIM$c^5chkNFTgeJ^BopGD zPPt=KWkfFzA39s*7ugi6Lps;~y5{=s1@mI^Q=irgrkmfbMDucgFOZr9f#Yc-f+Y%O zlCkfgiZT5Ks#2a%-wVwY07YGJ?Q*JifF~FPMYQ;W!pT%f5~bor0JogBt47b-YL=P= z!{1GK*p;jX1tXf`bz~F?!me20s;|h2T}rR2;35f%E3Zmwo`-5mq7hz=icnqD zdZc7>`2DoA(LSf$H3NU}l+av-M!Ruc{2-e6)kpI#vdMv-X(EzoX+k5K$d=g1)I@cw zo?V9$20s?OldaW_vN{PMpgNO=&08OsFIU*hxs6UKSvtL@McE|d9REi}bM^7$>%%>4 zw#ZLIwPCmwybsI^JdE6q(oHKw=>%1TiUi@FPTs9kkCIgnw&G=RPzXm;Zc1pL(s?#<) z;%uycb?7&ZxSZnemF=AgkwuvSo;SQeE2hJC$!9DVL=nc4=xK)VYcwx{3UN-Uu01AX z#yBAq4k+6nym0>vCYuS`Rd7Ekm2$<=oW6-Se9@XhQa&+^Apjl!ygf&*TaUd@fn ztROx=2omTd&HOoTEJ?#co91eNXO56fZLx+3`mI|*;@6KYj(jNNnw%kF)!o0TYB{Uh z0Ma=Tp!^=47VhD*{2ZqoS{gwyRpMkLIDf8He^aErS_T_cP>jv5g-ZOjK^YeShcQ5@ z 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 S?~fI>kmYM1KOUZ=JpTurzoe1? literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/inode_nlink.gz b/tests/ubifs_repair-tests/images/inode_nlink.gz diff --git a/tests/ubifs_repair-tests/images/inode_size.gz b/tests/ubifs_repair-tests/images/inode_size.gz new file mode 100644 index 0000000000000000000000000000000000000000..ecd7f78e0c9e5ffe18905a903acd50bd5d8d42f0 GIT binary patch literal 5384 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 K*tKi#u73f_9;hz> literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/inode_xcnt.gz b/tests/ubifs_repair-tests/images/inode_xcnt.gz diff --git a/tests/ubifs_repair-tests/images/log.gz b/tests/ubifs_repair-tests/images/log.gz new file mode 100644 index 0000000000000000000000000000000000000000..6e6c8a8338af294b7c4575eff355e1f871f41406 GIT binary patch literal 5232 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/lpt_dirty.gz b/tests/ubifs_repair-tests/images/lpt_dirty.gz diff --git a/tests/ubifs_repair-tests/images/lpt_flags.gz b/tests/ubifs_repair-tests/images/lpt_flags.gz new file mode 100644 index 0000000000000000000000000000000000000000..546e9326b5039a65429f5fa45e8b1f0e3efdbfdc GIT binary patch literal 5361 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 IY}mTtU)`Oms{jB1 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/lpt_free.gz b/tests/ubifs_repair-tests/images/lpt_free.gz diff --git a/tests/ubifs_repair-tests/images/lpt_pos.gz b/tests/ubifs_repair-tests/images/lpt_pos.gz new file mode 100644 index 0000000000000000000000000000000000000000..39c2fb10902958e2d6581c2dedd3dd70b89d3fe2 GIT binary patch literal 5374 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/master_highest_inum.gz b/tests/ubifs_repair-tests/images/master_highest_inum.gz diff --git a/tests/ubifs_repair-tests/images/master_lpt.gz b/tests/ubifs_repair-tests/images/master_lpt.gz new file mode 100644 index 0000000000000000000000000000000000000000..156a2741d2b352933e7eb5d6f4b49d03aaf45ba8 GIT binary patch literal 5035 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/master_tnc.gz b/tests/ubifs_repair-tests/images/master_tnc.gz diff --git a/tests/ubifs_repair-tests/images/master_total_dead.gz b/tests/ubifs_repair-tests/images/master_total_dead.gz new file mode 100644 index 0000000000000000000000000000000000000000..90a2ba266562d58b7e29f52d907095d3c2b2cb43 GIT binary patch literal 5033 zcmc&&c{mhm+gF`Z9EnI-a!v}B5}L-ENm_fIj-0*UEt=znktk%<$0%xbVoHU(Dv{Kvz0vmf>Z`G+pJ zrc}1)%&JNME;1*kVG`PJ8v2ivv+tgjT0TE}Tm0c3+IiIf_PI~~;vxz!da%wpwZH41 z=>xdRlcOIuUE4fe z`(V#9QmWVfLvYH!lFNB~k4p>*dy*zGY)mE0u%o0end|C>gGIB_t|lh8`-4Cwk-yMw zWwVZmR{a=~80qJKe4LL19JLd3lXV^$xp7IO1xzLMy_gFT=9or%Lqq+=mMAA6`~L;m z<2Z@=EAL-1UuB5=fVk4sq?O)nxhnJ`laGbrL$d)KwF?GzCc?6gGwS`Tbhv$=og3eq zLkx=-is~dk$U;dSN6p{{FWMK@P@X&|;2@|dz3{Wb>$nw>A97luO=M*t{nK?f9K$6x zgj$JO(JZarlejAU5Q@{Z$08LMyBF*@ALG3`73`zaMy&BloFCe=oR_g=f4SZh5h0f@ zKkO$O+bA6}qvONd~>r)r%XZ6?>x z_CY~gg)u!&Ql!@yh$3X+h_(pH1`N#o|T6|=jw?r5F?ZEiZRh0~S z!Va2}yTr-oaAy7XzOHnk%Fgn6dDZr$TT=uJ*3D|gDvoWk7(Bt4!rVD5w-X>TzF}fN zEnHo7n*Veo4$sA|odSI*Ut#j+d77K2c9K`x2R5<8Sdbh9#JHZPK4{DC$F_Jl)6C#`$OxYuWq= zK2nb>^=cDv{r>RV z?9z*(%@PEG_V^u92B!8H1-kV$&j1yPlc`F!V?`GO2A4P`Da!tV*>S~LZ-c@nb+A~N)#Cbp>Yt#BvefgES z``PB3+)YMg(e&uh=7EKir7U7pL2+@Vq20vec)Uwzy(PhfHf^d2{RHOZFe(et2RTaH zjqHz1Ap(Q5al+B_z3o&*RoUAEUUKEJK6m1=LX9hc(NBY3eT5UIyX8_5kbZu>S4I+S>h?3xcuJ&-Febfx<)4T z*N5as)p!uaC`4Z*^TN8wIA8GELL)J&M4*xmvDr3C+F_=;Ja z8RMI!{<7pvp~!!5-~mzM{TY-P`&RBU=9sP|$9&EhkS|y>hI1x5)``TXCQ&Q0Bvw=fM#{cz}k3{fav!U~L@(8}8<61p6a;f+kn;*Q6 zfdorIk}Qq>A7c7%GPtQszIva}7+-z{tYm_4`P&Kz2yme{|5wj5=m{ITOdaFv3%?AF zCX(;wL-((xhYzzx$)c50{)sKcZo{Ec;x*Y)+j)K$ZcbjfmbNJ!Z~;CRG@x@j=X;rb z)M$E5hfC5-k&08t)}ZD7Bzl^zpHBVY=PH?8vW~8Q_p;G)?!5tMBqDV7R_**YlbvH0 z=tO5(c8rd%sk&%g?`<|~1EbE@V5=g8%uVaI2IjrMZT1sK?f^i3B84k3z282JAp}v# ztmtRcft$LF$guDEjJ5#tpmOx;v&4XpLqWFQv$JoPxX$b66LRYof?58xLoly-)NZw3 zORbt^mfJz{MQHHNQK990FB|cI+VGbXZmn@%O)*ph1=$+lbj9%oZ^N>@%jH>ewjl5P zz0KarB2IY06(%sNb@$+%=+ZcK$YRs;Dfez5yi&}u$#m?81}A@PLveWS9PgV{bf2%g!5f6n?7m*5i|8gl!J)aS+G>gXg{O~5fP-H(Ub+uNs zFHRc5SPlkXU~0QZPEGptWaurd9_%^fUC>JeA{zU@1m1Kl_z*Jems6X(`$kL0Zy{&b zPOdxua&1>NXi5UIOT{P0olaMA4Xs&jISxsN3>+zt;*CT#zxxoFYa>=8>@+{n!%D@S}-%B z`HuKn_?MzQ$|smJ=_=`>p+McY{^c4A?Y7({guv*f_r(YEqFjaq|n7eoZ> zbe%!E1;SyQWuy2T9C zD8E*lsY~JEs0VIIY8-teSNP|(bVpTesFNT;#n0XZ| zo|ByHlDaJK4UEL?iDNoxp|_RT2x#giFUgprGSVWqXr28VNN6j3+6Ex0b4t+b<3w?Y{fVDKya?YoMkU$K2NO#p*g`D{AiXbeDs0Czvj_|;QiQmaI1yW3*&=>^^UA~XBXPFQeZD-OlAr#M4{8Ma}iSTvaOoX z;WKQ(!Guc$fO1LJ{DMUEnTBuomxW198E;Od>+D!xT&eRo&yd%s{lqTTVyM!U(v^9`+2LsH%h}sdYwz#K8JoGB0}ll%~AcAwB6nXCxzd$ zUGaxe&z1KMfWt2bfFbv{F4VB83hY+2tn9SktF3J4K&>439eVXr3&o}`r01AI&Eya} z>)zlgM$ZG=(FYF5(Xr~QU$nQ|DmW&>=}qguztTG4MjniKBzG^W!u5^UMo9j`X+$0X z697u*6%0xc)!G9x8a2HmKlki8#3-8UW_EJs7hjIa=eNDYUrm2ab3%@JOs1M1Iwy~X zM0_ETA|NcLNZZWrof&4oCkJWV=z4-ucS`+>zwv!2cna>tL-M}sG4Ep<(|{_=j7g#n z@cRus+_nT;-xBg3axpNEGNx8hG5H7jd(9|;vGx7HJ)MZ)jP)XBe|ZyDL3{^usVHm% ztYf(#wA2Q8?ki`ljsw33Ev)tLx6FU_Xy@&Fdv%1}x9Yn2`jJ=oW>_fgbFp74^0;;r z+yOkqNXfyE6ilj+Gyn#`tEieMuu|ezf1kli z<8}D$7f>1fNE#$2?M0^~WyahMj78Zb=OOhP59!Hcf{~1bQ*4TLa%=s`Rj2E*e!Hb_ zCLiZs7VgjAxpwLi)2(H-zR_kvZVC|UO?Y~1ZGW}=?5PZP>N+z_IwV=n?I?ibK>?r@ zB&#R1)V6m4u$e}k3FiWwPV^USBHJz9?;-it)*|o4XcZ1x zEK39QcP(H6ZClePS23Y=d=KI7bMdYSnIab-5|a2bwc$&xEgKj;=Ze4fjkw*tfPGk? zi|F%>!vI8cvkBF*tv=1mL)~lZen4OA5X0Dlb!r94Wv-LV%*~A#S#ghdRo#SdWs|lF zPu9nzI~I&RTF(30s)@j(l9PcLHKGvPgHtBf_asc_nNM)tZY6g(k{Z-sb7wi=&C259 zH+o#;`nQ=5*-XV8_~_Qtjr@Ju(W(_DP_%L|w447in^d+Z4Zk4WqHN_uW%hyfj?cZ7 zzrD#D_qk!6E}xTj(jjP#=GR*AaPYMH^U?L0I?q&7zXTO{BDUj^P>fAwrIs z&gocYk)AnZuePon(pE*PSo1&aW}3tmc-egiSD7j$AL*z-pPcb6h^OOHqtO{qx9`Y? z(ZLg4*r&Z+$vN8xud7xH4^l*ABz2e;?oh(Nzvus&rMRG&h#x}M$FTciYdx*sKn3`Z zLwn?)k2N3m8EI*Ld6BUAG&9rY=+X7d797#$FT;2d!568ivQZ0Zh)XD=wB1<${GAw% zH>5m{NLTsybe2}x$CnZoS>#(@Bx0+GqCd@SP=h->Ox0^Hzk74;k87Rv%YjcR+J@RS zsW=|%=B_?@xeWQ_Q)E3bU~S{Kr@zH^HjGDIlURMF%CdD{JL}zd*>(Z<|}k}o(t{JjCTZYXlf11Z?dxC^Z3`qg3mXL0js@pI4S&x zL>ey^qUQKz@W^4Nk%MZlAiZKUwZO(r{p5-cQ{8 qkov+u@IP%gqBnomP%_}$pU?$LmH0m)2rTOzsNeVbqJY35fqw#GBF_x~ literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/master_total_dirty.gz b/tests/ubifs_repair-tests/images/master_total_dirty.gz diff --git a/tests/ubifs_repair-tests/images/master_total_free.gz b/tests/ubifs_repair-tests/images/master_total_free.gz new file mode 100644 index 0000000000000000000000000000000000000000..0394a76baa38bf36eb64df3ff4b725977208d7fe GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/sb_fmt_version.gz b/tests/ubifs_repair-tests/images/sb_fmt_version.gz diff --git a/tests/ubifs_repair-tests/images/sb_leb_size.gz b/tests/ubifs_repair-tests/images/sb_leb_size.gz new file mode 100644 index 0000000000000000000000000000000000000000..9688ccde7201ed5eebddce87d1d21490c9a9ce1e GIT binary patch literal 5324 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/sb_log_lebs.gz b/tests/ubifs_repair-tests/images/sb_log_lebs.gz diff --git a/tests/ubifs_repair-tests/images/sb_min_io_size.gz b/tests/ubifs_repair-tests/images/sb_min_io_size.gz new file mode 100644 index 0000000000000000000000000000000000000000..8871841ebec45687923045e93fbec1e1fe79fef7 GIT binary patch literal 5328 zcmcgwXI#_C)^?W_6j1~PM4Dw43uUR1u8V>o2uKM{Sm`YUh@pq5pr|OI2tf!Sy@N;z zp(7%lNPq+gB+?8JdI%v2$^YGZKi#{#_v<^K&hI(T{GK!A%$ymyghPjhs$Y5@;Dfoj zLVN>VeW9)}-$>5`t22k~#cbtzwy+W>k6Yd}obFT%;&UE3{!{QBE0u$N2X9=r5qQ`Lr$y3or-441|L zm78K%rI=SiBUTeuw!N1w?7S5HD)>ebXwaxBGJQTKvZL_J*-O_EP8Rz&duwR2e|nIXAr!CdOt_uH(B_^O7%!P<5x( z$2;)e{-a_@V&a%Ywb;$fvJR>?#hd{&S8CQ1IFu|Pa!}&z502j12*}~m8AshJQ&@$g zj+=J>Jet1yo2VDBtcs`{zVz+ES-B_yp+noKB-jdh5%Fw_n2RS{7`9*M+^VwXG^O1X zi^f-AT0`dv{tHMYV1_We=P5vQb?$FlFe@SC>y?!`6b%U2L5qehC^bqu)S%R(Y3|B=8ZJN@Plx{>wo;vnBkE_=C z;aQ6Aux(5}USuVP67!t$C^v$`F-qDiEZSw1)_uKG=8xnF5}Dfc_6GyKruB6=;1$Px zj9PYCo6~iTiV!`Q9O$uX0qOj2x;Z}X5{d`=Bb<` z!0Ns?PrD!tvPLgI(r%#Ya*mRj0n{rtkj7J|=3tj`fX*ZjvJe~reaLv)bHqSyT$w45 zfyqIp?*@Mggv;1i_$iCDm(=a1jJ**)@7guMn{F7ZgC98-d5m?+ZMd7}G&PQz+L}Xo zSH#E;UllR2~#bIw2-*H+|P{ zfc6HH^TlYYZ98(WWh%17mZjC@7FM91%%0DQw%?14JJ}ieP-Dk_^tK=7_%_jf2vkdt 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/soft_link_data_len.gz b/tests/ubifs_repair-tests/images/soft_link_data_len.gz diff --git a/tests/ubifs_repair-tests/images/tnc_lv0_key.gz b/tests/ubifs_repair-tests/images/tnc_lv0_key.gz new file mode 100644 index 0000000000000000000000000000000000000000..9a45f26074ea396e032169b9d64bce3e0199f650 GIT binary patch literal 5414 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 literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/tnc_lv0_len.gz b/tests/ubifs_repair-tests/images/tnc_lv0_len.gz diff --git a/tests/ubifs_repair-tests/images/tnc_lv0_pos.gz b/tests/ubifs_repair-tests/images/tnc_lv0_pos.gz new file mode 100644 index 0000000000000000000000000000000000000000..9ba36f97775edd4660122fd6d2b25a3849738df5 GIT binary patch literal 5404 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 T%n#5L_Q_lU`M5)eem(SGOET8b literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/tnc_noleaf_pos.gz b/tests/ubifs_repair-tests/images/tnc_noleaf_pos.gz diff --git a/tests/ubifs_repair-tests/images/xentry_key.gz b/tests/ubifs_repair-tests/images/xentry_key.gz new file mode 100644 index 0000000000000000000000000000000000000000..d2ff24989fda6ee8b181dfa403403fac332cd19a GIT binary patch literal 5378 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 F{1@wnu+abj literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/xentry_nlen.gz b/tests/ubifs_repair-tests/images/xentry_nlen.gz diff --git a/tests/ubifs_repair-tests/images/xentry_type.gz b/tests/ubifs_repair-tests/images/xentry_type.gz new file mode 100644 index 0000000000000000000000000000000000000000..71ef8d9d66b102504bd02c76a271d1f8034ea24a GIT binary patch literal 5386 zcmcgwcU05cvi4k`D58|37!?6MD!oZ>Au2~v6i|8zM0yDw5`+Lz5joOwRZxM1hzOzA zK&Xj@B1Srd-a7#T1Og-^zw3Q(t+&oQ$Myca`>$Cuv-US@X3yTUKgon6M|7s*-47gm z=iKN;^IvlTu&#{_h4KlFMN_7>BlVL*Iv1iT3*^qd@!)WM zgZ|DeIJkC2RHNC0F!)3fx_R6!Am}%qX|TwFpRe5!b~hmObKBK4`F=ndjpqTakGo6U zagslGdxZIg3;f)4AO*|@e)+jg28AX8uqzY4E1?n3f~Ut#?FRQ6(IKg_bCwd+wbPh4 zhZ*rWrF!>^dX`47?e1%y|NYb@fod)c^ZD#o_fN~JimqwjTkj~E-FbM^+O66^J?slL z&VV)F+lMC=7oW!EDvJ$CeW=i8&mrcMEU9Y>pq75P_nUy4(%LE)Xgqnv)a8~*f6&ik zJCG79)C&OBFG{@%B%mvteyG63gY797c@jR~-d}4w?-z8UjwMfxCrut~?#zFl0Uaea zZ+#Xzea|L5$q>v|787IJ`cUe*#aPfiAbyOS})#UuW}SEoKR#0tkUY#O}_Lw zc##%O7(O3wVsz~NMVd>q>tmJi2$O4Wej9^E=Li?p>b=MYPDa>?+eI4sCx^ImHNmQO zTIEQUu|mwfJNK0Hx4Eph8JpV`-^7U}7c-S@^*wch&^D1^)JC}D9KwrIa7JL}ZhySm zkt#^%X+aU6==fp#=J9Kn;l$}C2T@M4+yGofTZ?L|k389$FKh0TutPPPi>PX*AGdD1 zGz;pOL3qFf=vvS?5(_;}(y>=ftFq0=v6xt6jNX~rCM`&Bubj`MY}G}5<>WO4BnX;{ zxiOy&$VcH}P64sg$CBkV{BYB#$-H18&1I^ac++t5cET#6X~04CTK1D-?XYZZ*q!jT z&E~XN9sC?7@K>Lk5kKVN{ag~*Y5WfEC93Fqpy`z`oD1WFx!8LfD80yBt=Lwdl<*CF zat&7aGQIqtYGrp4?2teZEPldld~FHoZAHg=$yd4K6~-||J?9J6|I=a;+Mb5K1yCLqXt4lzUWZm- zZTjVG0Epob8c9^$FZI9u=VSWcWbil~0G0vRgjx!XB4Z&HDym&Yve-H7$+vAGN zpI({xJ*mx?Cl-0lfse=G5Xd{{xc<)!bTKQ$ym8s39a^vbG-@Mjqwv!-Bg6_od}{mS zgNSYw$=5;eJ)lkKO7zs6l&< zR<6p%_hU5#d;>L(`k2SKp6o9Ep2^6Wix3hmiLSThbW!k;Fpn!^%GN7 z9qXO0EFl?$Wo95lhovr7-5hwLJ79`EnY!kz&bj3f^KodeSJ?-V!I{~b@iSj`EQirT zU2k<~|B->=c|i*&WV7X^N@k2089kvc&!%i#$L`GRnWRbP8fP>prz+?!{#hDG6& zMd5k#Zua6Lz1;A(b4KkAHXEeR5=L7t9UKR%9W7mh2l?Zx=NFE?;PH2NqKc}`f+NR2 zyE{*{C5R+-hEAw1On%pBkB@*Xvp7S2g=|%lvJpJfuAwc^Fxyz?&KpM1NV=o^gVN!e zuNk7%&oC>bJ7Xc1_aEt`gYo zd!`}Hs1;|_7`oQSu0G0aKTOW6Dc%r0&P0Zpo@~NP3X8rY-S-a}9qTFtu9O-LfF3F? zy&YR$FKG^4zO4GRHB_{FlV2cIQ}ZaK+B>j0!@wg5#gyjk*&Foj>Z-MO^cP(l zUf7X9Gyq>>ZXo0l-K%Bj))TciKM8@OZ2TSlUrp)sgNN%oUX^_Vn;fqn?@c~7z^;s% zYS|(>RZu+}61mcxx$1j`*b|!lTj~9n-ftt;)FawqZkzBR;8n_+A@<|H$l9H ziHi*;eFd`QsLqTJ*1`D5Dw|oYWO+|Fr;S9ihd)`*m^`?;u}Y00RH;DM_r>t=DlyD1 z+v64qVO64`l&3AvasZJ!{W>s-cCNiE=CdEOR*hnj8OrE+Nfg}X)mt1NwRESHCKpUB zH-UOpE(tOZ1}l(=vH`s^j*X_w(G!4#!4@&cGlC)fCXy;Lp%BVCZGj@W5)rX&!><^n z8TDlgS355_bXs+(vBy-83HldUI1!5U2vu_)&|>@OR)4+BM+ z0F~MC#l**w(XZcgp~9TlDnqf>v*F9s6od4IEF*^o7)hid62u(X8>3h;IG_?)$g)#r_A|5+S5}m2Cp* zclTfK9WtP#i&vo8uVt5uoo0*k=1^n3S1c#Abek2Mts!k{xsFfJNNVYuK7kIeH`ayz zi_0HfDR^U(T{Y*v4>(i%-blCtF{6AwIjXp1D(Trm1n90#8Eut^{dTI`D55k|y@5R~ znm{15m?*4JWtm`-QwGdy*cloFG66}$gw!r$@b8paA0JLv7q^~wGaqrbS zJqFXCH?rIJ;nl#le=ZYWKPoHR*h)~ zlX{_!91cpHiyT^w?r7^R=m=m|w$(XD@WncBq8+Tm*!@6Pf1?%G9^0L0e>RWAX-Sm& zasp<1&X~n+_k5eXup{4!DXxxoddoY-VHzFVSrlA>wiQ^{k>+NaQJHl&XD!D++`u(47==!Io&ZVp{}z!y)W3veP{U2Sn<To%{Ka{D$ojLh)ee$&vE-=Ep$13gq*Q4ThC7PnXjSSe+i=PqVPx%H4BsH2692 zBeO4YO8^?dhnvRvl~p{@|Nfh`yYY?wy%BN&R(fjzAF8Ho&YL_iH`x=#1$sNUvDS{w zzZ?L@{AT+^i9Hd*zo}LQzqXf4Ny%}qiYqf$Z-R_8XZTqO&J@yv>2&lWtE# zBK_@2K|=*B4Zk66NG7oTbx|90J<{=h)NKxB_RK;RsXj9EV3dyG*@>x<%!xtaRvQbl zAm#W4vbg$yKLID=q~GBPxY2vh#%uPxz$^jLgF zY>o7#R2T?~pVNA(KhvOu1W~B(DLRs6g1xy5d(lY49hUD2)(0UCfDv&U4;*Pd9@88y zOQy`PaVJ~4qIH)>K%IVi4KnlrP=KrI4_=|U&?dCH#Ll`-FMcMfa%=ZRi}r*(5i-54 zg^k4cYuE1QYLkCqwH94>-#G4xj@+N$k#2p8gklatiXt@WJGQ*{Np1Dwie`Sc^**k( z5s|eKQ)%T{oVW|M`|Qd2b!=n6v2gr~Qni?|-tqU8oq@ehqG`=#ETb0dy2tj-zaAy! zCw3nVza8m55Ek`sj3{&%F^IX_6)m&m04c?s18&g*{E_$aOr+4fSvHN;vCmE|C2uit zLD8{!=s=@L@{|2%Y5+cZW3z^TgDzBNASmP<)x^}r?sg>U5kt(qJel|om_ESVyb6Cc z-dz8tiHTmBem$^ulz_Uf8V)>gi8QFKW1{E#*g0XXr7(-=DD3I$kv2ZOopu8iM6efu zqnZI+L6g9l+fDJ%@)YXw@YTv5-!sMX#f)jZ20X>Xd4v#iXdtdH4|$ zXatdi<9m_xqNUao_+mkLiZo-ZTm?&6IYYkdli{qWEF3TTb-ydTS6SJOoB0(M>bB{^ zM5$Sq*p2jvh+YyW)ECn0^0RRL7b!|LTKYCnjA&|qc5WBQbD$#zW+nh()J9fBf@xM+ z5&}1sR~jKiPwA-b#V9n2cSRFId9S3i(ccucvA|3|)Se*m2UEU@n~?jaC0Z2Vc}IAL za1wtMcAi2y%B18slKebwN6yWcP9vaG`&Jy_^q(3xP*H4+3-l-dmAflBv<4jhliv^V q(Q*g?`M;_ImUzxz`MY=Q(Z3Of{R_Oml396V^e?WHd_Qpc4*Uz2YOu=y literal 0 HcmV?d00001 diff --git a/tests/ubifs_repair-tests/images/xinode_flags.gz b/tests/ubifs_repair-tests/images/xinode_flags.gz diff --git a/tests/ubifs_repair-tests/images/xinode_key.gz b/tests/ubifs_repair-tests/images/xinode_key.gz new file mode 100644 index 0000000000000000000000000000000000000000..ff0a04f0df22bc0817e3cca97b53824e3796ec19 GIT binary patch literal 5383 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 X-Patchwork-Id: 183604 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1756395dyb; Wed, 27 Dec 2023 17:36:21 -0800 (PST) X-Google-Smtp-Source: AGHT+IGRW+y1qH0e+TTQIshUafbK5xGJOyuCR46lhI2X9HPVnfp7lzAU5W56fZxsAT5bBGB04LEa X-Received: by 2002:a05:6214:19e1:b0:67a:d70d:71b8 with SMTP id q1-20020a05621419e100b0067ad70d71b8mr13512899qvc.34.1703727381307; Wed, 27 Dec 2023 17:36:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727381; cv=none; d=google.com; s=arc-20160816; b=vq2Ubzzrxg/vADFtltLI9rTlWsZT2SsMkXWtA2xivdtsANocnFAM//ALIFh21cwNM1 9ypF7ZPu89s/rRGIAh1ZgjzWgZYaMmmW9drOchR29WrjReawNRdT1BM1steEhSIRTxUB JuyjaWhEnWOCGlKN6iA43cZCShPQq7lROfQd2/SimohEV0KNAz1t9Rb7AMiyDlY4qorD eIiM2M3925xfEdrDWfd4DbNXoeRxuiujgcevCVIhPJeu/PGDxTXPE2J51C/xTYGQwJh0 aR32gL53tPUnTuWm2aGQ4tDQMHqnwIGA9ZUlJ+vl4M4y04UOGT7yi4w+e5VDsvRflBD0 W59A== 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=t3Hye4NzUp+Gdzkn53ers7mf+Cjk+o10UDdFw7sVAlQ=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=JOqegMC0aqFUHWXjsmmGRiBnqq/ZNRDZzlXbLSxIuVDcghBrZdUb6WFj1F+/90ctqL 3pbN9tdEbbjwpQywfRuTUaDi7KzIR2Dp6dqD2772LU5CBknrSsXbLQFNO+8BW1i5wYUY WSv789Hibp5ly11IYQZdEkRWZhuoeIec45KeJGUVbXxa/DSIizkqHGEGC0BpYD1Gw+cv Z6FDxCzV2QG6QgmSHDPtcbgTk3tP973Mycyjd1IpJWwAlKVu8tcG80BXr9QKT5L3I9Cb /CsfB9lrSSn45xsYdm7a/m2Aa0Ou1hqfvFXMx6oMmDQcqy9xbvqfuyA4qhn9RvFYHthK 0ndQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12346-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12346-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id b12-20020a0ccd0c000000b0067ec2d04818si15451340qvm.131.2023.12.27.17.36.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:36:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12346-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12346-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12346-ouuuleilei=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 ny.mirrors.kernel.org (Postfix) with ESMTPS id 195A11C20CAD for ; Thu, 28 Dec 2023 01:36:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C47BE63DA; Thu, 28 Dec 2023 01:35:11 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (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 8F7CF6129 for ; Thu, 28 Dec 2023 01:35:08 +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 szxga05-in.huawei.com (SkyGuard) with ESMTP id 4T0rd630Bnz1g0DD; Thu, 28 Dec 2023 09:33:46 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 7323C1A01A3; Thu, 28 Dec 2023 09:34:51 +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:38 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 10/11] tests: ubifs_repair: Add run_all script Date: Thu, 28 Dec 2023 09:36:38 +0800 Message-ID: <20231228013639.2827205-11-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487642434450870 X-GMAIL-MSGID: 1786487642434450870 Add run_all script to run all UBIFS repair testcases. Signed-off-by: Zhihao Cheng --- .gitignore | 1 + configure.ac | 1 + tests/ubifs_repair-tests/Makemodule.am | 1 + .../ubifs_repair-tests/ubifs_repair_run_all.sh.in | 59 ++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100755 tests/ubifs_repair-tests/ubifs_repair_run_all.sh.in diff --git a/.gitignore b/.gitignore index 89bca58..0d9be34 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,7 @@ tests/fs-tests/stress/fs_stress01.sh tests/ubi-tests/runubitests.sh tests/ubi-tests/ubi-stress-test.sh tests/ubifs_repair-tests/lib/common.sh +tests/ubifs_repair-tests/ubifs_repair_run_all.sh tests/ubifs_repair-tests/tests/authentication_refuse.sh tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh tests/ubifs_repair-tests/tests/powercut_repair_mount.sh diff --git a/configure.ac b/configure.ac index 1c1c95b..94b60c0 100644 --- a/configure.ac +++ b/configure.ac @@ -356,6 +356,7 @@ AC_CONFIG_FILES([tests/fs-tests/fs_help_all.sh tests/ubi-tests/runubitests.sh tests/ubi-tests/ubi-stress-test.sh tests/ubifs_repair-tests/lib/common.sh + tests/ubifs_repair-tests/ubifs_repair_run_all.sh tests/ubifs_repair-tests/tests/authentication_refuse.sh tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh tests/ubifs_repair-tests/tests/powercut_repair_mount.sh diff --git a/tests/ubifs_repair-tests/Makemodule.am b/tests/ubifs_repair-tests/Makemodule.am index f728823..6030a1f 100644 --- a/tests/ubifs_repair-tests/Makemodule.am +++ b/tests/ubifs_repair-tests/Makemodule.am @@ -1,5 +1,6 @@ test_SCRIPTS += \ tests/ubifs_repair-tests/lib/common.sh \ + tests/ubifs_repair-tests/ubifs_repair_run_all.sh \ tests/ubifs_repair-tests/tests/authentication_refuse.sh \ tests/ubifs_repair-tests/tests/cycle_mount_repair_check.sh \ tests/ubifs_repair-tests/tests/powercut_repair_mount.sh \ diff --git a/tests/ubifs_repair-tests/ubifs_repair_run_all.sh.in b/tests/ubifs_repair-tests/ubifs_repair_run_all.sh.in new file mode 100755 index 0000000..bb95369 --- /dev/null +++ b/tests/ubifs_repair-tests/ubifs_repair_run_all.sh.in @@ -0,0 +1,59 @@ +#!/bin/sh +# Copyright (c), 2023-2024, Huawei Technologies Co, Ltd. +# Author: Zhihao Cheng +# +# Test Description: +# Run all testcases under 'tests' directory + +function print_line() +{ + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" +} + +TESTBINDIR=@TESTBINDIR@ + +print_line +$TESTBINDIR/authentication_refuse.sh +if [[ $? != 0 ]]; then + echo "authentication_refuse failed" + exit 1 +fi +print_line +$TESTBINDIR/powercut_repair_mount.sh +if [[ $? != 0 ]]; then + echo "powercut_repair_mount failed" + exit 1 +fi +print_line +$TESTBINDIR/cycle_corrupted_repair_fault_inject.sh +if [[ $? != 0 ]]; then + echo "cycle_corrupted_repair_fault_inject failed" + exit 1 +fi +print_line +$TESTBINDIR/repair_bad_image.sh +if [[ $? != 0 ]]; then + echo "repair_bad_image failed" + exit 1 +fi +print_line +$TESTBINDIR/random_corrupted_repair.sh +if [[ $? != 0 ]]; then + echo "random_corrupted_repair failed" + exit 1 +fi +print_line +$TESTBINDIR/cycle_powercut_mount_repair.sh +if [[ $? != 0 ]]; then + echo "cycle_powercut_mount_repair failed" + exit 1 +fi +print_line +$TESTBINDIR/cycle_mount_repair_check.sh +if [[ $? != 0 ]]; then + echo "cycle_mount_repair_check failed" + exit 1 +fi + +exit 0 From patchwork Thu Dec 28 01:36:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihao Cheng X-Patchwork-Id: 183605 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1756510dyb; Wed, 27 Dec 2023 17:36:37 -0800 (PST) X-Google-Smtp-Source: AGHT+IFyX3UpET1KR2y0vgnm6agNZHWSvk2nOWFE+Dsg9hYCTKiFi4TejgLzHMlkCYLJUwVup+50 X-Received: by 2002:a17:906:7399:b0:a23:68ec:a863 with SMTP id f25-20020a170906739900b00a2368eca863mr4208068ejl.87.1703727397106; Wed, 27 Dec 2023 17:36:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703727397; cv=none; d=google.com; s=arc-20160816; b=lwslI/TTUQ7cRV/jlLDPDcNYawvThPS447SqgeZOYN5ASktk8NQaNbIqDZ8n7pgXxg vq/LXxoS436mqvaM+7WdeJ2Fdngcu2dmXB9MXuYYgRBZwC5YX6eI2YXFaFesPna2CsB2 /Wq4PjPryImyaejf5bfYEp2Uv1QAW9EhDiJrP/odUthDj2cFXlZZlZxV8y0+8FGjr06x rdeCDHwW66R2AWHDJtdJNmBcexhThfWMBP32bIi/JWTHV1u+YSGlZ23Pr6FpMxTw87+m nf8o1vaUHtHmP8pawB75jB7boC04O0P3XY15mKJdK2Ju52GUy4H5zZ0nuNzKIjjRh6a8 Xd4g== 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=C5PDIm0UJdOB0z/OZQ1Yyc0zRsaIubJKG/LZC5/IYmU=; fh=3kaVOPShTC55oj708yh1yJALapWuogKx6Yvc3sQq9zY=; b=V11/IVuegh5oOLRNa+BfxqDqatA5LbE5bhaQgghJdXEefv6UQuP8TjNSjigZSo2uuN 2UMm9D6QHAvHrhk+c8BW+sPp/SJXPjK5CNfvurEo573sTckc7B6nSmSI1SXdoV3Er3Up R41NXcyoHrOXFHdpTyfrWrLTQ9ObD26lPo5Uh3pkLfIouCXrM4a+7xwv7c2k13Oljlrq xrBos+s5D3R0AWkMnCXivnbfDDUged7KRdoHm3UU0ekwFuL46mAELT7Y7wIc9sLoq+z0 dpWNqhmglcZAfMXoscRrKFWNWs4iTm2ogLxM3c4BMv9alt/UpmtVphF03ps8clFXJFpI RUEQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12347-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12347-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id h4-20020a1709063b4400b00a269fa0dd09si6574922ejf.242.2023.12.27.17.36.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 17:36:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12347-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-12347-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12347-ouuuleilei=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 am.mirrors.kernel.org (Postfix) with ESMTPS id 8D31B1F21276 for ; Thu, 28 Dec 2023 01:36:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9313E522B; Thu, 28 Dec 2023 01:35:26 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (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 4AB571FAA for ; Thu, 28 Dec 2023 01:35:23 +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 szxga05-in.huawei.com (SkyGuard) with ESMTP id 4T0rZT4Fp9z1FGKj; Thu, 28 Dec 2023 09:31:29 +0800 (CST) Received: from kwepemm000013.china.huawei.com (unknown [7.193.23.81]) by mail.maildlp.com (Postfix) with ESMTPS id 7F2A81A0194; Thu, 28 Dec 2023 09:35: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:39 +0800 From: Zhihao Cheng To: , , , , CC: , Subject: [PATCH mtd-utils 11/11] tests: ubifs_repair: Add README Date: Thu, 28 Dec 2023 09:36:39 +0800 Message-ID: <20231228013639.2827205-12-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 X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm000013.china.huawei.com (7.193.23.81) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786487659412240902 X-GMAIL-MSGID: 1786487659412240902 Add document for ubifs_repair testcases, explain all testcases and how to run them. Signed-off-by: Zhihao Cheng --- tests/ubifs_repair-tests/README.txt | 233 ++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 tests/ubifs_repair-tests/README.txt diff --git a/tests/ubifs_repair-tests/README.txt b/tests/ubifs_repair-tests/README.txt new file mode 100644 index 0000000..cb1ce98 --- /dev/null +++ b/tests/ubifs_repair-tests/README.txt @@ -0,0 +1,233 @@ + + ubifs_repair tests + ================== + + There are seven testcases for ubifs_repair on encryption/non-encryption + situations: + 1) authentication_refuse: Currently authenticated UBIFS image is not + supported for repairing, check whether ubifs_repair can refuse + authenticated UBIFS image. + 2) random_corrupted_repair: 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. + 3) cycle_corrupted_repair_fault_inject: Inject memory/io fault while + repairing corrupted UBIFS images. + This testcase mainly checks whether ubifs_repair has problems (eg. + memleak, UAF, null-ptr-def, etc.) in random error paths. Besides, + it provides a similar way to simulate powercut during repairing, + and checks whether ubifs_repair can fix an UBIFS image after many + repairing rounds interrupted by kinds of errors. + 4) cycle_powercut_mount_repair: Inject powercut while doing fsstress + on mounted UBIFS, check the consistency of UBIFS after repairing. + This testscase mainly makes sure that ubifs_repair can make UBIFS + image be consistent in common stress cases and powercut cases. + 5) powercut_repair_mount: Inject powercut while doing fsstress on + mounted UBIFS for kinds of flashes (eg. nand, nor). + This testcase mainly makes sure that ubifs_repair can make UBIFS + image be consistent on different flashes (eg. nand, nor). Because + the min_io_size of nor flash is 1, the UBIFS image on nor flash + will be different from nand flash after doing powercut, so we need + make sure ubifs_repair can handle these two types of flash. + 6) cycle_mount_repair_check: Do fsstress and repair ubifs image, make + sure all files(and their data) are not lost after repairing. + This testcase mainly checks whether ubifs_repair could corrupt + filesystem content in common case. + 7) repair_bad_image: For kinds of inconsistent UBIFS images(which + can simulate corruptions caused by some potentional UBIFS bug), check + repairing result. + This testcase mainly checks whether the behavior is in expected after + repairing specific inconsistent UBIFS image. There is no debugfs tools + (for example: debugfs[ext4], xfs_db) for UBIFS, so no way to inject + precise corruption into UBIFS image, we have to prepare inconsistent + UBIFS images in advance like e2fsprogs[1] does. (Goto [2] to see how to + generate inconsistent UBIFS images). Here's a descriptons of the various + test images: + + ========================================================================= + image | Description | expectancy + ------------------------------------------------------------------------- + good | good image contains | repair success, fs content is + | kinds of files. | not changed. + ------------------------------------------------------------------------- + sb_fanout | invalid fanout in | repair failed. + | superblock. | + ------------------------------------------------------------------------- + sb_fmt_version | invalid fmt_version | repair failed. + | in superblock. | + ------------------------------------------------------------------------- + sb_leb_size | invalid leb_size in | repair failed. + | superblock. | + ------------------------------------------------------------------------- + sb_log_lebs | invalid log lebs in | repair failed. + | superblock. | + ------------------------------------------------------------------------- + sb_min_io_size | invalid min_io_size | repair failed. + | in superblock. | + ------------------------------------------------------------------------- + master_highest_inum | invalid highest_inum| repair success, fs content is + | in master nodes. | not changed. + ------------------------------------------------------------------------- + master_lpt | bad lpt pos in | repair success, fs content is + | master nodes. | not changed. + ------------------------------------------------------------------------- + master_tnc | bad tnc pos in | repair success, fs content is + | master nodes. | not changed. + ------------------------------------------------------------------------- + master_total_dead | bad total_dead in | repair success, fs content is + | master nodes. | not changed. + ------------------------------------------------------------------------- + master_total_dirty | bad total_dirty in | repair success, fs content is + | master nodes. | not changed. + ------------------------------------------------------------------------- + master_total_free | bad total_free in | repair success, fs content is + | master nodes. | not changed. + ------------------------------------------------------------------------- + log | corrupted log area. | repair success, fs content is + | | not changed. + ------------------------------------------------------------------------- + lpt_dirty | bad dirty in pnode. | repair success, fs content is + | | not changed. + ------------------------------------------------------------------------- + lpt_flags | bad flags in pnode | repair success, fs content is + | (eg. index). | not changed. + ------------------------------------------------------------------------- + lpt_free | bad free in pnode. | repair success, fs content is + | | not changed. + ------------------------------------------------------------------------- + lpt_pos | bad pos in nnode. | repair success, fs content is + | | not changed. + ------------------------------------------------------------------------- + tnc_lv0_key | bad key in lv0 | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + tnc_lv0_len | bad len in lv0 | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + tnc_lv0_pos | bad pos in lv0 | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + tnc_noleaf_key | bad key in non-leaf | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + tnc_noleaf_len | bad len in non-leaf | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + tnc_noleaf_pos | bad pos in non-leaf | repair success, fs content is + | znode. | not changed. + ------------------------------------------------------------------------- + inode_data | bad data node. | repair success, file content + | | is changed, other files are + | | not changed. + ------------------------------------------------------------------------- + inode_mode | bad inode mode for | repair success, soft link + | solf link file. | file is dropped, other files + | | are not changed. + ------------------------------------------------------------------------- + inode_nlink | wrong nlink for | repair success, nlink is + | file. | corrected, fs content is not + | | changed. + ------------------------------------------------------------------------- + inode_size | wrong inode size | repair success, inode size is + | for file. | corrected, fs content is not + | | changed. + ------------------------------------------------------------------------- + inode_xcnt | wrong inode | repair success, xattr_cnt is + | xattr_cnt for file. | corrected, fs content is not + | | changed. + ------------------------------------------------------------------------- + soft_link_data_len | bad inode data_len | repair success, soft link + | for solt link file. | file is dropped, other files + | | are not changed. + ------------------------------------------------------------------------- + dentry_key | bad dentry key for | repair success, dentry is + | file. | removed, other files are + | | not changed. + ------------------------------------------------------------------------- + dentry_nlen | inconsistent nlen | repair success, dentry is + | and name in dentry | removed, other files are + | for file. | not changed. + ------------------------------------------------------------------------- + dentry_type | inconsistent type | repair success, dentry is + | between dentry and | removed, other files are + | inode for file. | not changed. + ------------------------------------------------------------------------- + xinode_flags | lost UBIFS_XATTR_FL | repair success, xattr is + | in xattr inode | removed, other files are + | flags for file. | not changed. + ------------------------------------------------------------------------- + xinode_key | bad xattr inode key | repair success, xattr is + | for file. | removed, other files are + | | not changed. + ------------------------------------------------------------------------- + xinode_mode | bad xattr inode | repair success, xattr is + | mode for file. | removed, other files are + | | not changed. + ------------------------------------------------------------------------- + xentry_key | bad xattr entry key | repair success, xattr is + | for file. | removed, other files are + | | not changed. + ------------------------------------------------------------------------- + xentry_nlen | inconsistent nlen | repair success, xattr is + | and name in xattr | removed, other files are + | entry for file. | not changed. + ------------------------------------------------------------------------- + xentry_type | inconsistent type | repair success, xattr is + | between xattr entry | removed, other files are + | and xattr inode for | not changed. + | file. | + ------------------------------------------------------------------------- + dir_lost | bad dentry for dir. | repair success, dir and files + | | under dir are removed, other + | | files are not changed. + ------------------------------------------------------------------------- + root_dir | bad '/'. | repair success, create new + | | root dir('/'). + ========================================================================= + + Dependence + ---------- + kernel configs: + CONFIG_MTD_NAND_NANDSIM=m + CONFIG_MTD_MTDRAM=m + CONFIG_MTD_UBI=m + CONFIG_MTD_UBI_FASTMAP=y + CONFIG_UBIFS_FS=m + CONFIG_UBIFS_FS_XATTR=y + CONFIG_UBIFS_FS_AUTHENTICATION=y + CONFIG_FS_ENCRYPTION=y + CONFIG_FAILSLAB=y + CONFIG_FAIL_PAGE_ALLOC=y + + CONFIG_DEBUG_KMEMLEAK=y // optional + + tools: + fsstress [3][4] + keyctl [5] + fscryptctl [6] + setfattr/getfattr [7] + + Running + ------- + + Please build and install mtd-utils first. + Run single case: + cd $INSTALL_DIR/libexec/mtd-utils + ./powercut_repair_mount.sh + ./random_corrupted_repair.sh + ./cycle_mount_repair_check.sh + Run all cases: sh $INSTALL_DIR/libexec/mtd-utils/ubifs_repair_run_all.sh + + References + ---------- + + [1] https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git/tree/tests/README + [2] https://bugzilla.kernel.org/show_bug.cgi?id=218327 + [3] https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git/tree/ltp/fsstress.c + [4] https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/fs/fsstress/fsstress.c + [5] https://github.com/torvalds/linux/blob/master/security/keys/keyctl.c + [6] https://github.com/google/fscryptctl + [7] https://github.com/philips/attr/tree/master