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

嵌入式Linux

开发平台:

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