1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * fs/partitions/osf.c |
4 | * |
5 | * Code extracted from drivers/block/genhd.c |
6 | * |
7 | * Copyright (C) 1991-1998 Linus Torvalds |
8 | * Re-organised Feb 1998 Russell King |
9 | */ |
10 | |
11 | #include "check.h" |
12 | |
13 | #define MAX_OSF_PARTITIONS 18 |
14 | #define DISKLABELMAGIC (0x82564557UL) |
15 | |
16 | int osf_partition(struct parsed_partitions *state) |
17 | { |
18 | int i; |
19 | int slot = 1; |
20 | unsigned int npartitions; |
21 | Sector sect; |
22 | unsigned char *data; |
23 | struct disklabel { |
24 | __le32 d_magic; |
25 | __le16 d_type,d_subtype; |
26 | u8 d_typename[16]; |
27 | u8 d_packname[16]; |
28 | __le32 d_secsize; |
29 | __le32 d_nsectors; |
30 | __le32 d_ntracks; |
31 | __le32 d_ncylinders; |
32 | __le32 d_secpercyl; |
33 | __le32 d_secprtunit; |
34 | __le16 d_sparespertrack; |
35 | __le16 d_sparespercyl; |
36 | __le32 d_acylinders; |
37 | __le16 d_rpm, d_interleave, d_trackskew, d_cylskew; |
38 | __le32 d_headswitch, d_trkseek, d_flags; |
39 | __le32 d_drivedata[5]; |
40 | __le32 d_spare[5]; |
41 | __le32 d_magic2; |
42 | __le16 d_checksum; |
43 | __le16 d_npartitions; |
44 | __le32 d_bbsize, d_sbsize; |
45 | struct d_partition { |
46 | __le32 p_size; |
47 | __le32 p_offset; |
48 | __le32 p_fsize; |
49 | u8 p_fstype; |
50 | u8 p_frag; |
51 | __le16 p_cpg; |
52 | } d_partitions[MAX_OSF_PARTITIONS]; |
53 | } * label; |
54 | struct d_partition * partition; |
55 | |
56 | data = read_part_sector(state, n: 0, p: §); |
57 | if (!data) |
58 | return -1; |
59 | |
60 | label = (struct disklabel *) (data+64); |
61 | partition = label->d_partitions; |
62 | if (le32_to_cpu(label->d_magic) != DISKLABELMAGIC) { |
63 | put_dev_sector(p: sect); |
64 | return 0; |
65 | } |
66 | if (le32_to_cpu(label->d_magic2) != DISKLABELMAGIC) { |
67 | put_dev_sector(p: sect); |
68 | return 0; |
69 | } |
70 | npartitions = le16_to_cpu(label->d_npartitions); |
71 | if (npartitions > MAX_OSF_PARTITIONS) { |
72 | put_dev_sector(p: sect); |
73 | return 0; |
74 | } |
75 | for (i = 0 ; i < npartitions; i++, partition++) { |
76 | if (slot == state->limit) |
77 | break; |
78 | if (le32_to_cpu(partition->p_size)) |
79 | put_partition(p: state, n: slot, |
80 | le32_to_cpu(partition->p_offset), |
81 | le32_to_cpu(partition->p_size)); |
82 | slot++; |
83 | } |
84 | strlcat(p: state->pp_buf, q: "\n" , PAGE_SIZE); |
85 | put_dev_sector(p: sect); |
86 | return 1; |
87 | } |
88 | |