From ce1120dd703e6f12c59e4eba9962356a0300b832 Mon Sep 17 00:00:00 2001 From: Dave Liu Date: Fri, 29 Feb 2008 17:45:31 +0800 Subject: fs: Fix ext2 read issue The ext2 aligned process will corrupt the key data struct, the patch fix this. Signed-off-by: Dave Liu --- fs/ext2/dev.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'fs/ext2') diff --git a/fs/ext2/dev.c b/fs/ext2/dev.c index 643a1a8c850..1728b34fc8d 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; -- cgit v1.2.3