Blame view
block/partitions/atari.c
4.14 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/* * fs/partitions/atari.c * * Code extracted from drivers/block/genhd.c * * Copyright (C) 1991-1998 Linus Torvalds * Re-organised Feb 1998 Russell King */ #include <linux/ctype.h> #include "check.h" #include "atari.h" /* ++guenther: this should be settable by the user ("make config")?. */ #define ICD_PARTS /* check if a partition entry looks valid -- Atari format is assumed if at least one of the primary entries is ok this way */ #define VALID_PARTITION(pi,hdsiz) \ (((pi)->flg & 1) && \ isalnum((pi)->id[0]) && isalnum((pi)->id[1]) && isalnum((pi)->id[2]) && \ be32_to_cpu((pi)->st) <= (hdsiz) && \ be32_to_cpu((pi)->st) + be32_to_cpu((pi)->siz) <= (hdsiz)) static inline int OK_id(char *s) { return memcmp (s, "GEM", 3) == 0 || memcmp (s, "BGM", 3) == 0 || memcmp (s, "LNX", 3) == 0 || memcmp (s, "SWP", 3) == 0 || memcmp (s, "RAW", 3) == 0 ; } |
1493bf217 block: use struct... |
33 |
int atari_partition(struct parsed_partitions *state) |
1da177e4c Linux-2.6.12-rc2 |
34 35 36 37 38 39 40 41 42 43 |
{ Sector sect; struct rootsector *rs; struct partition_info *pi; u32 extensect; u32 hd_size; int slot; #ifdef ICD_PARTS int part_fmt = 0; /* 0:unknown, 1:AHDI, 2:ICD/Supra */ #endif |
9c8747167 block: atari: Ret... |
44 45 46 47 48 49 |
/* * ATARI partition scheme supports 512 lba only. If this is not * the case, bail early to avoid miscalculating hd_size. */ if (bdev_logical_block_size(state->bdev) != 512) return 0; |
1493bf217 block: use struct... |
50 |
rs = read_part_sector(state, 0, §); |
1da177e4c Linux-2.6.12-rc2 |
51 52 53 54 |
if (!rs) return -1; /* Verify this is an Atari rootsector: */ |
1493bf217 block: use struct... |
55 |
hd_size = state->bdev->bd_inode->i_size >> 9; |
1da177e4c Linux-2.6.12-rc2 |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
if (!VALID_PARTITION(&rs->part[0], hd_size) && !VALID_PARTITION(&rs->part[1], hd_size) && !VALID_PARTITION(&rs->part[2], hd_size) && !VALID_PARTITION(&rs->part[3], hd_size)) { /* * if there's no valid primary partition, assume that no Atari * format partition table (there's no reliable magic or the like * :-() */ put_dev_sector(sect); return 0; } pi = &rs->part[0]; |
9c867fbe0 partitions: fix s... |
70 |
strlcat(state->pp_buf, " AHDI", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
for (slot = 1; pi < &rs->part[4] && slot < state->limit; slot++, pi++) { struct rootsector *xrs; Sector sect2; ulong partsect; if ( !(pi->flg & 1) ) continue; /* active partition */ if (memcmp (pi->id, "XGM", 3) != 0) { /* we don't care about other id's */ put_partition (state, slot, be32_to_cpu(pi->st), be32_to_cpu(pi->siz)); continue; } /* extension partition */ #ifdef ICD_PARTS part_fmt = 1; #endif |
9c867fbe0 partitions: fix s... |
89 |
strlcat(state->pp_buf, " XGM<", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
90 91 |
partsect = extensect = be32_to_cpu(pi->st); while (1) { |
1493bf217 block: use struct... |
92 |
xrs = read_part_sector(state, partsect, §2); |
1da177e4c Linux-2.6.12-rc2 |
93 94 95 96 |
if (!xrs) { printk (" block %ld read failed ", partsect); put_dev_sector(sect); |
57881dd9d [PATCH] Fix check... |
97 |
return -1; |
1da177e4c Linux-2.6.12-rc2 |
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
} /* ++roman: sanity check: bit 0 of flg field must be set */ if (!(xrs->part[0].flg & 1)) { printk( " First sub-partition in extended partition is not valid! " ); put_dev_sector(sect2); break; } put_partition(state, slot, partsect + be32_to_cpu(xrs->part[0].st), be32_to_cpu(xrs->part[0].siz)); if (!(xrs->part[1].flg & 1)) { /* end of linked partition list */ put_dev_sector(sect2); break; } if (memcmp( xrs->part[1].id, "XGM", 3 ) != 0) { printk(" ID of extended partition is not XGM! "); put_dev_sector(sect2); break; } partsect = be32_to_cpu(xrs->part[1].st) + extensect; put_dev_sector(sect2); if (++slot == state->limit) { printk( " Maximum number of partitions reached! " ); break; } } |
9c867fbe0 partitions: fix s... |
135 |
strlcat(state->pp_buf, " >", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
136 137 138 139 140 141 |
} #ifdef ICD_PARTS if ( part_fmt!=1 ) { /* no extended partitions -> test ICD-format */ pi = &rs->icdpart[0]; /* sanity check: no ICD format if first partition invalid */ if (OK_id(pi->id)) { |
9c867fbe0 partitions: fix s... |
142 |
strlcat(state->pp_buf, " ICD<", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
143 144 145 146 147 148 149 150 151 |
for (; pi < &rs->icdpart[8] && slot < state->limit; slot++, pi++) { /* accept only GEM,BGM,RAW,LNX,SWP partitions */ if (!((pi->flg & 1) && OK_id(pi->id))) continue; part_fmt = 2; put_partition (state, slot, be32_to_cpu(pi->st), be32_to_cpu(pi->siz)); } |
9c867fbe0 partitions: fix s... |
152 |
strlcat(state->pp_buf, " >", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
153 154 155 156 |
} } #endif put_dev_sector(sect); |
9c867fbe0 partitions: fix s... |
157 158 |
strlcat(state->pp_buf, " ", PAGE_SIZE); |
1da177e4c Linux-2.6.12-rc2 |
159 160 161 |
return 1; } |