4 * Code extracted from drivers/block/genhd.c
10 struct sgi_disklabel
{
11 __be32 magic_mushroom
; /* Big fat spliff... */
12 __be16 root_part_num
; /* Root partition number */
13 __be16 swap_part_num
; /* Swap partition number */
14 s8 boot_file
[16]; /* Name of boot file for ARCS */
15 u8 _unused0
[48]; /* Device parameter useless crapola.. */
17 s8 name
[8]; /* Name of volume */
18 __be32 block_num
; /* Logical block number */
19 __be32 num_bytes
; /* How big, in bytes */
21 struct sgi_partition
{
22 __be32 num_blocks
; /* Size in logical blocks */
23 __be32 first_block
; /* First logical block */
24 __be32 type
; /* Type of this partition */
26 __be32 csum
; /* Disk label checksum */
27 __be32 _unused1
; /* Padding */
30 int sgi_partition(struct parsed_partitions
*state
, struct block_device
*bdev
)
35 unsigned int start
, blocks
;
38 struct sgi_disklabel
*label
;
39 struct sgi_partition
*p
;
40 char b
[BDEVNAME_SIZE
];
42 label
= (struct sgi_disklabel
*) read_dev_sector(bdev
, 0, §
);
45 p
= &label
->partitions
[0];
46 magic
= label
->magic_mushroom
;
47 if(be32_to_cpu(magic
) != SGI_LABEL_MAGIC
) {
48 /*printk("Dev %s SGI disklabel: bad magic %08x\n",
49 bdevname(bdev, b), be32_to_cpu(magic));*/
53 ui
= ((__be32
*) (label
+ 1)) - 1;
54 for(csum
= 0; ui
>= ((__be32
*) label
);) {
56 csum
+= be32_to_cpu(cs
);
59 printk(KERN_WARNING
"Dev %s SGI disklabel: csum bad, label corrupted\n",
64 /* All SGI disk labels have 16 partitions, disks under Linux only
65 * have 15 minor's. Luckily there are always a few zero length
66 * partitions which we don't care about so we never overflow the
69 for(i
= 0; i
< 16; i
++, p
++) {
70 blocks
= be32_to_cpu(p
->num_blocks
);
71 start
= be32_to_cpu(p
->first_block
);
73 put_partition(state
, slot
, start
, blocks
);
74 if (be32_to_cpu(p
->type
) == LINUX_RAID_PARTITION
)
75 state
->parts
[slot
].flags
= ADDPART_FLAG_RAID
;