Little cleanup and new code that collects and defers contiguous sector reads into one potentially more efficient larger sequential read action.
This matters for example on SD Card protocol. Signed-off-by: Andy Green <[EMAIL PROTECTED]> --- src/fs/ext2.c | 73 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/fs/ext2.c b/src/fs/ext2.c index acb979f..21165a3 100644 --- a/src/fs/ext2.c +++ b/src/fs/ext2.c @@ -189,9 +189,6 @@ int indir2_blkno = -1; static int ext2fs_blockgroup (struct ext2_data *data, int group, struct ext2_block_group *blkgrp) { -#ifdef DEBUG - puts("ext2fs read blockgroup\n"); -#endif return ext2fs_devread ((__le32_to_cpu(data->sblock.first_data_block) + 1), LOG2_EXT2_BLOCK_SIZE(data), @@ -212,9 +209,6 @@ static int ext2fs_read_inode /* It is easier to calculate if the first inode is 0. */ ino--; -#ifdef DEBUG - puts("ext2fs read inode %d\n", ino); -#endif status = ext2fs_blockgroup(data, ino / __le32_to_cpu(sblock->inodes_per_group), @@ -375,9 +369,9 @@ static int ext2fs_read_block(ext2fs_node_t node, int fileblock) { } blknr = __le32_to_cpu(indir2_block[rblock % perblock]); } - /* Tripple indirect. */ + /* Triple indirect. */ else { - puts("** ext2fs doesn't support tripple indirect blocks. **\n"); + puts("** ext2fs doesn't support triple indirect blocks. **\n"); return -1; } #ifdef DEBUG @@ -387,13 +381,19 @@ static int ext2fs_read_block(ext2fs_node_t node, int fileblock) { } -int ext2fs_read_file - (ext2fs_node_t node, int pos, unsigned int len, char *buf) { +int ext2fs_read_file(ext2fs_node_t node, int pos, unsigned int len, char *buf) { int i; int blockcnt; int log2blocksize = LOG2_EXT2_BLOCK_SIZE(node->data); int blocksize = 1 <<(log2blocksize + DISK_SECTOR_BITS); unsigned int filesize = __le32_to_cpu(node->inode.size); + int previous_block_number = -1; + int delayed_start = 0; + int delayed_extent = 0; + int delayed_skipfirst = 0; + int delayed_next = 0; + char * delayed_buf = NULL; + int status; /* Adjust len so it we can't read past the end of the file. */ if (len > filesize) { @@ -435,14 +435,57 @@ int ext2fs_read_file if (blknr) { int status; - status = ext2fs_devread(blknr, 0 /* already accounted */, skipfirst, blockend, buf); - if (status == 0) - return -1; - } else - memset(buf, 0, blocksize - skipfirst); + if (previous_block_number != -1) { + if (delayed_next == blknr) { + delayed_extent += blockend; + delayed_next += blockend >> SECTOR_BITS; + } else { /* spill */ + status = ext2fs_devread(delayed_start, + 0, delayed_skipfirst, + delayed_extent, delayed_buf); + if (status == 0) + return -1; + previous_block_number = blknr; + delayed_start = blknr; + delayed_extent = blockend; + delayed_skipfirst = skipfirst; + delayed_buf = buf; + delayed_next = blknr + (blockend >> SECTOR_BITS); + } + } else { + previous_block_number = blknr; + delayed_start = blknr; + delayed_extent = blockend; + delayed_skipfirst = skipfirst; + delayed_buf = buf; + delayed_next = blknr + (blockend >> SECTOR_BITS); + } + } else { + if (previous_block_number != -1) { + /* spill */ + status = ext2fs_devread(delayed_start, + 0, delayed_skipfirst, + delayed_extent, delayed_buf); + if (status == 0) + return -1; + previous_block_number = -1; + } + memset(buf, 0, blocksize - skipfirst); + } buf += blocksize - skipfirst; } + + if (previous_block_number != -1) { + /* spill */ + status = ext2fs_devread(delayed_start, + 0, delayed_skipfirst, + delayed_extent, delayed_buf); + if (status == 0) + return -1; + previous_block_number = -1; + } + return(len); }