X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fpartitions%2Famiga.c;h=9917a8c360f2da0537baea01559b468825476521;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=dfc1329f9b00ad9805494eca014818e522b0a0fc;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/partitions/amiga.c b/fs/partitions/amiga.c index dfc1329f9..9917a8c36 100644 --- a/fs/partitions/amiga.c +++ b/fs/partitions/amiga.c @@ -14,7 +14,7 @@ #include "amiga.h" static __inline__ u32 -checksum_block(u32 *m, int size) +checksum_block(__be32 *m, int size) { u32 sum = 0; @@ -31,6 +31,7 @@ amiga_partition(struct parsed_partitions *state, struct block_device *bdev) 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]; @@ -42,19 +43,20 @@ amiga_partition(struct parsed_partitions *state, struct block_device *bdev) if (warn_no_part) printk("Dev %s: unable to read RDB block %d\n", bdevname(bdev, b), blk); + res = -1; goto rdb_done; } - if (*(u32 *)data != cpu_to_be32(IDNAME_RIGIDDISK)) + if (*(__be32 *)data != cpu_to_be32(IDNAME_RIGIDDISK)) continue; rdb = (struct RigidDiskBlock *)data; - if (checksum_block((u32 *)data, be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F) == 0) + 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. */ - *(u32 *)(data+0xdc) = 0; - if (checksum_block((u32 *)data, + *(__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\n",blk); @@ -65,22 +67,27 @@ amiga_partition(struct parsed_partitions *state, struct block_device *bdev) bdevname(bdev, b), blk); } - printk(" RDSK"); + /* blksize is blocks per 512 byte standard block */ + blksize = be32_to_cpu( rdb->rdb_BlockBytes ) / 512; + + printk(" RDSK (%d)", blksize * 512); /* Be more informative */ 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 */ data = read_dev_sector(bdev, blk, §); if (!data) { if (warn_no_part) printk("Dev %s: unable to read partition block %d\n", bdevname(bdev, b), blk); + res = -1; 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((u32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 ) + if (checksum_block((__be32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 ) continue; /* Tell Kernel about it */ @@ -88,13 +95,32 @@ amiga_partition(struct parsed_partitions *state, struct block_device *bdev) 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]); + 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]); + 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]; + __be32 *dt = (__be32 *)dostype; + *dt = pb->pb_Environment[16]; + if (dostype[3] < ' ') + printk(" (%c%c%c^%c)", + dostype[0], dostype[1], + dostype[2], dostype[3] + '@' ); + else + printk(" (%c%c%c%c)", + dostype[0], dostype[1], + dostype[2], dostype[3]); + printk("(res %d spb %d)", + be32_to_cpu(pb->pb_Environment[6]), + be32_to_cpu(pb->pb_Environment[4])); + } res = 1; } printk("\n");