mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-27 20:38:52 +09:00
![Stephen Warren](/assets/img/avatar_default.png)
Check the result code of all command that are executed. Without this,
if the fallocate invocation fails (this feature is not supported on ext3
filesystems for example) then a zero-length output file will be created,
and subsequent the mkfs and mount invocations will fail, which will cause
the subsequent dd invocation to attempt to fill up the host's entire free
disk space. That's not a nice user experience!
Related, if fallocate does fail, try to create the test disk image using
dd instead. That should work everywhere.
Fixes: 4a28274227
("test: fat: add test of non-contiguous file reads")
Signed-off-by: Stephen Warren <swarren@nvidia.com>
146 lines
4.1 KiB
Bash
Executable File
146 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# (C) Copyright 2015 Stephen Warren
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
|
|
# This script tests U-Boot's FAT filesystem code's ability to read non-
|
|
# contiguous files.
|
|
|
|
# When porting the ff.c FAT parsing code into U-Boot, it was found that ff.c
|
|
# always reads files cluster-by-cluster, which results in poor performance.
|
|
# This was solved by adding a patch to ff.c to coalesce reads of adjacent
|
|
# clusters. Since this patch needed to correctly handle non-contiguous files,
|
|
# this test was written to validate that.
|
|
#
|
|
# To execute the test, simply run it from the U-Boot source root directory:
|
|
#
|
|
# cd u-boot
|
|
# ./test/fs/fat-noncontig-test.sh
|
|
#
|
|
# The test will create a FAT filesystem image, record the CRC of a randomly
|
|
# generated file in the image, build U-Boot sandbox, invoke U-Boot sandbox to
|
|
# read the file and validate that the CRCs match. Expected output is shown
|
|
# below. The important part of the log is the penultimate line that contains
|
|
# either "PASS" or "FAILURE".
|
|
#
|
|
# mkfs.fat 3.0.26 (2014-03-07)
|
|
#
|
|
#
|
|
# U-Boot 2015.10-rc4-00018-g4b22a3e5513f (Oct 03 2015 - 13:49:23 -0600)
|
|
#
|
|
# DRAM: 128 MiB
|
|
# Using default environment
|
|
#
|
|
# In: serial
|
|
# Out: lcd
|
|
# Err: lcd
|
|
# Net: No ethernet found.
|
|
# => host bind 0 sandbox/fat-noncontig.img
|
|
# => load host 0:0 1000 noncontig.img
|
|
# 33584964 bytes read in 18 ms (1.7 GiB/s)
|
|
# => crc32 1000 $filesize 0
|
|
# crc32 for 00001000 ... 02008743 ==> 6a080523
|
|
# => if itest.l *0 != 2305086a; then echo FAILURE; else echo PASS; fi
|
|
# PASS
|
|
# => reset
|
|
#
|
|
# All temporary files used by this script are created in ./sandbox to avoid
|
|
# polluting the source tree. test/fs/fs-test.sh also uses this directory for
|
|
# the same purpose.
|
|
#
|
|
# TODO: Integrate this (and many other corner-cases e.g. different types of
|
|
# FAT) with fs-test.sh so that a single script tests everything filesystem-
|
|
# related.
|
|
|
|
odir=sandbox
|
|
img=${odir}/fat-noncontig.img
|
|
mnt=${odir}/mnt
|
|
fill=/dev/urandom
|
|
testfn=noncontig.img
|
|
mnttestfn=${mnt}/${testfn}
|
|
crcaddr=0
|
|
loadaddr=1000
|
|
|
|
for prereq in fallocate mkfs.fat dd crc32; do
|
|
if [ ! -x "`which $prereq`" ]; then
|
|
echo "Missing $prereq binary. Exiting!"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
make O=${odir} -s sandbox_defconfig && make O=${odir} -s -j8
|
|
|
|
mkdir -p ${mnt}
|
|
if [ ! -f ${img} ]; then
|
|
fallocate -l 40M ${img}
|
|
if [ $? -ne 0 ]; then
|
|
echo fallocate failed - using dd instead
|
|
dd if=/dev/zero of=${img} bs=1024 count=$((40 * 1024))
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not create empty disk image
|
|
exit $?
|
|
fi
|
|
fi
|
|
mkfs.fat ${img}
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not create FAT filesystem
|
|
exit $?
|
|
fi
|
|
|
|
sudo mount -o loop,uid=$(id -u) ${img} ${mnt}
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not mount test filesystem
|
|
exit $?
|
|
fi
|
|
|
|
for ((sects=8; sects < 512; sects += 8)); do
|
|
fn=${mnt}/keep-${sects}.img
|
|
dd if=${fill} of=${fn} bs=512 count=${sects} >/dev/null 2>&1
|
|
fn=${mnt}/remove-${sects}.img
|
|
dd if=${fill} of=${fn} bs=512 count=${sects} >/dev/null 2>&1
|
|
done
|
|
|
|
rm -f ${mnt}/remove-*.img
|
|
|
|
# 511 deliberately to trigger a file size that's not a multiple of the
|
|
# sector size (ignoring sizes that are multiples of both).
|
|
dd if=${fill} of=${mnttestfn} bs=511 >/dev/null 2>&1
|
|
|
|
sudo umount ${mnt}
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not unmount test filesystem
|
|
exit $?
|
|
fi
|
|
fi
|
|
|
|
sudo mount -o ro,loop,uid=$(id -u) ${img} ${mnt}
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not mount test filesystem
|
|
exit $?
|
|
fi
|
|
crc=0x`crc32 ${mnttestfn}`
|
|
sudo umount ${mnt}
|
|
if [ $? -ne 0 ]; then
|
|
echo Could not unmount test filesystem
|
|
exit $?
|
|
fi
|
|
|
|
crc=`printf %02x%02x%02x%02x \
|
|
$((${crc} & 0xff)) \
|
|
$(((${crc} >> 8) & 0xff)) \
|
|
$(((${crc} >> 16) & 0xff)) \
|
|
$((${crc} >> 24))`
|
|
|
|
./sandbox/u-boot << EOF
|
|
host bind 0 ${img}
|
|
load host 0:0 ${loadaddr} ${testfn}
|
|
crc32 ${loadaddr} \$filesize ${crcaddr}
|
|
if itest.l *${crcaddr} != ${crc}; then echo FAILURE; else echo PASS; fi
|
|
reset
|
|
EOF
|
|
if [ $? -ne 0 ]; then
|
|
echo U-Boot exit status indicates an error
|
|
exit $?
|
|
fi
|