amiga.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  fs/partitions/amiga.c
  3.  *
  4.  *  Code extracted from drivers/block/genhd.c
  5.  *
  6.  *  Copyright (C) 1991-1998  Linus Torvalds
  7.  *  Re-organised Feb 1998 Russell King
  8.  */
  9. #include <linux/fs.h>
  10. #include <linux/genhd.h>
  11. #include <linux/kernel.h>
  12. #include <linux/major.h>
  13. #include <linux/string.h>
  14. #include <linux/blk.h>
  15. #include <asm/byteorder.h>
  16. #include <linux/affs_hardblocks.h>
  17. #include "check.h"
  18. #include "amiga.h"
  19. static __inline__ u32
  20. checksum_block(u32 *m, int size)
  21. {
  22. u32 sum = 0;
  23. while (size--)
  24. sum += be32_to_cpu(*m++);
  25. return sum;
  26. }
  27. int
  28. amiga_partition(struct gendisk *hd, struct block_device *bdev,
  29. unsigned long first_sector, int first_part_minor)
  30. {
  31. Sector sect;
  32. unsigned char *data;
  33. struct RigidDiskBlock *rdb;
  34. struct PartitionBlock *pb;
  35. int start_sect, nr_sects, blk, part, res = 0;
  36. kdev_t dev = to_kdev_t(bdev->bd_dev);
  37. for (blk = 0; ; blk++, put_dev_sector(sect)) {
  38. if (blk == RDB_ALLOCATION_LIMIT)
  39. goto rdb_done;
  40. data = read_dev_sector(bdev, blk, &sect);
  41. if (!data) {
  42. if (warn_no_part)
  43. printk("Dev %s: unable to read RDB block %dn",
  44.        bdevname(dev), blk);
  45. goto rdb_done;
  46. }
  47. if (*(u32 *)data != cpu_to_be32(IDNAME_RIGIDDISK))
  48. continue;
  49. rdb = (struct RigidDiskBlock *)data;
  50. if (checksum_block((u32 *)data, be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F) == 0)
  51. break;
  52. /* Try again with 0xdc..0xdf zeroed, Windows might have
  53.  * trashed it.
  54.  */
  55. *(u32 *)(data+0xdc) = 0;
  56. if (checksum_block((u32 *)data,
  57. be32_to_cpu(rdb->rdb_SummedLongs) & 0x7F)==0) {
  58. printk("Warning: Trashed word at 0xd0 in block %d "
  59. "ignored in checksum calculationn",blk);
  60. break;
  61. }
  62. printk("Dev %s: RDB in block %d has bad checksumn",
  63.        bdevname(dev),blk);
  64. }
  65. printk(" RDSK");
  66. blk = be32_to_cpu(rdb->rdb_PartitionList);
  67. put_dev_sector(sect);
  68. for (part = 1; blk>0 && part<=16; part++, put_dev_sector(sect)) {
  69. data = read_dev_sector(bdev, blk, &sect);
  70. if (!data) {
  71. if (warn_no_part)
  72. printk("Dev %s: unable to read partition block %dn",
  73.        bdevname(dev),blk);
  74. goto rdb_done;
  75. }
  76. pb  = (struct PartitionBlock *)data;
  77. blk = be32_to_cpu(pb->pb_Next);
  78. if (pb->pb_ID != cpu_to_be32(IDNAME_PARTITION))
  79. continue;
  80. if (checksum_block((u32 *)pb, be32_to_cpu(pb->pb_SummedLongs) & 0x7F) != 0 )
  81. continue;
  82. /* Tell Kernel about it */
  83. nr_sects = (be32_to_cpu(pb->pb_Environment[10]) + 1 -
  84.     be32_to_cpu(pb->pb_Environment[9])) *
  85.    be32_to_cpu(pb->pb_Environment[3]) *
  86.    be32_to_cpu(pb->pb_Environment[5]);
  87. if (!nr_sects)
  88. continue;
  89. start_sect = be32_to_cpu(pb->pb_Environment[9]) *
  90.      be32_to_cpu(pb->pb_Environment[3]) *
  91.      be32_to_cpu(pb->pb_Environment[5]);
  92. add_gd_partition(hd,first_part_minor,start_sect,nr_sects);
  93. first_part_minor++;
  94. res = 1;
  95. }
  96. printk("n");
  97. rdb_done:
  98. return res;
  99. }