2005-04-17 02:20:36 +04:00
# include <linux/pagemap.h>
# include <linux/blkdev.h>
2010-09-01 00:47:05 +04:00
# include <linux/genhd.h>
2005-04-17 02:20:36 +04:00
/*
* add_gd_partition adds a partitions details to the devices partition
* description .
*/
struct parsed_partitions {
2010-05-15 22:09:30 +04:00
struct block_device * bdev ;
2005-04-17 02:20:36 +04:00
char name [ BDEVNAME_SIZE ] ;
struct {
sector_t from ;
sector_t size ;
int flags ;
2010-09-01 00:47:05 +04:00
bool has_info ;
struct partition_meta_info info ;
2013-02-28 05:05:19 +04:00
} * parts ;
2005-04-17 02:20:36 +04:00
int next ;
int limit ;
2010-05-15 22:09:31 +04:00
bool access_beyond_eod ;
2010-08-11 05:03:14 +04:00
char * pp_buf ;
2005-04-17 02:20:36 +04:00
} ;
2013-02-28 05:05:19 +04:00
void free_partitions ( struct parsed_partitions * state ) ;
2011-09-16 08:45:36 +04:00
struct parsed_partitions *
check_partition ( struct gendisk * , struct block_device * ) ;
2010-05-15 22:09:30 +04:00
static inline void * read_part_sector ( struct parsed_partitions * state ,
sector_t n , Sector * p )
{
2010-05-15 22:09:31 +04:00
if ( n > = get_capacity ( state - > bdev - > bd_disk ) ) {
state - > access_beyond_eod = true ;
return NULL ;
}
2010-05-15 22:09:30 +04:00
return read_dev_sector ( state - > bdev , n , p ) ;
}
2005-04-17 02:20:36 +04:00
static inline void
put_partition ( struct parsed_partitions * p , int n , sector_t from , sector_t size )
{
if ( n < p - > limit ) {
2010-08-11 05:03:14 +04:00
char tmp [ 1 + BDEVNAME_SIZE + 10 + 1 ] ;
2005-04-17 02:20:36 +04:00
p - > parts [ n ] . from = from ;
p - > parts [ n ] . size = size ;
2010-08-11 05:03:14 +04:00
snprintf ( tmp , sizeof ( tmp ) , " %s%d " , p - > name , n ) ;
strlcat ( p - > pp_buf , tmp , PAGE_SIZE ) ;
2005-04-17 02:20:36 +04:00
}
}
extern int warn_no_part ;