Index: emcore/trunk/disk.c |
— | — | @@ -63,7 +63,7 @@ |
64 | 64 | static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */ |
65 | 65 | static struct mutex disk_mutex; |
66 | 66 | |
67 | | -struct partinfo* disk_init(IF_MD_NONVOID(int drive)) |
| 67 | +int disk_init(IF_MD2(int drive,) struct partinfo** partinfo) |
68 | 68 | { |
69 | 69 | int i; |
70 | 70 | #ifdef HAVE_MULTIDRIVE |
— | — | @@ -78,15 +78,21 @@ |
79 | 79 | const int drive = 0; |
80 | 80 | (void)drive; |
81 | 81 | #endif |
| 82 | + *partinfo = pinfo; |
82 | 83 | |
83 | 84 | unsigned char* sector = fat_get_sector_buffer(); |
84 | | - storage_read_sectors(IF_MD2(drive,) 0,1, sector); |
| 85 | + int rc = storage_read_sectors(IF_MD2(drive,) 0, 1, sector); |
| 86 | + if (IS_ERR(rc)) |
| 87 | + { |
| 88 | + fat_release_sector_buffer(); |
| 89 | + PASS_RC(rc, 1, 0); |
| 90 | + } |
85 | 91 | /* check that the boot sector is initialized */ |
86 | 92 | if ( (sector[510] != 0x55) || |
87 | 93 | (sector[511] != 0xaa)) { |
88 | 94 | fat_release_sector_buffer(); |
89 | 95 | DEBUGF("Bad boot sector signature"); |
90 | | - return NULL; |
| 96 | + RET_ERR(1); |
91 | 97 | } |
92 | 98 | |
93 | 99 | /* parse partitions */ |
— | — | @@ -105,7 +111,7 @@ |
106 | 112 | } |
107 | 113 | } |
108 | 114 | fat_release_sector_buffer(); |
109 | | - return pinfo; |
| 115 | + return 0; |
110 | 116 | } |
111 | 117 | |
112 | 118 | struct partinfo* disk_partinfo(int partition) |
— | — | @@ -122,6 +128,7 @@ |
123 | 129 | { |
124 | 130 | int mounted=0; |
125 | 131 | int i; |
| 132 | + int rc; |
126 | 133 | |
127 | 134 | #ifdef HAVE_HOTSWAP |
128 | 135 | mutex_lock(&disk_mutex, TIMEOUT_BLOCK); |
— | — | @@ -132,7 +139,7 @@ |
133 | 140 | vol_drive[i] = -1; /* mark all as unassigned */ |
134 | 141 | |
135 | 142 | #ifndef HAVE_MULTIDRIVE |
136 | | - mounted = disk_mount(0); |
| 143 | + PASS_RC(disk_mount(0), 0, 0); |
137 | 144 | #else |
138 | 145 | for(i=0;i<NUM_DRIVES;i++) |
139 | 146 | { |
— | — | @@ -139,7 +146,10 @@ |
140 | 147 | #ifdef HAVE_HOTSWAP |
141 | 148 | if (storage_present(i)) |
142 | 149 | #endif |
143 | | - mounted += disk_mount(i); |
| 150 | + { |
| 151 | + rc = disk_mount(i); |
| 152 | + if (!IS_ERR(rc)) mounted += rc; |
| 153 | + } |
144 | 154 | } |
145 | 155 | #endif |
146 | 156 | |
— | — | @@ -146,6 +156,7 @@ |
147 | 157 | #ifdef HAVE_HOTSWAP |
148 | 158 | mutex_unlock(&disk_mutex); |
149 | 159 | #endif |
| 160 | + if (!mounted) PASS_RC(rc, 0, 0); |
150 | 161 | return mounted; |
151 | 162 | } |
152 | 163 | |
— | — | @@ -164,6 +175,7 @@ |
165 | 176 | int disk_mount(int drive) |
166 | 177 | { |
167 | 178 | int i; |
| 179 | + int rc; |
168 | 180 | int mounted = 0; /* reset partition-on-drive flag */ |
169 | 181 | int volume; |
170 | 182 | struct partinfo* pinfo; |
— | — | @@ -173,7 +185,7 @@ |
174 | 186 | #endif |
175 | 187 | |
176 | 188 | volume = get_free_volume(); |
177 | | - pinfo = disk_init(IF_MD(drive)); |
| 189 | + PASS_RC_MTX(disk_init(IF_MD2(drive,) &pinfo), 2, 0, &disk_mutex); |
178 | 190 | |
179 | 191 | if (pinfo == NULL) |
180 | 192 | { |
— | — | @@ -180,7 +192,7 @@ |
181 | 193 | #ifdef HAVE_HOTSWAP |
182 | 194 | mutex_unlock(&disk_mutex); |
183 | 195 | #endif |
184 | | - return 0; |
| 196 | + RET_ERR(1); |
185 | 197 | } |
186 | 198 | for (i = 0; volume != -1 && i<4 && mounted<NUM_VOLUMES_PER_DRIVE; i++) |
187 | 199 | { |
— | — | @@ -187,8 +199,9 @@ |
188 | 200 | if (memchr(fat_partition_types, pinfo[i].type, |
189 | 201 | sizeof(fat_partition_types)) == NULL) |
190 | 202 | continue; /* not an accepted partition type */ |
191 | | - |
192 | | - if (!fat_mount(IF_MV2(volume,) IF_MD2(drive,) pinfo[i].start)) |
| 203 | + |
| 204 | + rc = fat_mount(IF_MV2(volume,) IF_MD2(drive,) pinfo[i].start); |
| 205 | + if (!IS_ERR(rc)) |
193 | 206 | { |
194 | 207 | mounted++; |
195 | 208 | vol_drive[volume] = drive; /* remember the drive for this volume */ |
— | — | @@ -199,7 +212,8 @@ |
200 | 213 | if (mounted == 0 && volume != -1) /* none of the 4 entries worked? */ |
201 | 214 | { /* try "superfloppy" mode */ |
202 | 215 | DEBUGF("No partition found, trying to mount sector 0."); |
203 | | - if (!fat_mount(IF_MV2(volume,) IF_MD2(drive,) 0)) |
| 216 | + rc = fat_mount(IF_MV2(volume,) IF_MD2(drive,) 0); |
| 217 | + if (!IS_ERR(rc)) |
204 | 218 | { |
205 | 219 | mounted = 1; |
206 | 220 | vol_drive[volume] = drive; /* remember the drive for this volume */ |
— | — | @@ -208,6 +222,7 @@ |
209 | 223 | #ifdef HAVE_HOTSWAP |
210 | 224 | mutex_unlock(&disk_mutex); |
211 | 225 | #endif |
| 226 | + if (!mounted) PASS_RC(rc, 2, 2); |
212 | 227 | return mounted; |
213 | 228 | } |
214 | 229 | |
Index: emcore/trunk/disk.h |
— | — | @@ -36,7 +36,7 @@ |
37 | 37 | #define PARTITION_TYPE_OS2_HIDDEN_C_DRIVE 0x84 |
38 | 38 | |
39 | 39 | /* returns a pointer to an array of 8 partinfo structs */ |
40 | | -struct partinfo* disk_init(IF_MD_NONVOID(int drive)); |
| 40 | +int disk_init(IF_MD2(int drive,) struct partinfo** partinfo); |
41 | 41 | struct partinfo* disk_partinfo(int partition); |
42 | 42 | |
43 | 43 | void disk_init_subsystem(void); /* Initialises mutexes */ |
Index: emcore/trunk/fat.c |
— | — | @@ -315,11 +315,11 @@ |
316 | 316 | /* Read the sector */
|
317 | 317 | unsigned char* buf = fat_get_sector_buffer();
|
318 | 318 | rc = storage_read_sectors(IF_MD2(drive,) startsector,1,buf);
|
319 | | - if(rc)
|
| 319 | + if (IS_ERR(rc))
|
320 | 320 | {
|
321 | 321 | fat_release_sector_buffer();
|
322 | | - DEBUGF( "fat_mount() - Couldn't read BPB (error code %d)", rc);
|
323 | | - return rc * 10 - 1;
|
| 322 | + DEBUGF("fat_mount() - Couldn't read BPB (error code %d)", rc);
|
| 323 | + PASS_RC(rc, 3, 0);
|
324 | 324 | }
|
325 | 325 |
|
326 | 326 | memset(fat_bpb, 0, sizeof(struct bpb));
|
— | — | @@ -358,7 +358,7 @@ |
359 | 359 | if (!fat_bpb->bpb_bytspersec)
|
360 | 360 | {
|
361 | 361 | fat_release_sector_buffer();
|
362 | | - return -2;
|
| 362 | + RET_ERR(1);
|
363 | 363 | }
|
364 | 364 | rootdirsectors = secmult * ((fat_bpb->bpb_rootentcnt * DIR_ENTRY_SIZE
|
365 | 365 | + fat_bpb->bpb_bytspersec - 1) / fat_bpb->bpb_bytspersec);
|
— | — | @@ -377,7 +377,7 @@ |
378 | 378 | else
|
379 | 379 | {
|
380 | 380 | fat_release_sector_buffer();
|
381 | | - return -2;
|
| 381 | + RET_ERR(2);
|
382 | 382 | }
|
383 | 383 |
|
384 | 384 | #ifdef TEST_FAT
|
— | — | @@ -396,12 +396,12 @@ |
397 | 397 | { /* FAT12 */
|
398 | 398 | fat_release_sector_buffer();
|
399 | 399 | DEBUGF("This is FAT12. Go away!");
|
400 | | - return -2;
|
| 400 | + RET_ERR(3);
|
401 | 401 | }
|
402 | 402 | #else /* #ifdef HAVE_FAT16SUPPORT */
|
403 | 403 | fat_release_sector_buffer();
|
404 | 404 | DEBUGF("This is not FAT32. Go away!");
|
405 | | - return -2;
|
| 405 | + RET_ERR(3);
|
406 | 406 | #endif /* #ifndef HAVE_FAT16SUPPORT */
|
407 | 407 | }
|
408 | 408 |
|
— | — | @@ -433,7 +433,7 @@ |
434 | 434 | {
|
435 | 435 | fat_release_sector_buffer();
|
436 | 436 | DEBUGF( "fat_mount() - BPB is not sane");
|
437 | | - return rc * 10 - 3;
|
| 437 | + RET_ERR(4);
|
438 | 438 | }
|
439 | 439 |
|
440 | 440 | #ifdef HAVE_FAT16SUPPORT
|
— | — | @@ -448,11 +448,11 @@ |
449 | 449 | /* Read the fsinfo sector */
|
450 | 450 | rc = storage_read_sectors(IF_MD2(drive,)
|
451 | 451 | startsector + fat_bpb->bpb_fsinfo, 1, buf);
|
452 | | - if (rc < 0)
|
| 452 | + if (IS_ERR(rc))
|
453 | 453 | {
|
454 | 454 | fat_release_sector_buffer();
|
455 | 455 | DEBUGF( "fat_mount() - Couldn't read FSInfo (error code %d)", rc);
|
456 | | - return rc * 10 - 4;
|
| 456 | + PASS_RC(rc, 3, 5);
|
457 | 457 | }
|
458 | 458 | fat_bpb->fsinfo.freecount = BYTES2INT32(buf, FSINFO_FREECOUNT);
|
459 | 459 | fat_bpb->fsinfo.nextfree = BYTES2INT32(buf, FSINFO_NEXTFREE);
|