Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sgi.c
Go to the documentation of this file.
1 /*
2  * fs/partitions/sgi.c
3  *
4  * Code extracted from drivers/block/genhd.c
5  */
6 
7 #include "check.h"
8 #include "sgi.h"
9 
10 struct sgi_disklabel {
11  __be32 magic_mushroom; /* Big fat spliff... */
12  __be16 root_part_num; /* Root partition number */
13  __be16 swap_part_num; /* Swap partition number */
14  s8 boot_file[16]; /* Name of boot file for ARCS */
15  u8 _unused0[48]; /* Device parameter useless crapola.. */
16  struct sgi_volume {
17  s8 name[8]; /* Name of volume */
18  __be32 block_num; /* Logical block number */
19  __be32 num_bytes; /* How big, in bytes */
20  } volume[15];
21  struct sgi_partition {
22  __be32 num_blocks; /* Size in logical blocks */
23  __be32 first_block; /* First logical block */
24  __be32 type; /* Type of this partition */
25  } partitions[16];
26  __be32 csum; /* Disk label checksum */
27  __be32 _unused1; /* Padding */
28 };
29 
31 {
32  int i, csum;
33  __be32 magic;
34  int slot = 1;
35  unsigned int start, blocks;
36  __be32 *ui, cs;
37  Sector sect;
38  struct sgi_disklabel *label;
39  struct sgi_partition *p;
40  char b[BDEVNAME_SIZE];
41 
42  label = read_part_sector(state, 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 %08x\n",
49  bdevname(bdev, b), be32_to_cpu(magic));*/
50  put_dev_sector(sect);
51  return 0;
52  }
53  ui = ((__be32 *) (label + 1)) - 1;
54  for(csum = 0; ui >= ((__be32 *) 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 corrupted\n",
60  bdevname(state->bdev, b));
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  put_partition(state, slot, start, blocks);
74  if (be32_to_cpu(p->type) == LINUX_RAID_PARTITION)
75  state->parts[slot].flags = ADDPART_FLAG_RAID;
76  }
77  slot++;
78  }
79  strlcat(state->pp_buf, "\n", PAGE_SIZE);
80  put_dev_sector(sect);
81  return 1;
82 }