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, §);
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