aboutsummaryrefslogtreecommitdiff
path: root/tests/ubifs_tools-tests/fsck_tests/cycle_powercut_mount_fsck.sh.in
blob: 6af1b54d7600a763c18a796550ce3afa3cb25471 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh
# Copyright (c), 2024, Huawei Technologies Co, Ltd.
# Author: Zhihao Cheng <chengzhihao1@huawei.com>
#
# Test Description:
# Do many cycles of mount/fsstress/powercut/umount/fsck/mount, check whether
# mount is successful.
# Running time: 9h

TESTBINDIR=@TESTBINDIR@
source $TESTBINDIR/common.sh

ID="0x20,0xa7,0x00,0x26" # 4G 256KB 4KB 2KB-sub-page

function run_test()
{
	local encryption=$1

	echo "Do cycle mount+powercut+fsck+umount($encryption) test"
	modprobe nandsim id_bytes=$ID
	mtdnum="$(find_mtd_device "$nandsim_patt")"
	flash_eraseall /dev/mtd$mtdnum

	dmesg -c > /dev/null

	modprobe ubi mtd="$mtdnum,4096" || fatal "modprobe ubi fail"
	ubimkvol -N vol_test -m -n 0 /dev/ubi$UBI_NUM || fatal "mkvol fail"
	modprobe ubifs || fatal "modprobe ubifs fail"

	if [[ "$encryption" == "encrypted" ]]; then
		encryption_gen_key
	fi

	round=0
	while [[ $round -lt 60 ]]
	do
		echo "---------------------- ROUND $round ----------------------"
		let round=$round+1

		mount_ubifs $DEV $MNT || fatal "mount ubifs fail"
		if [[ "$encryption" == "encrypted" ]]; then
			encryption_set_key $MNT
		fi

		if [[ $(($round % 30)) == 0 ]]
		then
			echo "Clean files"
			rm -rf $MNT/*
			check_err_msg
		fi

		fsstress -d $MNT -l0 -p4 -n10000 &
		sleep $((RANDOM % 30))

		per=`df -Th | grep ubifs | awk '{print $6}'`;
		if [[ ${per%?} -gt 95 ]]; then
			dmesg -c > /dev/null # The ENOSPC error messages may exist
		else
			check_err_msg # Make sure new operations are okay after fsck
		fi
		powercut

		ps -e | grep -w fsstress > /dev/null 2>&1
		while [ $? -eq 0 ]
		do
			killall -9 fsstress > /dev/null 2>&1
			sleep 1
			ps -e | grep -w fsstress > /dev/null 2>&1
		done

		while true
		do
			res=`mount | grep "$MNT"`
			if [[ "$res" == "" ]]
			then
				break;
			fi
			umount $MNT
			sleep 0.1
		done

		fsck.ubifs -a $DEV 2>&1 > $LOG_FILE
		res=$?
		cat $LOG_FILE
		if [[ $res != $FSCK_OK ]]
		then
			# Powercut during layout_leb_in_gaps may change index
			# LEBs without updating LPT.
			idx_log=`cat $LOG_FILE | grep "Inconsistent properties" | grep "is_idx 1"`
			# The lpt nodes could be parsed incorrectly because the lpt disk
			# layout is too simple. See details in
			# https://lore.kernel.org/linux-mtd/97ca7fe4-4ad4-edd1-e97a-1d540aeabe2d@huawei.com/
			lpt_log=`cat $LOG_FILE | grep "dbg_check_ltab_lnum: invalid empty space in LEB"`
			if [[ "$idx_log" == "" ]] && [[ "$lpt_log" == "" ]]; then
				fatal "fsck fail $res"
			fi
			if [[ $res != $FSCK_NONDESTRUCT ]]; then
				fatal "fsck fail $res"
			fi
		fi

		dmesg -c > /dev/null # powercut could reproduce error messages

		enable_chkfs

		mount_ubifs $DEV $MNT "noauthentication" "noatime"
		res=$?
		if [[ $res != 0 ]]
		then
			fatal "mount fail $res"
		fi

		if [[ "$encryption" == "encrypted" ]]; then
			encryption_set_key $MNT
		fi

		du -sh $MNT > /dev/null  # Make sure all files are accessible
		ret=$?
		if [[ $ret != 0 ]]; then
			fatal "Cannot access all files"
		fi
		check_err_msg

		umount $MNT
		res=$?
		if [[ $res != 0 ]]
		then
			fatal "unmount fail $res"
		fi

		check_err_msg

		disable_chkfs
	done

	modprobe -r ubifs
	modprobe -r ubi
	modprobe -r nandsim
}

check_fsstress
start_t=$(date +%s)
run_test "encrypted"
run_test "noencrypted"
end_t=$(date +%s)
time_cost=$(( end_t - start_t ))
echo "Success, cost $time_cost seconds"
exit 0