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