brintos

brintos / linux-shallow public Read only

0
0
Text · 1.9 KiB · 84560d0 Raw
88 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 *  fs/partitions/osf.c4 *5 *  Code extracted from drivers/block/genhd.c6 *7 *  Copyright (C) 1991-1998  Linus Torvalds8 *  Re-organised Feb 1998 Russell King9 */10 11#include "check.h"12 13#define MAX_OSF_PARTITIONS 1814#define DISKLABELMAGIC (0x82564557UL)15 16int 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, 0, &sect);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(sect);64		return 0;65	}66	if (le32_to_cpu(label->d_magic2) != DISKLABELMAGIC) {67		put_dev_sector(sect);68		return 0;69	}70	npartitions = le16_to_cpu(label->d_npartitions);71	if (npartitions > MAX_OSF_PARTITIONS) {72		put_dev_sector(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(state, slot,80				le32_to_cpu(partition->p_offset),81				le32_to_cpu(partition->p_size));82		slot++;83	}84	strlcat(state->pp_buf, "\n", PAGE_SIZE);85	put_dev_sector(sect);86	return 1;87}88