Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
block
partitions
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
30
int
sgi_partition
(
struct
parsed_partitions
*
state
)
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, §);
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
}
Generated on Thu Jan 10 2013 13:22:43 for Linux Kernel by
1.8.2