1 /*
2  *  fs/partitions/ultrix.c
3  *
4  *  Code extracted from drivers/block/genhd.c
5  *
6  *  Re-organised Jul 1999 Russell King
7  */
8 
9 #include <linux/fs.h>
10 #include <linux/genhd.h>
11 #include <linux/kernel.h>
12 #include <linux/major.h>
13 #include <linux/blk.h>
14 
15 #include "check.h"
16 
ultrix_partition(struct gendisk * hd,struct block_device * bdev,unsigned long first_sector,int first_part_minor)17 int ultrix_partition(struct gendisk *hd, struct block_device *bdev,
18                             unsigned long first_sector, int first_part_minor)
19 {
20 	int i;
21 	Sector sect;
22 	unsigned char *data;
23 	struct ultrix_disklabel {
24 		s32	pt_magic;	/* magic no. indicating part. info exits */
25 		s32	pt_valid;	/* set by driver if pt is current */
26 		struct  pt_info {
27 			s32		pi_nblocks; /* no. of sectors */
28 			u32		pi_blkoff;  /* block offset for start */
29 		} pt_part[8];
30 	} *label;
31 
32 #define PT_MAGIC	0x032957	/* Partition magic number */
33 #define PT_VALID	1		/* Indicates if struct is valid */
34 
35 	data = read_dev_sector(bdev, (16384 - sizeof(*label))/512, &sect);
36 	if (!data)
37 		return -1;
38 
39 	label = (struct ultrix_disklabel *)(data + 512 - sizeof(*label));
40 
41 	if (label->pt_magic == PT_MAGIC && label->pt_valid == PT_VALID) {
42 		for (i=0; i<8; i++, first_part_minor++)
43 			if (label->pt_part[i].pi_nblocks)
44 				add_gd_partition(hd, first_part_minor,
45 					      label->pt_part[i].pi_blkoff,
46 					      label->pt_part[i].pi_nblocks);
47 		put_dev_sector(sect);
48 		printk ("\n");
49 		return 1;
50 	} else {
51 		put_dev_sector(sect);
52 		return 0;
53 	}
54 }
55