Blame view
block/partitions/amiga.c
3.65 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* * fs/partitions/amiga.c * * Code extracted from drivers/block/genhd.c * * Copyright (C) 1991-1998 Linus Torvalds * Re-organised Feb 1998 Russell King */ #include <linux/types.h> #include <linux/affs_hardblocks.h> #include "check.h" #include "amiga.h" static __inline__ u32 checksum_block(__be32 *m, int size) { u32 sum = 0; while (size--) sum += be32_to_cpu(*m++); return sum; } |
1493bf217 block: use struct... |
25 |
int amiga_partition(struct parsed_partitions *state) |
1da177e4c Linux-2.6.12-rc2 |
26 27 28 29 30 31 32 33 34 35 36 37 38 |
{ Sector sect; unsigned char *data; struct RigidDiskBlock *rdb; struct PartitionBlock *pb; int start_sect, nr_sects, blk, part, res = 0; int blksize = 1; /* Multiplier for disk block size */ int slot = 1; char b[BDEVNAME_SIZE]; for (blk = 0; ; blk++, put_dev_sector(sect)) { if (blk == RDB_ALLOCATION_LIMIT) goto rdb_done; |
1493bf217 block: use struct... |
39 |
data = read_part_sector(state, blk, §); |
1da177e4c Linux-2.6.12-rc2 |
40 41 42 43 |
if (!data) { if (warn_no_part) printk("Dev %s: unable to read RDB block %d ", |
1493bf217 block: use struct... |
44 |
bdevname(state->bdev, b), blk); |
57881dd9d [PATCH] Fix check... |
45 |
res = -1; |
1da177e4c Linux-2.6.12-rc2 |
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
goto rdb_done; } if (*(__be32 *)data != cpu_to_be32(IDNAME_RIGIDDISK)) continue; rdb = (struct RigidDiskBlock *)data; if (checksum_block((__be32 *)data, be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F) == 0) break; /* Try again with 0xdc..0xdf zeroed, Windows might have * trashed it. */ *(__be32 *)(data+0xdc) = 0; if (checksum_block((__be32 *)data, be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F)==0) { printk("Warning: Trashed word at 0xd0 in block %d " "ignored in checksum calculation ",blk); break; } printk("Dev %s: RDB in block %d has bad checksum ", |
1493bf217 block: use struct... |
68 |
bdevname(state->bdev, b), blk); |
1da177e4c Linux-2.6.12-rc2 |
69 70 71 72 |
} /* blksize is blocks per 512 byte standard block */ blksize = be32_to_cpu( rdb->rdb_BlockBytes ) / 512; |
9c867fbe0 partitions: fix s... |
73 74 75 76 77 78 79 |
{ char tmp[7 + 10 + 1 + 1]; /* Be more informative */ snprintf(tmp, sizeof(tmp), " RDSK (%d)", blksize * 512); strlcat(state->pp_buf, tmp, PAGE_SIZE); } |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 83 |
blk = be32_to_cpu(rdb->rdb_PartitionList); put_dev_sector(sect); for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) { blk *= blksize; /* Read in terms partition table understands */ |
1493bf217 block: use struct... |
84 |
data = read_part_sector(state, blk, §); |
1da177e4c Linux-2.6.12-rc2 |
85 86 87 88 |
if (!data) { if (warn_no_part) printk("Dev %s: unable to read partition block %d ", |
1493bf217 block: use struct... |
89 |
bdevname(state->bdev, b), blk); |
57881dd9d [PATCH] Fix check... |
90 |
res = -1; |
1da177e4c Linux-2.6.12-rc2 |
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
goto rdb_done; } pb = (struct PartitionBlock *)data; blk = be32_to_cpu(pb->pb_Next); if (pb->pb_ID != cpu_to_be32(IDNAME_PARTITION)) continue; if (checksum_block((__be32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 ) continue; /* Tell Kernel about it */ nr_sects = (be32_to_cpu(pb->pb_Environment[10]) + 1 - be32_to_cpu(pb->pb_Environment[9])) * be32_to_cpu(pb->pb_Environment[3]) * be32_to_cpu(pb->pb_Environment[5]) * blksize; if (!nr_sects) continue; start_sect = be32_to_cpu(pb->pb_Environment[9]) * be32_to_cpu(pb->pb_Environment[3]) * be32_to_cpu(pb->pb_Environment[5]) * blksize; put_partition(state,slot++,start_sect,nr_sects); { /* Be even more informative to aid mounting */ char dostype[4]; |
9c867fbe0 partitions: fix s... |
117 |
char tmp[42]; |
1da177e4c Linux-2.6.12-rc2 |
118 119 120 |
__be32 *dt = (__be32 *)dostype; *dt = pb->pb_Environment[16]; if (dostype[3] < ' ') |
9c867fbe0 partitions: fix s... |
121 |
snprintf(tmp, sizeof(tmp), " (%c%c%c^%c)", |
1da177e4c Linux-2.6.12-rc2 |
122 123 124 |
dostype[0], dostype[1], dostype[2], dostype[3] + '@' ); else |
9c867fbe0 partitions: fix s... |
125 |
snprintf(tmp, sizeof(tmp), " (%c%c%c%c)", |
1da177e4c Linux-2.6.12-rc2 |
126 127 |
dostype[0], dostype[1], dostype[2], dostype[3]); |
9c867fbe0 partitions: fix s... |
128 129 |
strlcat(state->pp_buf, tmp, PAGE_SIZE); snprintf(tmp, sizeof(tmp), "(res %d spb %d)", |
1da177e4c Linux-2.6.12-rc2 |
130 131 |
be32_to_cpu(pb->pb_Environment[6]), be32_to_cpu(pb->pb_Environment[4])); |
9c867fbe0 partitions: fix s... |
132 |
strlcat(state->pp_buf, tmp, PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
133 134 135 |
} res = 1; } |
9c867fbe0 partitions: fix s... |
136 137 |
strlcat(state->pp_buf, " ", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
138 139 140 141 |
rdb_done: return res; } |