Commit | Line | Data |
---|---|---|
0e6e1db4 BC |
1 | /* |
2 | * fs/partitions/karma.c | |
3 | * Rio Karma partition info. | |
4 | * | |
5 | * Copyright (C) 2006 Bob Copeland (me@bobcopeland.com) | |
6 | * based on osf.c | |
7 | */ | |
8 | ||
9 | #include "check.h" | |
10 | #include "karma.h" | |
e3ebf0d4 | 11 | #include <linux/compiler.h> |
0e6e1db4 | 12 | |
1493bf21 | 13 | int karma_partition(struct parsed_partitions *state) |
0e6e1db4 BC |
14 | { |
15 | int i; | |
16 | int slot = 1; | |
17 | Sector sect; | |
18 | unsigned char *data; | |
19 | struct disklabel { | |
20 | u8 d_reserved[270]; | |
21 | struct d_partition { | |
22 | __le32 p_res; | |
23 | u8 p_fstype; | |
24 | u8 p_res2[3]; | |
25 | __le32 p_offset; | |
26 | __le32 p_size; | |
27 | } d_partitions[2]; | |
28 | u8 d_blank[208]; | |
29 | __le16 d_magic; | |
e3ebf0d4 | 30 | } __packed *label; |
0e6e1db4 BC |
31 | struct d_partition *p; |
32 | ||
1493bf21 | 33 | data = read_part_sector(state, 0, §); |
0e6e1db4 BC |
34 | if (!data) |
35 | return -1; | |
36 | ||
37 | label = (struct disklabel *)data; | |
38 | if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) { | |
39 | put_dev_sector(sect); | |
40 | return 0; | |
41 | } | |
42 | ||
43 | p = label->d_partitions; | |
44 | for (i = 0 ; i < 2; i++, p++) { | |
45 | if (slot == state->limit) | |
46 | break; | |
47 | ||
48 | if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) { | |
49 | put_partition(state, slot, le32_to_cpu(p->p_offset), | |
50 | le32_to_cpu(p->p_size)); | |
51 | } | |
52 | slot++; | |
53 | } | |
9c867fbe | 54 | strlcat(state->pp_buf, "\n", PAGE_SIZE); |
0e6e1db4 BC |
55 | put_dev_sector(sect); |
56 | return 1; | |
57 | } | |
58 |