int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf)
{
- char sec_buf[SECTOR_SIZE];
- unsigned block_len;
+ ALLOC_CACHE_ALIGN_BUFFER(char, sec_buf, SECTOR_SIZE);
+ unsigned sectors;
/*
* Check partition boundaries
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;
- }
+ sectors = byte_len / SECTOR_SIZE;
+
+ if (sectors > 0) {
+ if (ext2fs_block_dev_desc->block_read(
+ ext2fs_block_dev_desc->dev,
+ part_info.start + sector,
+ sectors,
+ (unsigned long *) buf) != sectors) {
+ printf(" ** %s read error - block\n", __func__);
+ return 0;
+ }
- if (ext2fs_block_dev_desc->block_read(ext2fs_block_dev_desc->dev,
- part_info.start + sector,
- block_len / SECTOR_SIZE,
- (unsigned long *) buf) !=
- block_len / SECTOR_SIZE) {
- printf(" ** %s read error - block\n", __func__);
- return 0;
+ buf += sectors * SECTOR_SIZE;
+ byte_len -= sectors * SECTOR_SIZE;
+ sector += sectors;
}
- block_len = byte_len & ~(SECTOR_SIZE - 1);
- buf += block_len;
- byte_len -= block_len;
- sector += block_len / SECTOR_SIZE;
if (byte_len != 0) {
/* read rest of data which are not in whole sector */