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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  fs/partitions/sgi.c
  3.  *
  4.  *  Code extracted from drivers/block/genhd.c
  5.  */
  6. #include <linux/fs.h>
  7. #include <linux/genhd.h>
  8. #include <linux/kernel.h>
  9. #include <linux/major.h>
  10. #include <linux/string.h>
  11. #include <linux/blk.h>
  12. #include <asm/byteorder.h>
  13. #include <asm/system.h>
  14. #include "check.h"
  15. #include "sgi.h"
  16. int sgi_partition(struct gendisk *hd, struct block_device *bdev, unsigned long first_sector, int current_minor)
  17. {
  18. int i, csum, magic;
  19. unsigned int *ui, start, blocks, cs;
  20. Sector sect;
  21. kdev_t dev = to_kdev_t(bdev->bd_dev);
  22. struct sgi_disklabel {
  23. int magic_mushroom;         /* Big fat spliff... */
  24. short root_part_num;        /* Root partition number */
  25. short swap_part_num;        /* Swap partition number */
  26. char boot_file[16];         /* Name of boot file for ARCS */
  27. unsigned char _unused0[48]; /* Device parameter useless crapola.. */
  28. struct sgi_volume {
  29. char name[8];       /* Name of volume */
  30. int  block_num;     /* Logical block number */
  31. int  num_bytes;     /* How big, in bytes */
  32. } volume[15];
  33. struct sgi_partition {
  34. int num_blocks;     /* Size in logical blocks */
  35. int first_block;    /* First logical block */
  36. int type;           /* Type of this partition */
  37. } partitions[16];
  38. int csum;                   /* Disk label checksum */
  39. int _unused1;               /* Padding */
  40. } *label;
  41. struct sgi_partition *p;
  42. label = (struct sgi_disklabel *) read_dev_sector(bdev, 0, &sect);
  43. if (!label)
  44. return -1;
  45. p = &label->partitions[0];
  46. magic = label->magic_mushroom;
  47. if(be32_to_cpu(magic) != SGI_LABEL_MAGIC) {
  48. /*printk("Dev %s SGI disklabel: bad magic %08xn",
  49.        bdevname(dev), magic);*/
  50. put_dev_sector(sect);
  51. return 0;
  52. }
  53. ui = ((unsigned int *) (label + 1)) - 1;
  54. for(csum = 0; ui >= ((unsigned int *) label);) {
  55. cs = *ui--;
  56. csum += be32_to_cpu(cs);
  57. }
  58. if(csum) {
  59. printk(KERN_WARNING "Dev %s SGI disklabel: csum bad, label corruptedn",
  60.        bdevname(dev));
  61. put_dev_sector(sect);
  62. return 0;
  63. }
  64. /* All SGI disk labels have 16 partitions, disks under Linux only
  65.  * have 15 minor's.  Luckily there are always a few zero length
  66.  * partitions which we don't care about so we never overflow the
  67.  * current_minor.
  68.  */
  69. for(i = 0; i < 16; i++, p++) {
  70. blocks = be32_to_cpu(p->num_blocks);
  71. start  = be32_to_cpu(p->first_block);
  72. if(!blocks)
  73. continue;
  74. add_gd_partition(hd, current_minor, start, blocks);
  75. current_minor++;
  76. }
  77. printk("n");
  78. put_dev_sector(sect);
  79. return 1;
  80. }