| 1 | |
| 2 | |
| 3 | * fs/partitions/sysv68.c
|
| 4 | *
|
| 5 | * Copyright (C) 2007 Philippe De Muyter <[email protected]>
|
| 6 |
|
| 7 |
|
| 8 | #include "check.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];
|
| 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;
|
| 26 | __be16 ios_slccnt;
|
| 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;
|
| 45 | __be32 blkoff;
|
| 46 | };
|
| 47 |
|
| 48 |
|
| 49 | int sysv68_partition(struct parsed_partitions *state)
|
| 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_part_sector(state, 0, §);
|
| 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_part_sector(state, i, §);
|
| 72 | if (!data)
|
| 73 | return -1;
|
| 74 |
|
| 75 | slices -= 1;
|
| 76 | seq_buf_printf(&state->pp_buf, "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 | seq_buf_printf(&state->pp_buf, "(s%u)", i);
|
| 86 | }
|
| 87 | slot++;
|
| 88 | }
|
| 89 | seq_buf_puts(&state->pp_buf, "\n");
|
| 90 | put_dev_sector(sect);
|
| 91 | return 1;
|
| 92 | }
|