1 /* 2 * (C) Copyright 2003 - 2004 3 * Sysgo AG, <www.elinos.com>, Pavel Bartusek <pba@sysgo.com> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 9 #include <common.h> 10 #include <config.h> 11 #include <reiserfs.h> 12 13 #include "reiserfs_private.h" 14 15 static block_dev_desc_t *reiserfs_block_dev_desc; 16 static disk_partition_t *part_info; 17 18 19 void reiserfs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info) 20 { 21 reiserfs_block_dev_desc = rbdd; 22 part_info = info; 23 } 24 25 26 int reiserfs_devread (int sector, int byte_offset, int byte_len, char *buf) 27 { 28 char sec_buf[SECTOR_SIZE]; 29 unsigned block_len; 30 /* 31 unsigned len = byte_len; 32 u8 *start = buf; 33 */ 34 /* 35 * Check partition boundaries 36 */ 37 if (sector < 0 38 || ((sector + ((byte_offset + byte_len - 1) >> SECTOR_BITS)) 39 >= part_info->size)) { 40 /* errnum = ERR_OUTSIDE_PART; */ 41 printf (" ** reiserfs_devread() read outside partition\n"); 42 return 0; 43 } 44 45 /* 46 * Get the read to the beginning of a partition. 47 */ 48 sector += byte_offset >> SECTOR_BITS; 49 byte_offset &= SECTOR_SIZE - 1; 50 51 #if defined(DEBUG) 52 printf (" <%d, %d, %d> ", sector, byte_offset, byte_len); 53 #endif 54 55 56 if (reiserfs_block_dev_desc == NULL) 57 return 0; 58 59 60 if (byte_offset != 0) { 61 /* read first part which isn't aligned with start of sector */ 62 if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev, 63 part_info->start + sector, 1, 64 (unsigned long *)sec_buf) != 1) { 65 printf (" ** reiserfs_devread() read error\n"); 66 return 0; 67 } 68 memcpy(buf, sec_buf+byte_offset, min(SECTOR_SIZE-byte_offset, byte_len)); 69 buf+=min(SECTOR_SIZE-byte_offset, byte_len); 70 byte_len-=min(SECTOR_SIZE-byte_offset, byte_len); 71 sector++; 72 } 73 74 /* read sector aligned part */ 75 block_len = byte_len & ~(SECTOR_SIZE-1); 76 if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev, 77 part_info->start + sector, block_len/SECTOR_SIZE, 78 (unsigned long *)buf) != block_len/SECTOR_SIZE) { 79 printf (" ** reiserfs_devread() read error - block\n"); 80 return 0; 81 } 82 buf+=block_len; 83 byte_len-=block_len; 84 sector+= block_len/SECTOR_SIZE; 85 86 if ( byte_len != 0 ) { 87 /* read rest of data which are not in whole sector */ 88 if (reiserfs_block_dev_desc->block_read(reiserfs_block_dev_desc->dev, 89 part_info->start + sector, 1, 90 (unsigned long *)sec_buf) != 1) { 91 printf (" ** reiserfs_devread() read error - last part\n"); 92 return 0; 93 } 94 memcpy(buf, sec_buf, byte_len); 95 } 96 97 return 1; 98 } 99