@ -125,7 +125,7 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags)
s - > fd = fd ;
if ( read ( fd , & bochs , sizeof ( bochs ) ) ! = sizeof ( bochs ) ) {
if ( p read( fd , & bochs , sizeof ( bochs ) , 0 ) ! = sizeof ( bochs ) ) {
goto fail ;
}
@ -144,14 +144,10 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags)
bs - > total_sectors = le64_to_cpu ( bochs . extra . redolog . disk ) / 512 ;
}
if ( lseek ( s - > fd , le32_to_cpu ( bochs . header ) , SEEK_SET ) = = ( off_t ) - 1 ) {
goto fail ;
}
s - > catalog_size = le32_to_cpu ( bochs . extra . redolog . catalog ) ;
s - > catalog_bitmap = qemu_malloc ( s - > catalog_size * 4 ) ;
if ( read ( s - > fd , s - > catalog_bitmap , s - > catalog_size * 4 ) ! =
s - > catalog_size * 4 )
if ( pread ( s - > fd , s - > catalog_bitmap , s - > catalog_size * 4 ,
le32_to_cpu ( bochs . header ) ) ! = s - > catalog_size * 4 )
goto fail ;
for ( i = 0 ; i < s - > catalog_size ; i + + )
le32_to_cpus ( & s - > catalog_bitmap [ i ] ) ;
@ -169,54 +165,35 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags)
return - 1 ;
}
static inline in t seek_to_sector ( BlockDriverState * bs , int64_t sector_num )
static int64_ t seek_to_sector ( BlockDriverState * bs , int64_t sector_num )
{
BDRVBochsState * s = bs - > opaque ;
int64_t offset = sector_num * 512 ;
int64_t extent_index , extent_offset , bitmap_offset , block_offset ;
int64_t extent_index , extent_offset , bitmap_offset ;
char bitmap_entry ;
// seek to sector
extent_index = offset / s - > extent_size ;
extent_offset = ( offset % s - > extent_size ) / 512 ;
if ( s - > catalog_bitmap [ extent_index ] = = 0xffffffff )
{
// fprintf(stderr, "page not allocated [%x - %x:%x]\n",
// sector_num, extent_index, extent_offset);
return - 1 ; // not allocated
if ( s - > catalog_bitmap [ extent_index ] = = 0xffffffff ) {
return - 1 ; /* not allocated */
}
bitmap_offset = s - > data_offset + ( 512 * s - > catalog_bitmap [ extent_index ] *
( s - > extent_blocks + s - > bitmap_blocks ) ) ;
block_offset = bitmap_offset + ( 512 * ( s - > bitmap_blocks + extent_offset ) ) ;
// fprintf(stderr, "sect: %x [ext i: %x o: %x] -> %x bitmap: %x block: %x\n",
// sector_num, extent_index, extent_offset,
// le32_to_cpu(s->catalog_bitmap[extent_index]),
// bitmap_offset, block_offset);
// read in bitmap for current extent
if ( lseek ( s - > fd , bitmap_offset + ( extent_offset / 8 ) , SEEK_SET ) = =
( off_t ) - 1 ) {
return - 1 ;
}
if ( read ( s - > fd , & bitmap_entry , 1 ) ! = 1 )
/* read in bitmap for current extent */
if ( pread ( s - > fd , & bitmap_entry , 1 , bitmap_offset + ( extent_offset / 8 ) )
! = 1 ) {
return - 1 ;
if ( ! ( ( bitmap_entry > > ( extent_offset % 8 ) ) & 1 ) )
{
// fprintf(stderr, "sector (%x) in bitmap not allocated\n",
// sector_num);
return - 1 ; // not allocated
}
if ( lseek ( s - > fd , block_offset , SEEK_SET ) = = ( off_t ) - 1 ) {
return - 1 ;
if ( ! ( ( bitmap_entry > > ( extent_offset % 8 ) ) & 1 ) ) {
return - 1 ; /* not allocated */
}
return 0 ;
return bitmap_offset + ( 512 * ( s - > bitmap_blocks + extent_offset ) ) ;
}
static int bochs_read ( BlockDriverState * bs , int64_t sector_num ,
@ -226,13 +203,13 @@ static int bochs_read(BlockDriverState *bs, int64_t sector_num,
int ret ;
while ( nb_sectors > 0 ) {
if ( ! seek_to_sector ( bs , sector_num ) )
{
ret = read ( s - > fd , buf , 512 ) ;
if ( ret ! = 512 )
return - 1 ;
}
else
int64_t block_offset = seek_to_sector ( bs , sector_num ) ;
if ( block_offset > = 0 ) {
ret = p read( s - > fd , buf , 512 , block_offset ) ;
if ( ret ! = 512 ) {
return - 1 ;
}
} else
memset ( buf , 0 , 512 ) ;
nb_sectors - - ;
sector_num + + ;