diff options
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 643a1a8c8..1728b34fc 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; |