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
fs
hfs
part_tbl.c
Go to the documentation of this file.
1
/*
2
* linux/fs/hfs/part_tbl.c
3
*
4
* Copyright (C) 1996-1997 Paul H. Hargrove
5
* (C) 2003 Ardis Technologies <
[email protected]
>
6
* This file may be distributed under the terms of the GNU General Public License.
7
*
8
* Original code to handle the new style Mac partition table based on
9
* a patch contributed by Holger Schemel (
[email protected]
).
10
*/
11
12
#include "
hfs_fs.h
"
13
14
/*
15
* The new style Mac partition map
16
*
17
* For each partition on the media there is a physical block (512-byte
18
* block) containing one of these structures. These blocks are
19
* contiguous starting at block 1.
20
*/
21
struct
new_pmap
{
22
__be16
pmSig
;
/* signature */
23
__be16
reSigPad
;
/* padding */
24
__be32
pmMapBlkCnt
;
/* partition blocks count */
25
__be32
pmPyPartStart
;
/* physical block start of partition */
26
__be32
pmPartBlkCnt
;
/* physical block count of partition */
27
u8
pmPartName
[32];
/* (null terminated?) string
28
giving the name of this
29
partition */
30
u8
pmPartType
[32];
/* (null terminated?) string
31
giving the type of this
32
partition */
33
/* a bunch more stuff we don't need */
34
}
__packed
;
35
36
/*
37
* The old style Mac partition map
38
*
39
* The partition map consists for a 2-byte signature followed by an
40
* array of these structures. The map is terminated with an all-zero
41
* one of these.
42
*/
43
struct
old_pmap
{
44
__be16
pdSig
;
/* Signature bytes */
45
struct
old_pmap_entry
{
46
__be32
pdStart
;
47
__be32
pdSize
;
48
__be32
pdFSID
;
49
}
pdEntry
[42];
50
}
__packed
;
51
52
/*
53
* hfs_part_find()
54
*
55
* Parse the partition map looking for the
56
* start and length of the 'part'th HFS partition.
57
*/
58
int
hfs_part_find
(
struct
super_block
*
sb
,
59
sector_t
*part_start,
sector_t
*part_size)
60
{
61
struct
buffer_head *bh;
62
__be16
*
data
;
63
int
i
,
size
,
res
;
64
65
res = -
ENOENT
;
66
bh =
sb_bread512
(sb, *part_start +
HFS_PMAP_BLK
, data);
67
if
(!bh)
68
return
-
EIO
;
69
70
switch
(
be16_to_cpu
(*data)) {
71
case
HFS_OLD_PMAP_MAGIC
:
72
{
73
struct
old_pmap
*
pm
;
74
struct
old_pmap_entry *
p
;
75
76
pm = (
struct
old_pmap
*)bh->b_data;
77
p = pm->
pdEntry
;
78
size = 42;
79
for
(i = 0; i <
size
; p++, i++) {
80
if
(p->pdStart && p->pdSize &&
81
p->pdFSID ==
cpu_to_be32
(0x54465331)
/*"TFS1"*/
&&
82
(
HFS_SB
(sb)->part < 0 ||
HFS_SB
(sb)->part ==
i
)) {
83
*part_start +=
be32_to_cpu
(p->pdStart);
84
*part_size =
be32_to_cpu
(p->pdSize);
85
res = 0;
86
}
87
}
88
break
;
89
}
90
case
HFS_NEW_PMAP_MAGIC
:
91
{
92
struct
new_pmap
*
pm
;
93
94
pm = (
struct
new_pmap
*)bh->b_data;
95
size =
be32_to_cpu
(pm->
pmMapBlkCnt
);
96
for
(i = 0; i <
size
;) {
97
if
(!
memcmp
(pm->
pmPartType
,
"Apple_HFS"
, 9) &&
98
(
HFS_SB
(sb)->part < 0 ||
HFS_SB
(sb)->part ==
i
)) {
99
*part_start +=
be32_to_cpu
(pm->
pmPyPartStart
);
100
*part_size =
be32_to_cpu
(pm->
pmPartBlkCnt
);
101
res = 0;
102
break
;
103
}
104
brelse(bh);
105
bh =
sb_bread512
(sb, *part_start +
HFS_PMAP_BLK
+ ++i, pm);
106
if
(!bh)
107
return
-
EIO
;
108
if
(pm->
pmSig
!=
cpu_to_be16
(
HFS_NEW_PMAP_MAGIC
))
109
break
;
110
}
111
break
;
112
}
113
}
114
brelse(bh);
115
116
return
res
;
117
}
Generated on Thu Jan 10 2013 14:47:22 for Linux Kernel by
1.8.2