sun.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  fs/partitions/sun.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/config.h>
  10. #include <linux/fs.h>
  11. #include <linux/genhd.h>
  12. #include <linux/kernel.h>
  13. #include <linux/major.h>
  14. #include <linux/string.h>
  15. #include <linux/blk.h>
  16. #include <asm/system.h>
  17. #include "check.h"
  18. #include "sun.h"
  19. #ifdef CONFIG_BLK_DEV_MD
  20. extern void md_autodetect_dev(kdev_t dev);
  21. #endif
  22. int sun_partition(struct gendisk *hd, struct block_device *bdev, unsigned long first_sector, int first_part_minor)
  23. {
  24. int i, csum;
  25. unsigned short *ush;
  26. Sector sect;
  27. kdev_t dev = to_kdev_t(bdev->bd_dev);
  28. struct sun_disklabel {
  29. unsigned char info[128];   /* Informative text string */
  30. unsigned char spare0[14];
  31. struct sun_info {
  32. unsigned char spare1;
  33. unsigned char id;
  34. unsigned char spare2;
  35. unsigned char flags;
  36. } infos[8];
  37. unsigned char spare[246];  /* Boot information etc. */
  38. unsigned short rspeed;     /* Disk rotational speed */
  39. unsigned short pcylcount;  /* Physical cylinder count */
  40. unsigned short sparecyl;   /* extra sects per cylinder */
  41. unsigned char spare2[4];   /* More magic... */
  42. unsigned short ilfact;     /* Interleave factor */
  43. unsigned short ncyl;       /* Data cylinder count */
  44. unsigned short nacyl;      /* Alt. cylinder count */
  45. unsigned short ntrks;      /* Tracks per cylinder */
  46. unsigned short nsect;      /* Sectors per track */
  47. unsigned char spare3[4];   /* Even more magic... */
  48. struct sun_partition {
  49. __u32 start_cylinder;
  50. __u32 num_sectors;
  51. } partitions[8];
  52. unsigned short magic;      /* Magic number */
  53. unsigned short csum;       /* Label xor'd checksum */
  54. } * label;
  55. struct sun_partition *p;
  56. unsigned long spc;
  57. label = (struct sun_disklabel *)read_dev_sector(bdev, 0, &sect);
  58. if (!label)
  59. return -1;
  60. p = label->partitions;
  61. if (be16_to_cpu(label->magic) != SUN_LABEL_MAGIC) {
  62. /* printk(KERN_INFO "Dev %s Sun disklabel: bad magic %04xn",
  63.        bdevname(dev), be16_to_cpu(label->magic)); */
  64. put_dev_sector(sect);
  65. return 0;
  66. }
  67. /* Look at the checksum */
  68. ush = ((unsigned short *) (label+1)) - 1;
  69. for (csum = 0; ush >= ((unsigned short *) label);)
  70. csum ^= *ush--;
  71. if (csum) {
  72. printk("Dev %s Sun disklabel: Csum bad, label corruptedn",
  73.        bdevname(dev));
  74. put_dev_sector(sect);
  75. return 0;
  76. }
  77. /* All Sun disks have 8 partition entries */
  78. spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect);
  79. for (i = 0; i < 8; i++, p++) {
  80. unsigned long st_sector;
  81. int num_sectors;
  82. st_sector = first_sector + be32_to_cpu(p->start_cylinder) * spc;
  83. num_sectors = be32_to_cpu(p->num_sectors);
  84. if (num_sectors) {
  85. add_gd_partition(hd, first_part_minor,
  86.  st_sector, num_sectors);
  87. #ifdef CONFIG_BLK_DEV_MD
  88. if (label->infos[i].id == LINUX_RAID_PARTITION)
  89. md_autodetect_dev(MKDEV(hd->major,
  90. first_part_minor));
  91. #endif
  92. }
  93. first_part_minor++;
  94. }
  95. printk("n");
  96. put_dev_sector(sect);
  97. return 1;
  98. }