summaryrefslogtreecommitdiff
path: root/fs/ext2
diff options
context:
space:
mode:
authoru-boot@lakedaemon.net <u-boot@lakedaemon.net>2012-03-28 04:37:11 +0000
committerWolfgang Denk <wd@denx.de>2012-06-21 22:49:33 +0200
commit436da3cd233e7166b5ce9293dbd28092cf37bcc9 (patch)
tree847cfa9a6ce8fb20360d0061ea477baf6846a94c /fs/ext2
parent669df7e42d460233f39e26d7c27d3c17821f4666 (diff)
downloadu-boot-436da3cd233e7166b5ce9293dbd28092cf37bcc9.tar.gz
ext2load: increase read speed
This patch dramatically drops the amount of time u-boot needs to read a file from an ext2 partition. On a typical 2 to 5 MB file (kernels and initrds) it goes from tens of seconds to a couple seconds. All we are doing here is grouping contiguous blocks into one read. Boot tested on Globalscale Technologies Dreamplug (Kirkwood ARM SoC) with three different files. sha1sums were calculated in Linux userspace, and then confirmed after ext2load. Signed-off-by: Jason Cooper <u-boot@lakedaemon.net> Tested-by: Eric Nelson <eric.nelson@boundarydevices.com> Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Diffstat (limited to 'fs/ext2')
-rw-r--r--fs/ext2/ext2fs.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c
index f621741e40..f1fce48a39 100644
--- a/fs/ext2/ext2fs.c
+++ b/fs/ext2/ext2fs.c
@@ -420,7 +420,6 @@ int ext2fs_read_file
if (blknr < 0) {
return (-1);
}
- blknr = blknr << log2blocksize;
/* Last block. */
if (i == blockcnt - 1) {
@@ -438,6 +437,29 @@ int ext2fs_read_file
blockend -= skipfirst;
}
+ /* grab middle blocks in one go */
+ if (i != pos / blocksize && i != blockcnt - 1 && blockcnt > 3) {
+ int oldblk = blknr;
+ int blocknxt;
+ while (i < blockcnt - 1) {
+ blocknxt = ext2fs_read_block(node, i + 1);
+ if (blocknxt == (oldblk + 1)) {
+ oldblk = blocknxt;
+ i++;
+ } else {
+ blocknxt = ext2fs_read_block(node, i);
+ break;
+ }
+ }
+
+ if (oldblk == blknr)
+ blockend = blocksize;
+ else
+ blockend = (1 + blocknxt - blknr) * blocksize;
+ }
+
+ blknr = blknr << log2blocksize;
+
/* If the block number is 0 this block is not stored on disk but
is zero filled instead. */
if (blknr) {
@@ -450,7 +472,7 @@ int ext2fs_read_file
} else {
memset (buf, 0, blocksize - skipfirst);
}
- buf += blocksize - skipfirst;
+ buf += blockend - skipfirst;
}
return (len);
}