xref: /openbmc/linux/block/partitions/ultrix.c (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
29be96f3fSAl Viro /*
39be96f3fSAl Viro  *  fs/partitions/ultrix.c
49be96f3fSAl Viro  *
59be96f3fSAl Viro  *  Code extracted from drivers/block/genhd.c
69be96f3fSAl Viro  *
79be96f3fSAl Viro  *  Re-organised Jul 1999 Russell King
89be96f3fSAl Viro  */
99be96f3fSAl Viro 
109be96f3fSAl Viro #include "check.h"
119be96f3fSAl Viro 
ultrix_partition(struct parsed_partitions * state)129be96f3fSAl Viro int ultrix_partition(struct parsed_partitions *state)
139be96f3fSAl Viro {
149be96f3fSAl Viro 	int i;
159be96f3fSAl Viro 	Sector sect;
169be96f3fSAl Viro 	unsigned char *data;
179be96f3fSAl Viro 	struct ultrix_disklabel {
189be96f3fSAl Viro 		s32	pt_magic;	/* magic no. indicating part. info exits */
199be96f3fSAl Viro 		s32	pt_valid;	/* set by driver if pt is current */
209be96f3fSAl Viro 		struct  pt_info {
219be96f3fSAl Viro 			s32		pi_nblocks; /* no. of sectors */
229be96f3fSAl Viro 			u32		pi_blkoff;  /* block offset for start */
239be96f3fSAl Viro 		} pt_part[8];
249be96f3fSAl Viro 	} *label;
259be96f3fSAl Viro 
269be96f3fSAl Viro #define PT_MAGIC	0x032957	/* Partition magic number */
279be96f3fSAl Viro #define PT_VALID	1		/* Indicates if struct is valid */
289be96f3fSAl Viro 
299be96f3fSAl Viro 	data = read_part_sector(state, (16384 - sizeof(*label))/512, &sect);
309be96f3fSAl Viro 	if (!data)
319be96f3fSAl Viro 		return -1;
329be96f3fSAl Viro 
339be96f3fSAl Viro 	label = (struct ultrix_disklabel *)(data + 512 - sizeof(*label));
349be96f3fSAl Viro 
359be96f3fSAl Viro 	if (label->pt_magic == PT_MAGIC && label->pt_valid == PT_VALID) {
369be96f3fSAl Viro 		for (i=0; i<8; i++)
379be96f3fSAl Viro 			if (label->pt_part[i].pi_nblocks)
389be96f3fSAl Viro 				put_partition(state, i+1,
399be96f3fSAl Viro 					      label->pt_part[i].pi_blkoff,
409be96f3fSAl Viro 					      label->pt_part[i].pi_nblocks);
419be96f3fSAl Viro 		put_dev_sector(sect);
429be96f3fSAl Viro 		strlcat(state->pp_buf, "\n", PAGE_SIZE);
439be96f3fSAl Viro 		return 1;
449be96f3fSAl Viro 	} else {
459be96f3fSAl Viro 		put_dev_sector(sect);
469be96f3fSAl Viro 		return 0;
479be96f3fSAl Viro 	}
489be96f3fSAl Viro }
49