Root/
1 | /* |
2 | * fs/partitions/sgi.c |
3 | * |
4 | * Code extracted from drivers/block/genhd.c |
5 | */ |
6 | |
7 | #include "check.h" |
8 | #include "sgi.h" |
9 | |
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.. */ |
16 | struct sgi_volume { |
17 | s8 name[8]; /* Name of volume */ |
18 | __be32 block_num; /* Logical block number */ |
19 | __be32 num_bytes; /* How big, in bytes */ |
20 | } volume[15]; |
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 */ |
25 | } partitions[16]; |
26 | __be32 csum; /* Disk label checksum */ |
27 | __be32 _unused1; /* Padding */ |
28 | }; |
29 | |
30 | int sgi_partition(struct parsed_partitions *state) |
31 | { |
32 | int i, csum; |
33 | __be32 magic; |
34 | int slot = 1; |
35 | unsigned int start, blocks; |
36 | __be32 *ui, cs; |
37 | Sector sect; |
38 | struct sgi_disklabel *label; |
39 | struct sgi_partition *p; |
40 | char b[BDEVNAME_SIZE]; |
41 | |
42 | label = read_part_sector(state, 0, §); |
43 | if (!label) |
44 | return -1; |
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));*/ |
50 | put_dev_sector(sect); |
51 | return 0; |
52 | } |
53 | ui = ((__be32 *) (label + 1)) - 1; |
54 | for(csum = 0; ui >= ((__be32 *) label);) { |
55 | cs = *ui--; |
56 | csum += be32_to_cpu(cs); |
57 | } |
58 | if(csum) { |
59 | printk(KERN_WARNING "Dev %s SGI disklabel: csum bad, label corrupted\n", |
60 | bdevname(state->bdev, b)); |
61 | put_dev_sector(sect); |
62 | return 0; |
63 | } |
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 |
67 | * current_minor. |
68 | */ |
69 | for(i = 0; i < 16; i++, p++) { |
70 | blocks = be32_to_cpu(p->num_blocks); |
71 | start = be32_to_cpu(p->first_block); |
72 | if (blocks) { |
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; |
76 | } |
77 | slot++; |
78 | } |
79 | strlcat(state->pp_buf, "\n", PAGE_SIZE); |
80 | put_dev_sector(sect); |
81 | return 1; |
82 | } |
83 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9