diff options
author | Dave Liu <r63238@freescale.com> | 2008-02-29 17:45:31 +0800 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-03-02 22:47:35 +0100 |
commit | ce1120dd703e6f12c59e4eba9962356a0300b832 (patch) | |
tree | fde6758d165e3a52a0565a85c054fad13e90f581 /fs/ext2/dev.c | |
parent | 5013c09f7a5675952a3ca88b6bc6c924e63af33e (diff) |
fs: Fix ext2 read issue
The ext2 aligned process will corrupt the key
data struct, the patch fix this.
Signed-off-by: Dave Liu <daveliu@freescale.com>
Diffstat (limited to 'fs/ext2/dev.c')
-rw-r--r-- | fs/ext2/dev.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c index 643a1a8c85..1728b34fc8 100644 --- a/fs/ext2/dev.c +++ b/fs/ext2/dev.c @@ -96,8 +96,23 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) { sector++; } + if (byte_len == 0) + return 1; + /* read sector aligned part */ block_len = byte_len & ~(SECTOR_SIZE - 1); + + if (block_len == 0) { + u8 p[SECTOR_SIZE]; + + block_len = SECTOR_SIZE; + ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev, + part_info.start + sector, + 1, (unsigned long *)p); + memcpy(buf, p, byte_len); + return 1; + } + if (ext2fs_block_dev_desc->block_read (ext2fs_block_dev_desc->dev, part_info.start + sector, block_len / SECTOR_SIZE, @@ -106,6 +121,7 @@ int ext2fs_devread (int sector, int byte_offset, int byte_len, char *buf) { printf (" ** ext2fs_devread() read error - block\n"); return (0); } + block_len = byte_len & ~(SECTOR_SIZE - 1); buf += block_len; byte_len -= block_len; sector += block_len / SECTOR_SIZE; |