2005-04-16 15:20:36 -07:00
/*
* fs / partitions / osf . c
*
* Code extracted from drivers / block / genhd . c
*
* Copyright ( C ) 1991 - 1998 Linus Torvalds
* Re - organised Feb 1998 Russell King
*/
# include "check.h"
# include "osf.h"
2011-03-16 08:04:07 -07:00
# define MAX_OSF_PARTITIONS 18
2011-03-14 14:59:33 +01:00
2010-05-15 20:09:30 +02:00
int osf_partition ( struct parsed_partitions * state )
2005-04-16 15:20:36 -07:00
{
int i ;
int slot = 1 ;
2011-03-14 14:59:33 +01:00
unsigned int npartitions ;
2005-04-16 15:20:36 -07:00
Sector sect ;
unsigned char * data ;
struct disklabel {
__le32 d_magic ;
__le16 d_type , d_subtype ;
u8 d_typename [ 16 ] ;
u8 d_packname [ 16 ] ;
__le32 d_secsize ;
__le32 d_nsectors ;
__le32 d_ntracks ;
__le32 d_ncylinders ;
__le32 d_secpercyl ;
__le32 d_secprtunit ;
__le16 d_sparespertrack ;
__le16 d_sparespercyl ;
__le32 d_acylinders ;
__le16 d_rpm , d_interleave , d_trackskew , d_cylskew ;
__le32 d_headswitch , d_trkseek , d_flags ;
__le32 d_drivedata [ 5 ] ;
__le32 d_spare [ 5 ] ;
__le32 d_magic2 ;
__le16 d_checksum ;
__le16 d_npartitions ;
__le32 d_bbsize , d_sbsize ;
struct d_partition {
__le32 p_size ;
__le32 p_offset ;
__le32 p_fsize ;
u8 p_fstype ;
u8 p_frag ;
__le16 p_cpg ;
2011-03-14 14:59:33 +01:00
} d_partitions [ MAX_OSF_PARTITIONS ] ;
2005-04-16 15:20:36 -07:00
} * label ;
struct d_partition * partition ;
2010-05-15 20:09:30 +02:00
data = read_part_sector ( state , 0 , & sect ) ;
2005-04-16 15:20:36 -07:00
if ( ! data )
return - 1 ;
label = ( struct disklabel * ) ( data + 64 ) ;
partition = label - > d_partitions ;
if ( le32_to_cpu ( label - > d_magic ) ! = DISKLABELMAGIC ) {
put_dev_sector ( sect ) ;
return 0 ;
}
if ( le32_to_cpu ( label - > d_magic2 ) ! = DISKLABELMAGIC ) {
put_dev_sector ( sect ) ;
return 0 ;
}
2011-03-14 14:59:33 +01:00
npartitions = le16_to_cpu ( label - > d_npartitions ) ;
if ( npartitions > MAX_OSF_PARTITIONS ) {
put_dev_sector ( sect ) ;
return 0 ;
}
for ( i = 0 ; i < npartitions ; i + + , partition + + ) {
2005-04-16 15:20:36 -07:00
if ( slot = = state - > limit )
break ;
if ( le32_to_cpu ( partition - > p_size ) )
put_partition ( state , slot ,
le32_to_cpu ( partition - > p_offset ) ,
le32_to_cpu ( partition - > p_size ) ) ;
slot + + ;
}
2010-08-10 18:03:14 -07:00
strlcat ( state - > pp_buf , " \n " , PAGE_SIZE ) ;
2005-04-16 15:20:36 -07:00
put_dev_sector ( sect ) ;
return 1 ;
}