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 17int 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