summaryrefslogtreecommitdiffstats
path: root/fs/partitions/ultrix.c
blob: 1de4d04b0c56dbce890c9cec48934b704387793d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 *  fs/partitions/ultrix.c
 *
 *  Code extracted from drivers/block/genhd.c
 *
 *  Re-organised Jul 1999 Russell King
 */

#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/blk.h>

#include "check.h"
#include "ultrix.h"

int ultrix_partition(struct gendisk *hd, kdev_t dev, unsigned long first_sector, int first_part_minor)
{
	int i;
	struct buffer_head *bh;
	struct ultrix_disklabel {
		s32	pt_magic;	/* magic no. indicating part. info exits */
		s32	pt_valid;	/* set by driver if pt is current */
		struct  pt_info {
			s32		pi_nblocks; /* no. of sectors */
			u32		pi_blkoff;  /* block offset for start */
		} pt_part[8];
	} *label;

	bh = bread (dev, SBLOCK, get_ptable_blocksize(dev));
	if (!bh) {
		printk (" unable to read block 0x%lx\n", SBLOCK);
		return -1;
	}
	
	label = (struct ultrix_disklabel *)(bh->b_data
                                            + get_ptable_blocksize(dev)
                                            - sizeof(struct ultrix_disklabel));

	if (le32_to_cpu(label->pt_magic) == PT_MAGIC && 
	    le32_to_cpu(label->pt_valid == PT_VALID)) {
		for (i=0; i<8; i++, first_part_minor++)
			if (le32_to_cpu(label->pt_part[i].pi_nblocks))
				add_gd_partition(hd, first_part_minor, 
			   			le32_to_cpu(label->pt_part[i].pi_blkoff), 			
	      					le32_to_cpu(label->pt_part[i].pi_nblocks));

		brelse(bh);
		printk ("\n");
		return 1;
	} else {
		brelse(bh);
		return 0;
	}
}