xref: /aosp_15_r20/external/e2fsprogs/misc/e2fuzz.sh (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
1*6a54128fSAndroid Build Coastguard Worker#!/bin/bash
2*6a54128fSAndroid Build Coastguard Worker
3*6a54128fSAndroid Build Coastguard Worker# Test harness to fuzz a filesystem over and over...
4*6a54128fSAndroid Build Coastguard Worker# Copyright (C) 2014 Oracle.
5*6a54128fSAndroid Build Coastguard Worker
6*6a54128fSAndroid Build Coastguard WorkerDIR=/tmp
7*6a54128fSAndroid Build Coastguard WorkerPASSES=10000
8*6a54128fSAndroid Build Coastguard WorkerSZ=32m
9*6a54128fSAndroid Build Coastguard WorkerSCRIPT_DIR="$(dirname "$0")"
10*6a54128fSAndroid Build Coastguard WorkerFEATURES="has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize,64bit,metadata_csum,bigalloc,sparse_super2,inline_data"
11*6a54128fSAndroid Build Coastguard WorkerBLK_SZ=4096
12*6a54128fSAndroid Build Coastguard WorkerINODE_SZ=256
13*6a54128fSAndroid Build Coastguard WorkerEXTENDED_OPTS="discard"
14*6a54128fSAndroid Build Coastguard WorkerEXTENDED_FSCK_OPTIONS=""
15*6a54128fSAndroid Build Coastguard WorkerRUN_FSCK=1
16*6a54128fSAndroid Build Coastguard WorkerOVERRIDE_PATH=1
17*6a54128fSAndroid Build Coastguard WorkerHAS_FUSE2FS=0
18*6a54128fSAndroid Build Coastguard WorkerUSE_FUSE2FS=0
19*6a54128fSAndroid Build Coastguard WorkerMAX_FSCK=10
20*6a54128fSAndroid Build Coastguard WorkerSRCDIR=/etc
21*6a54128fSAndroid Build Coastguard Workertest -x "${SCRIPT_DIR}/fuse2fs" && HAS_FUSE2FS=1
22*6a54128fSAndroid Build Coastguard Worker
23*6a54128fSAndroid Build Coastguard Workerprint_help() {
24*6a54128fSAndroid Build Coastguard Worker	echo "Usage: $0 OPTIONS"
25*6a54128fSAndroid Build Coastguard Worker	echo "-b:	FS block size is this. (${BLK_SZ})"
26*6a54128fSAndroid Build Coastguard Worker	echo "-B:	Corrupt this many bytes per run."
27*6a54128fSAndroid Build Coastguard Worker	echo "-d:	Create test files in this directory. (${DIR})"
28*6a54128fSAndroid Build Coastguard Worker	echo "-E:	Extended mke2fs options."
29*6a54128fSAndroid Build Coastguard Worker	echo "-f:	Do not run e2fsck after each pass."
30*6a54128fSAndroid Build Coastguard Worker	echo "-F:	Extended e2fsck options."
31*6a54128fSAndroid Build Coastguard Worker	echo "-I:	Create inodes of this size. (${INODE_SZ})"
32*6a54128fSAndroid Build Coastguard Worker	echo "-n:	Run this many passes. (${PASSES})"
33*6a54128fSAndroid Build Coastguard Worker	echo "-O:	Create FS with these features."
34*6a54128fSAndroid Build Coastguard Worker	echo "-p:	Use system's mke2fs/e2fsck/tune2fs tools."
35*6a54128fSAndroid Build Coastguard Worker	echo "-s:	Create FS images of this size. (${SZ})"
36*6a54128fSAndroid Build Coastguard Worker	echo "-S:	Copy files from this dir. (${SRCDIR})"
37*6a54128fSAndroid Build Coastguard Worker	echo "-x:	Run e2fsck at most this many times. (${MAX_FSCK})"
38*6a54128fSAndroid Build Coastguard Worker	test "${HAS_FUSE2FS}" -gt 0 && echo "-u:	Use fuse2fs instead of the kernel."
39*6a54128fSAndroid Build Coastguard Worker	exit 0
40*6a54128fSAndroid Build Coastguard Worker}
41*6a54128fSAndroid Build Coastguard Worker
42*6a54128fSAndroid Build Coastguard WorkerGETOPT="d:n:s:O:I:b:B:E:F:fpx:S:"
43*6a54128fSAndroid Build Coastguard Workertest "${HAS_FUSE2FS}" && GETOPT="${GETOPT}u"
44*6a54128fSAndroid Build Coastguard Worker
45*6a54128fSAndroid Build Coastguard Workerwhile getopts "${GETOPT}" opt; do
46*6a54128fSAndroid Build Coastguard Worker	case "${opt}" in
47*6a54128fSAndroid Build Coastguard Worker	"B")
48*6a54128fSAndroid Build Coastguard Worker		E2FUZZ_ARGS="${E2FUZZ_ARGS} -b ${OPTARG}"
49*6a54128fSAndroid Build Coastguard Worker		;;
50*6a54128fSAndroid Build Coastguard Worker	"d")
51*6a54128fSAndroid Build Coastguard Worker		DIR="${OPTARG}"
52*6a54128fSAndroid Build Coastguard Worker		;;
53*6a54128fSAndroid Build Coastguard Worker	"n")
54*6a54128fSAndroid Build Coastguard Worker		PASSES="${OPTARG}"
55*6a54128fSAndroid Build Coastguard Worker		;;
56*6a54128fSAndroid Build Coastguard Worker	"s")
57*6a54128fSAndroid Build Coastguard Worker		SZ="${OPTARG}"
58*6a54128fSAndroid Build Coastguard Worker		;;
59*6a54128fSAndroid Build Coastguard Worker	"O")
60*6a54128fSAndroid Build Coastguard Worker		FEATURES="${FEATURES},${OPTARG}"
61*6a54128fSAndroid Build Coastguard Worker		;;
62*6a54128fSAndroid Build Coastguard Worker	"I")
63*6a54128fSAndroid Build Coastguard Worker		INODE_SZ="${OPTARG}"
64*6a54128fSAndroid Build Coastguard Worker		;;
65*6a54128fSAndroid Build Coastguard Worker	"b")
66*6a54128fSAndroid Build Coastguard Worker		BLK_SZ="${OPTARG}"
67*6a54128fSAndroid Build Coastguard Worker		;;
68*6a54128fSAndroid Build Coastguard Worker	"E")
69*6a54128fSAndroid Build Coastguard Worker		EXTENDED_OPTS="${OPTARG}"
70*6a54128fSAndroid Build Coastguard Worker		;;
71*6a54128fSAndroid Build Coastguard Worker	"F")
72*6a54128fSAndroid Build Coastguard Worker		EXTENDED_FSCK_OPTS="-E ${OPTARG}"
73*6a54128fSAndroid Build Coastguard Worker		;;
74*6a54128fSAndroid Build Coastguard Worker	"f")
75*6a54128fSAndroid Build Coastguard Worker		RUN_FSCK=0
76*6a54128fSAndroid Build Coastguard Worker		;;
77*6a54128fSAndroid Build Coastguard Worker	"p")
78*6a54128fSAndroid Build Coastguard Worker		OVERRIDE_PATH=0
79*6a54128fSAndroid Build Coastguard Worker		;;
80*6a54128fSAndroid Build Coastguard Worker	"u")
81*6a54128fSAndroid Build Coastguard Worker		USE_FUSE2FS=1
82*6a54128fSAndroid Build Coastguard Worker		;;
83*6a54128fSAndroid Build Coastguard Worker	"x")
84*6a54128fSAndroid Build Coastguard Worker		MAX_FSCK="${OPTARG}"
85*6a54128fSAndroid Build Coastguard Worker		;;
86*6a54128fSAndroid Build Coastguard Worker	"S")
87*6a54128fSAndroid Build Coastguard Worker		SRCDIR="${OPTARG}"
88*6a54128fSAndroid Build Coastguard Worker		;;
89*6a54128fSAndroid Build Coastguard Worker	*)
90*6a54128fSAndroid Build Coastguard Worker		print_help
91*6a54128fSAndroid Build Coastguard Worker		;;
92*6a54128fSAndroid Build Coastguard Worker	esac
93*6a54128fSAndroid Build Coastguard Workerdone
94*6a54128fSAndroid Build Coastguard Worker
95*6a54128fSAndroid Build Coastguard Workerif [ "${OVERRIDE_PATH}" -gt 0 ]; then
96*6a54128fSAndroid Build Coastguard Worker	PATH="${SCRIPT_DIR}:${SCRIPT_DIR}/../e2fsck/:${PATH}"
97*6a54128fSAndroid Build Coastguard Worker	export PATH
98*6a54128fSAndroid Build Coastguard Workerfi
99*6a54128fSAndroid Build Coastguard Worker
100*6a54128fSAndroid Build Coastguard WorkerTESTDIR="${DIR}/tests/"
101*6a54128fSAndroid Build Coastguard WorkerTESTMNT="${DIR}/mnt/"
102*6a54128fSAndroid Build Coastguard WorkerBASE_IMG="${DIR}/e2fuzz.img"
103*6a54128fSAndroid Build Coastguard Worker
104*6a54128fSAndroid Build Coastguard Workercat > /tmp/mke2fs.conf << ENDL
105*6a54128fSAndroid Build Coastguard Worker[defaults]
106*6a54128fSAndroid Build Coastguard Worker        base_features = ${FEATURES}
107*6a54128fSAndroid Build Coastguard Worker        default_mntopts = acl,user_xattr,block_validity
108*6a54128fSAndroid Build Coastguard Worker        enable_periodic_fsck = 0
109*6a54128fSAndroid Build Coastguard Worker        blocksize = ${BLK_SZ}
110*6a54128fSAndroid Build Coastguard Worker        inode_size = ${INODE_SZ}
111*6a54128fSAndroid Build Coastguard Worker        inode_ratio = 4096
112*6a54128fSAndroid Build Coastguard Worker	cluster_size = $((BLK_SZ * 2))
113*6a54128fSAndroid Build Coastguard Worker	options = ${EXTENDED_OPTS}
114*6a54128fSAndroid Build Coastguard WorkerENDL
115*6a54128fSAndroid Build Coastguard WorkerMKE2FS_CONFIG=/tmp/mke2fs.conf
116*6a54128fSAndroid Build Coastguard Workerexport MKE2FS_CONFIG
117*6a54128fSAndroid Build Coastguard Worker
118*6a54128fSAndroid Build Coastguard Worker# Set up FS image
119*6a54128fSAndroid Build Coastguard Workerecho "+ create fs image"
120*6a54128fSAndroid Build Coastguard Workerumount "${TESTDIR}"
121*6a54128fSAndroid Build Coastguard Workerumount "${TESTMNT}"
122*6a54128fSAndroid Build Coastguard Workerrm -rf "${TESTDIR}"
123*6a54128fSAndroid Build Coastguard Workerrm -rf "${TESTMNT}"
124*6a54128fSAndroid Build Coastguard Workermkdir -p "${TESTDIR}"
125*6a54128fSAndroid Build Coastguard Workermkdir -p "${TESTMNT}"
126*6a54128fSAndroid Build Coastguard Workerrm -rf "${BASE_IMG}"
127*6a54128fSAndroid Build Coastguard Workertruncate -s "${SZ}" "${BASE_IMG}"
128*6a54128fSAndroid Build Coastguard Workermke2fs -F -v "${BASE_IMG}"
129*6a54128fSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
130*6a54128fSAndroid Build Coastguard Worker	exit $?
131*6a54128fSAndroid Build Coastguard Workerfi
132*6a54128fSAndroid Build Coastguard Worker
133*6a54128fSAndroid Build Coastguard Worker# Populate FS image
134*6a54128fSAndroid Build Coastguard Workerecho "+ populate fs image"
135*6a54128fSAndroid Build Coastguard Workermodprobe loop
136*6a54128fSAndroid Build Coastguard Workermount "${BASE_IMG}" "${TESTMNT}" -o loop
137*6a54128fSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
138*6a54128fSAndroid Build Coastguard Worker	exit $?
139*6a54128fSAndroid Build Coastguard Workerfi
140*6a54128fSAndroid Build Coastguard WorkerSRC_SZ="$(du -ks "${SRCDIR}" | awk '{print $1}')"
141*6a54128fSAndroid Build Coastguard WorkerFS_SZ="$(( $(stat -f "${TESTMNT}" -c '%a * %S') / 1024 ))"
142*6a54128fSAndroid Build Coastguard WorkerNR="$(( (FS_SZ * 4 / 10) / SRC_SZ ))"
143*6a54128fSAndroid Build Coastguard Workerif [ "${NR}" -lt 1 ]; then
144*6a54128fSAndroid Build Coastguard Worker	NR=1
145*6a54128fSAndroid Build Coastguard Workerfi
146*6a54128fSAndroid Build Coastguard Workerecho "+ make ${NR} copies"
147*6a54128fSAndroid Build Coastguard Workerseq 1 "${NR}" | while read nr; do
148*6a54128fSAndroid Build Coastguard Worker	cp -pRdu "${SRCDIR}" "${TESTMNT}/test.${nr}" 2> /dev/null
149*6a54128fSAndroid Build Coastguard Workerdone
150*6a54128fSAndroid Build Coastguard Workerumount "${TESTMNT}"
151*6a54128fSAndroid Build Coastguard Workere2fsck -fn "${BASE_IMG}"
152*6a54128fSAndroid Build Coastguard Workerif [ $? -ne 0 ]; then
153*6a54128fSAndroid Build Coastguard Worker	echo "fsck failed??"
154*6a54128fSAndroid Build Coastguard Worker	exit 1
155*6a54128fSAndroid Build Coastguard Workerfi
156*6a54128fSAndroid Build Coastguard Worker
157*6a54128fSAndroid Build Coastguard Worker# Run tests
158*6a54128fSAndroid Build Coastguard Workerecho "+ run test"
159*6a54128fSAndroid Build Coastguard Workerret=0
160*6a54128fSAndroid Build Coastguard Workerseq 1 "${PASSES}" | while read pass; do
161*6a54128fSAndroid Build Coastguard Worker	echo "+ pass ${pass}"
162*6a54128fSAndroid Build Coastguard Worker	PASS_IMG="${TESTDIR}/e2fuzz-${pass}.img"
163*6a54128fSAndroid Build Coastguard Worker	FSCK_IMG="${TESTDIR}/e2fuzz-${pass}.fsck"
164*6a54128fSAndroid Build Coastguard Worker	FUZZ_LOG="${TESTDIR}/e2fuzz-${pass}.fuzz.log"
165*6a54128fSAndroid Build Coastguard Worker	OPS_LOG="${TESTDIR}/e2fuzz-${pass}.ops.log"
166*6a54128fSAndroid Build Coastguard Worker
167*6a54128fSAndroid Build Coastguard Worker	echo "++ corrupt image"
168*6a54128fSAndroid Build Coastguard Worker	cp "${BASE_IMG}" "${PASS_IMG}"
169*6a54128fSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
170*6a54128fSAndroid Build Coastguard Worker		exit $?
171*6a54128fSAndroid Build Coastguard Worker	fi
172*6a54128fSAndroid Build Coastguard Worker	tune2fs -L "e2fuzz-${pass}" "${PASS_IMG}"
173*6a54128fSAndroid Build Coastguard Worker	e2fuzz -v "${PASS_IMG}" ${E2FUZZ_ARGS} > "${FUZZ_LOG}"
174*6a54128fSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
175*6a54128fSAndroid Build Coastguard Worker		exit $?
176*6a54128fSAndroid Build Coastguard Worker	fi
177*6a54128fSAndroid Build Coastguard Worker
178*6a54128fSAndroid Build Coastguard Worker	echo "++ mount image"
179*6a54128fSAndroid Build Coastguard Worker	if [ "${USE_FUSE2FS}" -gt 0 ]; then
180*6a54128fSAndroid Build Coastguard Worker		"${SCRIPT_DIR}/fuse2fs" "${PASS_IMG}" "${TESTMNT}"
181*6a54128fSAndroid Build Coastguard Worker		res=$?
182*6a54128fSAndroid Build Coastguard Worker	else
183*6a54128fSAndroid Build Coastguard Worker		mount "${PASS_IMG}" "${TESTMNT}" -o loop
184*6a54128fSAndroid Build Coastguard Worker		res=$?
185*6a54128fSAndroid Build Coastguard Worker	fi
186*6a54128fSAndroid Build Coastguard Worker
187*6a54128fSAndroid Build Coastguard Worker	if [ "${res}" -eq 0 ]; then
188*6a54128fSAndroid Build Coastguard Worker		echo "+++ ls -laR"
189*6a54128fSAndroid Build Coastguard Worker		ls -laR "${TESTMNT}/test.1/" > /dev/null 2> "${OPS_LOG}"
190*6a54128fSAndroid Build Coastguard Worker
191*6a54128fSAndroid Build Coastguard Worker		echo "+++ cat files"
192*6a54128fSAndroid Build Coastguard Worker		find "${TESTMNT}/test.1/" -type f -size -1048576k -print0 | xargs -0 cat > /dev/null 2>> "${OPS_LOG}"
193*6a54128fSAndroid Build Coastguard Worker
194*6a54128fSAndroid Build Coastguard Worker		echo "+++ expand"
195*6a54128fSAndroid Build Coastguard Worker		find "${TESTMNT}/" -type f 2> /dev/null | head -n 50000 | while read f; do
196*6a54128fSAndroid Build Coastguard Worker			attr -l "$f" > /dev/null 2>> "${OPS_LOG}"
197*6a54128fSAndroid Build Coastguard Worker			if [ -f "$f" -a -w "$f" ]; then
198*6a54128fSAndroid Build Coastguard Worker				dd if=/dev/zero bs="${BLK_SZ}" count=1 >> "$f" 2>> "${OPS_LOG}"
199*6a54128fSAndroid Build Coastguard Worker			fi
200*6a54128fSAndroid Build Coastguard Worker			mv "$f" "$f.longer" > /dev/null 2>> "${OPS_LOG}"
201*6a54128fSAndroid Build Coastguard Worker		done
202*6a54128fSAndroid Build Coastguard Worker		sync
203*6a54128fSAndroid Build Coastguard Worker
204*6a54128fSAndroid Build Coastguard Worker		echo "+++ create files"
205*6a54128fSAndroid Build Coastguard Worker		cp -pRdu "${SRCDIR}" "${TESTMNT}/test.moo" 2>> "${OPS_LOG}"
206*6a54128fSAndroid Build Coastguard Worker		sync
207*6a54128fSAndroid Build Coastguard Worker
208*6a54128fSAndroid Build Coastguard Worker		echo "+++ remove files"
209*6a54128fSAndroid Build Coastguard Worker		rm -rf "${TESTMNT}/test.moo" 2>> "${OPS_LOG}"
210*6a54128fSAndroid Build Coastguard Worker
211*6a54128fSAndroid Build Coastguard Worker		umount "${TESTMNT}"
212*6a54128fSAndroid Build Coastguard Worker		res=$?
213*6a54128fSAndroid Build Coastguard Worker		if [ "${res}" -ne 0 ]; then
214*6a54128fSAndroid Build Coastguard Worker			ret=1
215*6a54128fSAndroid Build Coastguard Worker			break
216*6a54128fSAndroid Build Coastguard Worker		fi
217*6a54128fSAndroid Build Coastguard Worker		sync
218*6a54128fSAndroid Build Coastguard Worker		test "${USE_FUSE2FS}" -gt 0 && sleep 2
219*6a54128fSAndroid Build Coastguard Worker	fi
220*6a54128fSAndroid Build Coastguard Worker	if [ "${RUN_FSCK}" -gt 0 ]; then
221*6a54128fSAndroid Build Coastguard Worker		cp "${PASS_IMG}" "${FSCK_IMG}"
222*6a54128fSAndroid Build Coastguard Worker		pass_img_sz="$(stat -c '%s' "${PASS_IMG}")"
223*6a54128fSAndroid Build Coastguard Worker
224*6a54128fSAndroid Build Coastguard Worker		seq 1 "${MAX_FSCK}" | while read fsck_pass; do
225*6a54128fSAndroid Build Coastguard Worker			echo "++ fsck pass ${fsck_pass}: $(which e2fsck) -fy ${FSCK_IMG} ${EXTENDED_FSCK_OPTS}"
226*6a54128fSAndroid Build Coastguard Worker			FSCK_LOG="${TESTDIR}/e2fuzz-${pass}-${fsck_pass}.log"
227*6a54128fSAndroid Build Coastguard Worker			e2fsck -fy "${FSCK_IMG}" ${EXTENDED_FSCK_OPTS} > "${FSCK_LOG}" 2>&1
228*6a54128fSAndroid Build Coastguard Worker			res=$?
229*6a54128fSAndroid Build Coastguard Worker			echo "++ fsck returns ${res}"
230*6a54128fSAndroid Build Coastguard Worker			if [ "${res}" -eq 0 ]; then
231*6a54128fSAndroid Build Coastguard Worker				exit 0
232*6a54128fSAndroid Build Coastguard Worker			elif [ "${fsck_pass}" -eq "${MAX_FSCK}" ]; then
233*6a54128fSAndroid Build Coastguard Worker				echo "++ fsck did not fix in ${MAX_FSCK} passes."
234*6a54128fSAndroid Build Coastguard Worker				exit 1
235*6a54128fSAndroid Build Coastguard Worker			fi
236*6a54128fSAndroid Build Coastguard Worker			if [ "${res}" -gt 0 -a \
237*6a54128fSAndroid Build Coastguard Worker			     "$(grep 'Memory allocation failed' "${FSCK_LOG}" | wc -l)" -gt 0 ]; then
238*6a54128fSAndroid Build Coastguard Worker				echo "++ Ran out of memory, get more RAM"
239*6a54128fSAndroid Build Coastguard Worker				exit 0
240*6a54128fSAndroid Build Coastguard Worker			fi
241*6a54128fSAndroid Build Coastguard Worker			if [ "${res}" -gt 0 -a \
242*6a54128fSAndroid Build Coastguard Worker			     "$(grep 'Could not allocate block' "${FSCK_LOG}" | wc -l)" -gt 0 -a \
243*6a54128fSAndroid Build Coastguard Worker			     "$(dumpe2fs -h "${FSCK_IMG}" | grep '^Free blocks:' | awk '{print $3}')0" -eq 0 ]; then
244*6a54128fSAndroid Build Coastguard Worker				echo "++ Ran out of space, get a bigger image"
245*6a54128fSAndroid Build Coastguard Worker				exit 0
246*6a54128fSAndroid Build Coastguard Worker			fi
247*6a54128fSAndroid Build Coastguard Worker			if [ "${fsck_pass}" -gt 1 ]; then
248*6a54128fSAndroid Build Coastguard Worker				diff -u "${TESTDIR}/e2fuzz-${pass}-$((fsck_pass - 1)).log" "${FSCK_LOG}"
249*6a54128fSAndroid Build Coastguard Worker				if [ $? -eq 0 ]; then
250*6a54128fSAndroid Build Coastguard Worker					echo "++ fsck makes no progress"
251*6a54128fSAndroid Build Coastguard Worker					exit 2
252*6a54128fSAndroid Build Coastguard Worker				fi
253*6a54128fSAndroid Build Coastguard Worker			fi
254*6a54128fSAndroid Build Coastguard Worker
255*6a54128fSAndroid Build Coastguard Worker			fsck_img_sz="$(stat -c '%s' "${FSCK_IMG}")"
256*6a54128fSAndroid Build Coastguard Worker			if [ "${fsck_img_sz}" -ne "${pass_img_sz}" ]; then
257*6a54128fSAndroid Build Coastguard Worker				echo "++ fsck image size changed"
258*6a54128fSAndroid Build Coastguard Worker				exit 3
259*6a54128fSAndroid Build Coastguard Worker			fi
260*6a54128fSAndroid Build Coastguard Worker		done
261*6a54128fSAndroid Build Coastguard Worker		fsck_loop_ret=$?
262*6a54128fSAndroid Build Coastguard Worker		if [ "${fsck_loop_ret}" -gt 0 ]; then
263*6a54128fSAndroid Build Coastguard Worker			break;
264*6a54128fSAndroid Build Coastguard Worker		fi
265*6a54128fSAndroid Build Coastguard Worker	fi
266*6a54128fSAndroid Build Coastguard Worker
267*6a54128fSAndroid Build Coastguard Worker	echo "+++ check fs for round 2"
268*6a54128fSAndroid Build Coastguard Worker	FSCK_LOG="${TESTDIR}/e2fuzz-${pass}-round2.log"
269*6a54128fSAndroid Build Coastguard Worker	e2fsck -fn "${FSCK_IMG}" ${EXTENDED_FSCK_OPTS} >> "${FSCK_LOG}" 2>&1
270*6a54128fSAndroid Build Coastguard Worker	res=$?
271*6a54128fSAndroid Build Coastguard Worker	if [ "${res}" -ne 0 ]; then
272*6a54128fSAndroid Build Coastguard Worker		echo "++++ fsck failed."
273*6a54128fSAndroid Build Coastguard Worker		exit 1
274*6a54128fSAndroid Build Coastguard Worker	fi
275*6a54128fSAndroid Build Coastguard Worker
276*6a54128fSAndroid Build Coastguard Worker	echo "++ mount image (2)"
277*6a54128fSAndroid Build Coastguard Worker	mount "${FSCK_IMG}" "${TESTMNT}" -o loop
278*6a54128fSAndroid Build Coastguard Worker	res=$?
279*6a54128fSAndroid Build Coastguard Worker
280*6a54128fSAndroid Build Coastguard Worker	if [ "${res}" -eq 0 ]; then
281*6a54128fSAndroid Build Coastguard Worker		echo "+++ ls -laR (2)"
282*6a54128fSAndroid Build Coastguard Worker		ls -laR "${TESTMNT}/test.1/" > /dev/null 2> "${OPS_LOG}"
283*6a54128fSAndroid Build Coastguard Worker
284*6a54128fSAndroid Build Coastguard Worker		echo "+++ cat files (2)"
285*6a54128fSAndroid Build Coastguard Worker		find "${TESTMNT}/test.1/" -type f -size -1048576k -print0 | xargs -0 cat > /dev/null 2>> "${OPS_LOG}"
286*6a54128fSAndroid Build Coastguard Worker
287*6a54128fSAndroid Build Coastguard Worker		echo "+++ expand (2)"
288*6a54128fSAndroid Build Coastguard Worker		find "${TESTMNT}/" -type f 2> /dev/null | head -n 50000 | while read f; do
289*6a54128fSAndroid Build Coastguard Worker			attr -l "$f" > /dev/null 2>> "${OPS_LOG}"
290*6a54128fSAndroid Build Coastguard Worker			if [ -f "$f" -a -w "$f" ]; then
291*6a54128fSAndroid Build Coastguard Worker				dd if=/dev/zero bs="${BLK_SZ}" count=1 >> "$f" 2>> "${OPS_LOG}"
292*6a54128fSAndroid Build Coastguard Worker			fi
293*6a54128fSAndroid Build Coastguard Worker			mv "$f" "$f.longer" > /dev/null 2>> "${OPS_LOG}"
294*6a54128fSAndroid Build Coastguard Worker		done
295*6a54128fSAndroid Build Coastguard Worker		sync
296*6a54128fSAndroid Build Coastguard Worker
297*6a54128fSAndroid Build Coastguard Worker		echo "+++ create files (2)"
298*6a54128fSAndroid Build Coastguard Worker		cp -pRdu "${SRCDIR}" "${TESTMNT}/test.moo" 2>> "${OPS_LOG}"
299*6a54128fSAndroid Build Coastguard Worker		sync
300*6a54128fSAndroid Build Coastguard Worker
301*6a54128fSAndroid Build Coastguard Worker		echo "+++ remove files (2)"
302*6a54128fSAndroid Build Coastguard Worker		rm -rf "${TESTMNT}/test.moo" 2>> "${OPS_LOG}"
303*6a54128fSAndroid Build Coastguard Worker
304*6a54128fSAndroid Build Coastguard Worker		umount "${TESTMNT}"
305*6a54128fSAndroid Build Coastguard Worker		res=$?
306*6a54128fSAndroid Build Coastguard Worker		if [ "${res}" -ne 0 ]; then
307*6a54128fSAndroid Build Coastguard Worker			ret=1
308*6a54128fSAndroid Build Coastguard Worker			break
309*6a54128fSAndroid Build Coastguard Worker		fi
310*6a54128fSAndroid Build Coastguard Worker		sync
311*6a54128fSAndroid Build Coastguard Worker		test "${USE_FUSE2FS}" -gt 0 && sleep 2
312*6a54128fSAndroid Build Coastguard Worker
313*6a54128fSAndroid Build Coastguard Worker		echo "+++ check fs (2)"
314*6a54128fSAndroid Build Coastguard Worker		e2fsck -fn "${FSCK_IMG}" >> "${FSCK_LOG}" 2>&1
315*6a54128fSAndroid Build Coastguard Worker		res=$?
316*6a54128fSAndroid Build Coastguard Worker		if [ "${res}" -ne 0 ]; then
317*6a54128fSAndroid Build Coastguard Worker			echo "++ fsck failed."
318*6a54128fSAndroid Build Coastguard Worker			exit 1
319*6a54128fSAndroid Build Coastguard Worker		fi
320*6a54128fSAndroid Build Coastguard Worker	else
321*6a54128fSAndroid Build Coastguard Worker		echo "++ mount(2) failed with ${res}"
322*6a54128fSAndroid Build Coastguard Worker		exit 1
323*6a54128fSAndroid Build Coastguard Worker	fi
324*6a54128fSAndroid Build Coastguard Worker	rm -rf "${FSCK_IMG}" "${PASS_IMG}" "${FUZZ_LOG}" "${TESTDIR}"/e2fuzz*.log
325*6a54128fSAndroid Build Coastguard Workerdone
326*6a54128fSAndroid Build Coastguard Worker
327*6a54128fSAndroid Build Coastguard Workerexit $ret
328