diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /fs/partitions/mac.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'fs/partitions/mac.c')
-rw-r--r-- | fs/partitions/mac.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/fs/partitions/mac.c b/fs/partitions/mac.c new file mode 100644 index 000000000000..bb22cdd0cb14 --- /dev/null +++ b/fs/partitions/mac.c | |||
@@ -0,0 +1,130 @@ | |||
1 | /* | ||
2 | * fs/partitions/mac.c | ||
3 | * | ||
4 | * Code extracted from drivers/block/genhd.c | ||
5 | * Copyright (C) 1991-1998 Linus Torvalds | ||
6 | * Re-organised Feb 1998 Russell King | ||
7 | */ | ||
8 | |||
9 | #include <linux/config.h> | ||
10 | #include <linux/ctype.h> | ||
11 | #include "check.h" | ||
12 | #include "mac.h" | ||
13 | |||
14 | #ifdef CONFIG_PPC_PMAC | ||
15 | extern void note_bootable_part(dev_t dev, int part, int goodness); | ||
16 | #endif | ||
17 | |||
18 | /* | ||
19 | * Code to understand MacOS partition tables. | ||
20 | */ | ||
21 | |||
22 | static inline void mac_fix_string(char *stg, int len) | ||
23 | { | ||
24 | int i; | ||
25 | |||
26 | for (i = len - 1; i >= 0 && stg[i] == ' '; i--) | ||
27 | stg[i] = 0; | ||
28 | } | ||
29 | |||
30 | int mac_partition(struct parsed_partitions *state, struct block_device *bdev) | ||
31 | { | ||
32 | int slot = 1; | ||
33 | Sector sect; | ||
34 | unsigned char *data; | ||
35 | int blk, blocks_in_map; | ||
36 | unsigned secsize; | ||
37 | #ifdef CONFIG_PPC_PMAC | ||
38 | int found_root = 0; | ||
39 | int found_root_goodness = 0; | ||
40 | #endif | ||
41 | struct mac_partition *part; | ||
42 | struct mac_driver_desc *md; | ||
43 | |||
44 | /* Get 0th block and look at the first partition map entry. */ | ||
45 | md = (struct mac_driver_desc *) read_dev_sector(bdev, 0, §); | ||
46 | if (!md) | ||
47 | return -1; | ||
48 | if (be16_to_cpu(md->signature) != MAC_DRIVER_MAGIC) { | ||
49 | put_dev_sector(sect); | ||
50 | return 0; | ||
51 | } | ||
52 | secsize = be16_to_cpu(md->block_size); | ||
53 | put_dev_sector(sect); | ||
54 | data = read_dev_sector(bdev, secsize/512, §); | ||
55 | if (!data) | ||
56 | return -1; | ||
57 | part = (struct mac_partition *) (data + secsize%512); | ||
58 | if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC) { | ||
59 | put_dev_sector(sect); | ||
60 | return 0; /* not a MacOS disk */ | ||
61 | } | ||
62 | printk(" [mac]"); | ||
63 | blocks_in_map = be32_to_cpu(part->map_count); | ||
64 | for (blk = 1; blk <= blocks_in_map; ++blk) { | ||
65 | int pos = blk * secsize; | ||
66 | put_dev_sector(sect); | ||
67 | data = read_dev_sector(bdev, pos/512, §); | ||
68 | if (!data) | ||
69 | return -1; | ||
70 | part = (struct mac_partition *) (data + pos%512); | ||
71 | if (be16_to_cpu(part->signature) != MAC_PARTITION_MAGIC) | ||
72 | break; | ||
73 | put_partition(state, slot, | ||
74 | be32_to_cpu(part->start_block) * (secsize/512), | ||
75 | be32_to_cpu(part->block_count) * (secsize/512)); | ||
76 | |||
77 | #ifdef CONFIG_PPC_PMAC | ||
78 | /* | ||
79 | * If this is the first bootable partition, tell the | ||
80 | * setup code, in case it wants to make this the root. | ||
81 | */ | ||
82 | if (_machine == _MACH_Pmac) { | ||
83 | int goodness = 0; | ||
84 | |||
85 | mac_fix_string(part->processor, 16); | ||
86 | mac_fix_string(part->name, 32); | ||
87 | mac_fix_string(part->type, 32); | ||
88 | |||
89 | if ((be32_to_cpu(part->status) & MAC_STATUS_BOOTABLE) | ||
90 | && strcasecmp(part->processor, "powerpc") == 0) | ||
91 | goodness++; | ||
92 | |||
93 | if (strcasecmp(part->type, "Apple_UNIX_SVR2") == 0 | ||
94 | || (strnicmp(part->type, "Linux", 5) == 0 | ||
95 | && strcasecmp(part->type, "Linux_swap") != 0)) { | ||
96 | int i, l; | ||
97 | |||
98 | goodness++; | ||
99 | l = strlen(part->name); | ||
100 | if (strcmp(part->name, "/") == 0) | ||
101 | goodness++; | ||
102 | for (i = 0; i <= l - 4; ++i) { | ||
103 | if (strnicmp(part->name + i, "root", | ||
104 | 4) == 0) { | ||
105 | goodness += 2; | ||
106 | break; | ||
107 | } | ||
108 | } | ||
109 | if (strnicmp(part->name, "swap", 4) == 0) | ||
110 | goodness--; | ||
111 | } | ||
112 | |||
113 | if (goodness > found_root_goodness) { | ||
114 | found_root = blk; | ||
115 | found_root_goodness = goodness; | ||
116 | } | ||
117 | } | ||
118 | #endif /* CONFIG_PPC_PMAC */ | ||
119 | |||
120 | ++slot; | ||
121 | } | ||
122 | #ifdef CONFIG_PPC_PMAC | ||
123 | if (found_root_goodness) | ||
124 | note_bootable_part(bdev->bd_dev, found_root, found_root_goodness); | ||
125 | #endif | ||
126 | |||
127 | put_dev_sector(sect); | ||
128 | printk("\n"); | ||
129 | return 1; | ||
130 | } | ||