1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
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 <linux/compiler.h> |
12 | |
13 | #define KARMA_LABEL_MAGIC 0xAB56 |
14 | |
15 | int karma_partition(struct parsed_partitions *state) |
16 | { |
17 | int i; |
18 | int slot = 1; |
19 | Sector sect; |
20 | unsigned char *data; |
21 | struct disklabel { |
22 | u8 d_reserved[270]; |
23 | struct d_partition { |
24 | __le32 p_res; |
25 | u8 p_fstype; |
26 | u8 p_res2[3]; |
27 | __le32 p_offset; |
28 | __le32 p_size; |
29 | } d_partitions[2]; |
30 | u8 d_blank[208]; |
31 | __le16 d_magic; |
32 | } __packed *label; |
33 | struct d_partition *p; |
34 | |
35 | data = read_part_sector(state, n: 0, p: §); |
36 | if (!data) |
37 | return -1; |
38 | |
39 | label = (struct disklabel *)data; |
40 | if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) { |
41 | put_dev_sector(p: sect); |
42 | return 0; |
43 | } |
44 | |
45 | p = label->d_partitions; |
46 | for (i = 0 ; i < 2; i++, p++) { |
47 | if (slot == state->limit) |
48 | break; |
49 | |
50 | if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) { |
51 | put_partition(p: state, n: slot, le32_to_cpu(p->p_offset), |
52 | le32_to_cpu(p->p_size)); |
53 | } |
54 | slot++; |
55 | } |
56 | strlcat(p: state->pp_buf, q: "\n", PAGE_SIZE); |
57 | put_dev_sector(p: sect); |
58 | return 1; |
59 | } |
60 | |
61 |