 19d0e8ce85
			
		
	
	
	19d0e8ce85
	
	
	
		
			
			Add support for the Motorola sysv68 disk partition (slices in motorola doc). Signed-off-by: Philippe De Muyter <phdm@macqel.be> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  fs/partitions/sysv68.c
 | |
|  *
 | |
|  *  Copyright (C) 2007 Philippe De Muyter <phdm@macqel.be>
 | |
|  */
 | |
| 
 | |
| #include "check.h"
 | |
| #include "sysv68.h"
 | |
| 
 | |
| /*
 | |
|  *	Volume ID structure: on first 256-bytes sector of disk
 | |
|  */
 | |
| 
 | |
| struct volumeid {
 | |
| 	u8	vid_unused[248];
 | |
| 	u8	vid_mac[8];	/* ASCII string "MOTOROLA" */
 | |
| };
 | |
| 
 | |
| /*
 | |
|  *	config block: second 256-bytes sector on disk
 | |
|  */
 | |
| 
 | |
| struct dkconfig {
 | |
| 	u8	ios_unused0[128];
 | |
| 	__be32	ios_slcblk;	/* Slice table block number */
 | |
| 	__be16	ios_slccnt;	/* Number of entries in slice table */
 | |
| 	u8	ios_unused1[122];
 | |
| };
 | |
| 
 | |
| /*
 | |
|  *	combined volumeid and dkconfig block
 | |
|  */
 | |
| 
 | |
| struct dkblk0 {
 | |
| 	struct volumeid dk_vid;
 | |
| 	struct dkconfig dk_ios;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  *	Slice Table Structure
 | |
|  */
 | |
| 
 | |
| struct slice {
 | |
| 	__be32	nblocks;		/* slice size (in blocks) */
 | |
| 	__be32	blkoff;			/* block offset of slice */
 | |
| };
 | |
| 
 | |
| 
 | |
| int sysv68_partition(struct parsed_partitions *state, struct block_device *bdev)
 | |
| {
 | |
| 	int i, slices;
 | |
| 	int slot = 1;
 | |
| 	Sector sect;
 | |
| 	unsigned char *data;
 | |
| 	struct dkblk0 *b;
 | |
| 	struct slice *slice;
 | |
| 
 | |
| 	data = read_dev_sector(bdev, 0, §);
 | |
| 	if (!data)
 | |
| 		return -1;
 | |
| 
 | |
| 	b = (struct dkblk0 *)data;
 | |
| 	if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) {
 | |
| 		put_dev_sector(sect);
 | |
| 		return 0;
 | |
| 	}
 | |
| 	slices = be16_to_cpu(b->dk_ios.ios_slccnt);
 | |
| 	i = be32_to_cpu(b->dk_ios.ios_slcblk);
 | |
| 	put_dev_sector(sect);
 | |
| 
 | |
| 	data = read_dev_sector(bdev, i, §);
 | |
| 	if (!data)
 | |
| 		return -1;
 | |
| 
 | |
| 	slices -= 1; /* last slice is the whole disk */
 | |
| 	printk("sysV68: %s(s%u)", state->name, slices);
 | |
| 	slice = (struct slice *)data;
 | |
| 	for (i = 0; i < slices; i++, slice++) {
 | |
| 		if (slot == state->limit)
 | |
| 			break;
 | |
| 		if (be32_to_cpu(slice->nblocks)) {
 | |
| 			put_partition(state, slot,
 | |
| 				be32_to_cpu(slice->blkoff),
 | |
| 				be32_to_cpu(slice->nblocks));
 | |
| 			printk("(s%u)", i);
 | |
| 		}
 | |
| 		slot++;
 | |
| 	}
 | |
| 	printk("\n");
 | |
| 	put_dev_sector(sect);
 | |
| 	return 1;
 | |
| }
 |