Blame view

block/partitions/atari.c 4.14 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   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   Tejun Heo   block: use struct...
33
  int atari_partition(struct parsed_partitions *state)
1da177e4c   Linus Torvalds   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   Gabriel Krisman Bertazi   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   Tejun Heo   block: use struct...
50
  	rs = read_part_sector(state, 0, &sect);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
54
  	if (!rs)
  		return -1;
  
  	/* Verify this is an Atari rootsector: */
1493bf217   Tejun Heo   block: use struct...
55
  	hd_size = state->bdev->bd_inode->i_size >> 9;
1da177e4c   Linus Torvalds   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   Alexey Dobriyan   partitions: fix s...
70
  	strlcat(state->pp_buf, " AHDI", PAGE_SIZE);
1da177e4c   Linus Torvalds   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   Alexey Dobriyan   partitions: fix s...
89
  		strlcat(state->pp_buf, " XGM<", PAGE_SIZE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
  		partsect = extensect = be32_to_cpu(pi->st);
  		while (1) {
1493bf217   Tejun Heo   block: use struct...
92
  			xrs = read_part_sector(state, partsect, &sect2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
  			if (!xrs) {
  				printk (" block %ld read failed
  ", partsect);
  				put_dev_sector(sect);
57881dd9d   Suzuki K P   [PATCH] Fix check...
97
  				return -1;
1da177e4c   Linus Torvalds   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   Alexey Dobriyan   partitions: fix s...
135
  		strlcat(state->pp_buf, " >", PAGE_SIZE);
1da177e4c   Linus Torvalds   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   Alexey Dobriyan   partitions: fix s...
142
  			strlcat(state->pp_buf, " ICD<", PAGE_SIZE);
1da177e4c   Linus Torvalds   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   Alexey Dobriyan   partitions: fix s...
152
  			strlcat(state->pp_buf, " >", PAGE_SIZE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
  		}
  	}
  #endif
  	put_dev_sector(sect);
9c867fbe0   Alexey Dobriyan   partitions: fix s...
157
158
  	strlcat(state->pp_buf, "
  ", PAGE_SIZE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
160
161
  
  	return 1;
  }