[U-Boot] [PATCH 2/2] test: fat: add test of non-contiguous file reads

Stephen Warren swarren at wwwdotorg.org
Fri Oct 2 07:56:47 CEST 2015


In my patch series to replace fs/fat with "ff.c", I enhanced ff.c to
optimize file reading, so that reads of contiguous clusters are submitted
to the IO device as a single read. This test attempts to torture-test
edge-cases of that enhancement.

BTW, the only way I found to validate that this script actually does
create non-contiguous files was to manually inspect the FAT bitmap in a
hex dump of the FAT image. hdparm --fibmap doesn't work on loop-mounted
filesystems. filefrag -v -e seems to lie about files being contiguous
when they aren't.

Signed-off-by: Stephen Warren <swarren at wwwdotorg.org>
---
 test/fs/fat-noncontig-test.sh | 52 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100755 test/fs/fat-noncontig-test.sh

diff --git a/test/fs/fat-noncontig-test.sh b/test/fs/fat-noncontig-test.sh
new file mode 100755
index 000000000000..8153708bbf78
--- /dev/null
+++ b/test/fs/fat-noncontig-test.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+odir=sandbox
+img=${odir}/fat.img
+mnt=/mnt/tmp
+fill=/dev/urandom
+testfn=noncontig.img
+mnttestfn=${mnt}/${testfn}
+crcaddr=0
+loadaddr=1000
+
+make O=${odir} -s sandbox_defconfig && make O=${odir} -s -j8
+
+if [ ! -f ${img} ]; then
+    fallocate -l 40M ${img}
+    mkfs -t fat ${img}
+
+    sudo mount -o loop,uid=$(id -u) ${img} ${mnt}
+
+    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}
+fi
+
+sudo mount -o ro,loop,uid=$(id -u) ${img} ${mnt}
+crc=0x`crc32 ${mnttestfn}`
+sudo umount ${mnt}
+
+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
-- 
1.9.1



More information about the U-Boot mailing list