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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  fs/partitions/mac.c
  3.  *
  4.  *  Code extracted from drivers/block/genhd.c
  5.  *  Copyright (C) 1991-1998  Linus Torvalds
  6.  *  Re-organised Feb 1998 Russell King
  7.  */
  8. #include <linux/config.h>
  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 <linux/ctype.h>
  16. #include <asm/system.h>
  17. #include "check.h"
  18. #include "mac.h"
  19. #ifdef CONFIG_ALL_PPC
  20. extern void note_bootable_part(kdev_t dev, int part, int goodness);
  21. #endif
  22. /*
  23.  * Code to understand MacOS partition tables.
  24.  */
  25. static inline void mac_fix_string(char *stg, int len)
  26. {
  27. int i;
  28. for (i = len - 1; i >= 0 && stg[i] == ' '; i--)
  29. stg[i] = 0;
  30. }
  31. int mac_partition(struct gendisk *hd, struct block_device *bdev,
  32. unsigned long fsec, int first_part_minor)
  33. {
  34. Sector sect;
  35. unsigned char *data;
  36. int blk, blocks_in_map;
  37. unsigned secsize;
  38. #ifdef CONFIG_ALL_PPC
  39. int found_root = 0;
  40. int found_root_goodness = 0;
  41. #endif
  42. struct mac_partition *part;
  43. struct mac_driver_desc *md;
  44. /* Get 0th block and look at the first partition map entry. */
  45. md = (struct mac_driver_desc *) read_dev_sector(bdev, 0, &sect);
  46. if (!md)
  47. return -1;
  48. if (be16_to_cpu(md->signature) != MAC_DRIVER_MAGIC) {
  49. put_dev_sector(sect);
  50. return 0;
  51. }
  52. secsize = be16_to_cpu(md->block_size);
  53. put_dev_sector(sect);
  54. data = read_dev_sector(bdev, secsize/512, &sect);
  55. if (!data)
  56. return -1;
  57. part = (struct mac_partition *) (data + secsize%512);
  58. if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC) {
  59. put_dev_sector(sect);
  60. return 0; /* not a MacOS disk */
  61. }
  62. printk(" [mac]");
  63. blocks_in_map = be32_to_cpu(part->map_count);
  64. for (blk = 1; blk <= blocks_in_map; ++blk) {
  65. int pos = blk * secsize;
  66. put_dev_sector(sect);
  67. data = read_dev_sector(bdev, pos/512, &sect);
  68. if (!data)
  69. return -1;
  70. part = (struct mac_partition *) (data + pos%512);
  71. if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC)
  72. break;
  73. add_gd_partition(hd, first_part_minor,
  74. fsec + be32_to_cpu(part->start_block) * (secsize/512),
  75. be32_to_cpu(part->block_count) * (secsize/512));
  76. #ifdef CONFIG_ALL_PPC
  77. /*
  78.  * If this is the first bootable partition, tell the
  79.  * setup code, in case it wants to make this the root.
  80.  */
  81. if (_machine == _MACH_Pmac) {
  82. int goodness = 0;
  83. mac_fix_string(part->processor, 16);
  84. mac_fix_string(part->name, 32);
  85. mac_fix_string(part->type, 32);
  86.     
  87. if ((be32_to_cpu(part->status) & MAC_STATUS_BOOTABLE)
  88.     && strcasecmp(part->processor, "powerpc") == 0)
  89. goodness++;
  90. if (strcasecmp(part->type, "Apple_UNIX_SVR2") == 0
  91.     || (strnicmp(part->type, "Linux", 5) == 0
  92.         && strcasecmp(part->type, "Linux_swap") != 0)) {
  93. int i, l;
  94. goodness++;
  95. l = strlen(part->name);
  96. if (strcmp(part->name, "/") == 0)
  97. goodness++;
  98. for (i = 0; i <= l - 4; ++i) {
  99. if (strnicmp(part->name + i, "root",
  100.      4) == 0) {
  101. goodness += 2;
  102. break;
  103. }
  104. }
  105. if (strnicmp(part->name, "swap", 4) == 0)
  106. goodness--;
  107. }
  108. if (goodness > found_root_goodness) {
  109. found_root = blk;
  110. found_root_goodness = goodness;
  111. }
  112. }
  113. #endif /* CONFIG_ALL_PPC */
  114. ++first_part_minor;
  115. }
  116. #ifdef CONFIG_ALL_PPC
  117. if (found_root_goodness)
  118. note_bootable_part(to_kdev_t(bdev->bd_dev),
  119. found_root, found_root_goodness);
  120. #endif
  121. put_dev_sector(sect);
  122. printk("n");
  123. return 1;
  124. }