1 // SPDX-License-Identifier: GPL-2.0
5 * Code extracted from drivers/block/genhd.c
7 * Copyright (C) 1991-1998 Linus Torvalds
8 * Re-organised Feb 1998 Russell King
14 int sun_partition(struct parsed_partitions
*state
)
21 struct sun_disklabel
{
22 unsigned char info
[128]; /* Informative text string */
24 __be32 version
; /* Layout version */
25 char volume
[8]; /* Volume name */
26 __be16 nparts
; /* Number of partitions */
27 struct sun_info
{ /* Partition hdrs, sec 2 */
31 __be16 padding
; /* Alignment padding */
32 __be32 bootinfo
[3]; /* Info needed by mboot */
33 __be32 sanity
; /* To verify vtoc sanity */
34 __be32 reserved
[10]; /* Free space */
35 __be32 timestamp
[8]; /* Partition timestamp */
37 __be32 write_reinstruct
; /* sectors to skip, writes */
38 __be32 read_reinstruct
; /* sectors to skip, reads */
39 unsigned char spare
[148]; /* Padding */
40 __be16 rspeed
; /* Disk rotational speed */
41 __be16 pcylcount
; /* Physical cylinder count */
42 __be16 sparecyl
; /* extra sects per cylinder */
43 __be16 obs1
; /* gap1 */
44 __be16 obs2
; /* gap2 */
45 __be16 ilfact
; /* Interleave factor */
46 __be16 ncyl
; /* Data cylinder count */
47 __be16 nacyl
; /* Alt. cylinder count */
48 __be16 ntrks
; /* Tracks per cylinder */
49 __be16 nsect
; /* Sectors per track */
50 __be16 obs3
; /* bhead - Label head offset */
51 __be16 obs4
; /* ppart - Physical Partition */
52 struct sun_partition
{
53 __be32 start_cylinder
;
56 __be16 magic
; /* Magic number */
57 __be16 csum
; /* Label xor'd checksum */
59 struct sun_partition
*p
;
61 char b
[BDEVNAME_SIZE
];
65 label
= read_part_sector(state
, 0, §
);
69 p
= label
->partitions
;
70 if (be16_to_cpu(label
->magic
) != SUN_LABEL_MAGIC
) {
71 /* printk(KERN_INFO "Dev %s Sun disklabel: bad magic %04x\n",
72 bdevname(bdev, b), be16_to_cpu(label->magic)); */
76 /* Look at the checksum */
77 ush
= ((__be16
*) (label
+1)) - 1;
78 for (csum
= 0; ush
>= ((__be16
*) label
);)
81 printk("Dev %s Sun disklabel: Csum bad, label corrupted\n",
82 bdevname(state
->bdev
, b
));
87 /* Check to see if we can use the VTOC table */
88 use_vtoc
= ((be32_to_cpu(label
->vtoc
.sanity
) == SUN_VTOC_SANITY
) &&
89 (be32_to_cpu(label
->vtoc
.version
) == 1) &&
90 (be16_to_cpu(label
->vtoc
.nparts
) <= 8));
92 /* Use 8 partition entries if not specified in validated VTOC */
93 nparts
= (use_vtoc
) ? be16_to_cpu(label
->vtoc
.nparts
) : 8;
96 * So that old Linux-Sun partitions continue to work,
97 * alow the VTOC to be used under the additional condition ...
99 use_vtoc
= use_vtoc
|| !(label
->vtoc
.sanity
||
100 label
->vtoc
.version
|| label
->vtoc
.nparts
);
101 spc
= be16_to_cpu(label
->ntrks
) * be16_to_cpu(label
->nsect
);
102 for (i
= 0; i
< nparts
; i
++, p
++) {
103 unsigned long st_sector
;
104 unsigned int num_sectors
;
106 st_sector
= be32_to_cpu(p
->start_cylinder
) * spc
;
107 num_sectors
= be32_to_cpu(p
->num_sectors
);
109 put_partition(state
, slot
, st_sector
, num_sectors
);
110 state
->parts
[slot
].flags
= 0;
112 if (be16_to_cpu(label
->vtoc
.infos
[i
].id
) == LINUX_RAID_PARTITION
)
113 state
->parts
[slot
].flags
|= ADDPART_FLAG_RAID
;
114 else if (be16_to_cpu(label
->vtoc
.infos
[i
].id
) == SUN_WHOLE_DISK
)
115 state
->parts
[slot
].flags
|= ADDPART_FLAG_WHOLEDISK
;
120 strlcat(state
->pp_buf
, "\n", PAGE_SIZE
);
121 put_dev_sector(sect
);