Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

partition: add support for sysv68 partitions

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>

authored by

Philippe De Muyter and committed by
Linus Torvalds
19d0e8ce e729aa16

+107
+9
fs/partitions/Kconfig
··· 236 236 help 237 237 Say Y here if you would like to use hard disks under Linux which 238 238 were partitioned using EFI GPT. 239 + 240 + config SYSV68_PARTITION 241 + bool "SYSV68 partition table support" if PARTITION_ADVANCED 242 + default y if M68K 243 + help 244 + Say Y here if you would like to be able to read the hard disk 245 + partition table format used by Motorola Delta machines (using 246 + sysv68). 247 + Otherwise, say N.
+1
fs/partitions/Makefile
··· 17 17 obj-$(CONFIG_IBM_PARTITION) += ibm.o 18 18 obj-$(CONFIG_EFI_PARTITION) += efi.o 19 19 obj-$(CONFIG_KARMA_PARTITION) += karma.o 20 + obj-$(CONFIG_SYSV68_PARTITION) += sysv68.o
+4
fs/partitions/check.c
··· 34 34 #include "ultrix.h" 35 35 #include "efi.h" 36 36 #include "karma.h" 37 + #include "sysv68.h" 37 38 38 39 #ifdef CONFIG_BLK_DEV_MD 39 40 extern void md_autodetect_dev(dev_t dev); ··· 105 104 #endif 106 105 #ifdef CONFIG_KARMA_PARTITION 107 106 karma_partition, 107 + #endif 108 + #ifdef CONFIG_SYSV68_PARTITION 109 + sysv68_partition, 108 110 #endif 109 111 NULL 110 112 };
+92
fs/partitions/sysv68.c
··· 1 + /* 2 + * fs/partitions/sysv68.c 3 + * 4 + * Copyright (C) 2007 Philippe De Muyter <phdm@macqel.be> 5 + */ 6 + 7 + #include "check.h" 8 + #include "sysv68.h" 9 + 10 + /* 11 + * Volume ID structure: on first 256-bytes sector of disk 12 + */ 13 + 14 + struct volumeid { 15 + u8 vid_unused[248]; 16 + u8 vid_mac[8]; /* ASCII string "MOTOROLA" */ 17 + }; 18 + 19 + /* 20 + * config block: second 256-bytes sector on disk 21 + */ 22 + 23 + struct dkconfig { 24 + u8 ios_unused0[128]; 25 + __be32 ios_slcblk; /* Slice table block number */ 26 + __be16 ios_slccnt; /* Number of entries in slice table */ 27 + u8 ios_unused1[122]; 28 + }; 29 + 30 + /* 31 + * combined volumeid and dkconfig block 32 + */ 33 + 34 + struct dkblk0 { 35 + struct volumeid dk_vid; 36 + struct dkconfig dk_ios; 37 + }; 38 + 39 + /* 40 + * Slice Table Structure 41 + */ 42 + 43 + struct slice { 44 + __be32 nblocks; /* slice size (in blocks) */ 45 + __be32 blkoff; /* block offset of slice */ 46 + }; 47 + 48 + 49 + int sysv68_partition(struct parsed_partitions *state, struct block_device *bdev) 50 + { 51 + int i, slices; 52 + int slot = 1; 53 + Sector sect; 54 + unsigned char *data; 55 + struct dkblk0 *b; 56 + struct slice *slice; 57 + 58 + data = read_dev_sector(bdev, 0, &sect); 59 + if (!data) 60 + return -1; 61 + 62 + b = (struct dkblk0 *)data; 63 + if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) { 64 + put_dev_sector(sect); 65 + return 0; 66 + } 67 + slices = be16_to_cpu(b->dk_ios.ios_slccnt); 68 + i = be32_to_cpu(b->dk_ios.ios_slcblk); 69 + put_dev_sector(sect); 70 + 71 + data = read_dev_sector(bdev, i, &sect); 72 + if (!data) 73 + return -1; 74 + 75 + slices -= 1; /* last slice is the whole disk */ 76 + printk("sysV68: %s(s%u)", state->name, slices); 77 + slice = (struct slice *)data; 78 + for (i = 0; i < slices; i++, slice++) { 79 + if (slot == state->limit) 80 + break; 81 + if (be32_to_cpu(slice->nblocks)) { 82 + put_partition(state, slot, 83 + be32_to_cpu(slice->blkoff), 84 + be32_to_cpu(slice->nblocks)); 85 + printk("(s%u)", i); 86 + } 87 + slot++; 88 + } 89 + printk("\n"); 90 + put_dev_sector(sect); 91 + return 1; 92 + }
+1
fs/partitions/sysv68.h
··· 1 + extern int sysv68_partition(struct parsed_partitions *state, struct block_device *bdev);