18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * fs/partitions/osf.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Code extracted from drivers/block/genhd.c 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 1991-1998 Linus Torvalds 88c2ecf20Sopenharmony_ci * Re-organised Feb 1998 Russell King 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "check.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define MAX_OSF_PARTITIONS 18 148c2ecf20Sopenharmony_ci#define DISKLABELMAGIC (0x82564557UL) 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciint osf_partition(struct parsed_partitions *state) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci int i; 198c2ecf20Sopenharmony_ci int slot = 1; 208c2ecf20Sopenharmony_ci unsigned int npartitions; 218c2ecf20Sopenharmony_ci Sector sect; 228c2ecf20Sopenharmony_ci unsigned char *data; 238c2ecf20Sopenharmony_ci struct disklabel { 248c2ecf20Sopenharmony_ci __le32 d_magic; 258c2ecf20Sopenharmony_ci __le16 d_type,d_subtype; 268c2ecf20Sopenharmony_ci u8 d_typename[16]; 278c2ecf20Sopenharmony_ci u8 d_packname[16]; 288c2ecf20Sopenharmony_ci __le32 d_secsize; 298c2ecf20Sopenharmony_ci __le32 d_nsectors; 308c2ecf20Sopenharmony_ci __le32 d_ntracks; 318c2ecf20Sopenharmony_ci __le32 d_ncylinders; 328c2ecf20Sopenharmony_ci __le32 d_secpercyl; 338c2ecf20Sopenharmony_ci __le32 d_secprtunit; 348c2ecf20Sopenharmony_ci __le16 d_sparespertrack; 358c2ecf20Sopenharmony_ci __le16 d_sparespercyl; 368c2ecf20Sopenharmony_ci __le32 d_acylinders; 378c2ecf20Sopenharmony_ci __le16 d_rpm, d_interleave, d_trackskew, d_cylskew; 388c2ecf20Sopenharmony_ci __le32 d_headswitch, d_trkseek, d_flags; 398c2ecf20Sopenharmony_ci __le32 d_drivedata[5]; 408c2ecf20Sopenharmony_ci __le32 d_spare[5]; 418c2ecf20Sopenharmony_ci __le32 d_magic2; 428c2ecf20Sopenharmony_ci __le16 d_checksum; 438c2ecf20Sopenharmony_ci __le16 d_npartitions; 448c2ecf20Sopenharmony_ci __le32 d_bbsize, d_sbsize; 458c2ecf20Sopenharmony_ci struct d_partition { 468c2ecf20Sopenharmony_ci __le32 p_size; 478c2ecf20Sopenharmony_ci __le32 p_offset; 488c2ecf20Sopenharmony_ci __le32 p_fsize; 498c2ecf20Sopenharmony_ci u8 p_fstype; 508c2ecf20Sopenharmony_ci u8 p_frag; 518c2ecf20Sopenharmony_ci __le16 p_cpg; 528c2ecf20Sopenharmony_ci } d_partitions[MAX_OSF_PARTITIONS]; 538c2ecf20Sopenharmony_ci } * label; 548c2ecf20Sopenharmony_ci struct d_partition * partition; 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci data = read_part_sector(state, 0, §); 578c2ecf20Sopenharmony_ci if (!data) 588c2ecf20Sopenharmony_ci return -1; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci label = (struct disklabel *) (data+64); 618c2ecf20Sopenharmony_ci partition = label->d_partitions; 628c2ecf20Sopenharmony_ci if (le32_to_cpu(label->d_magic) != DISKLABELMAGIC) { 638c2ecf20Sopenharmony_ci put_dev_sector(sect); 648c2ecf20Sopenharmony_ci return 0; 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci if (le32_to_cpu(label->d_magic2) != DISKLABELMAGIC) { 678c2ecf20Sopenharmony_ci put_dev_sector(sect); 688c2ecf20Sopenharmony_ci return 0; 698c2ecf20Sopenharmony_ci } 708c2ecf20Sopenharmony_ci npartitions = le16_to_cpu(label->d_npartitions); 718c2ecf20Sopenharmony_ci if (npartitions > MAX_OSF_PARTITIONS) { 728c2ecf20Sopenharmony_ci put_dev_sector(sect); 738c2ecf20Sopenharmony_ci return 0; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci for (i = 0 ; i < npartitions; i++, partition++) { 768c2ecf20Sopenharmony_ci if (slot == state->limit) 778c2ecf20Sopenharmony_ci break; 788c2ecf20Sopenharmony_ci if (le32_to_cpu(partition->p_size)) 798c2ecf20Sopenharmony_ci put_partition(state, slot, 808c2ecf20Sopenharmony_ci le32_to_cpu(partition->p_offset), 818c2ecf20Sopenharmony_ci le32_to_cpu(partition->p_size)); 828c2ecf20Sopenharmony_ci slot++; 838c2ecf20Sopenharmony_ci } 848c2ecf20Sopenharmony_ci strlcat(state->pp_buf, "\n", PAGE_SIZE); 858c2ecf20Sopenharmony_ci put_dev_sector(sect); 868c2ecf20Sopenharmony_ci return 1; 878c2ecf20Sopenharmony_ci} 88