Rev 3595 | Rev 3637 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3595 | Rev 3632 | ||
|---|---|---|---|
| Line 283... | Line 283... | ||
| 283 | c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]); |
283 | c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]); |
| 284 | } |
284 | } |
| 285 | } |
285 | } |
| 286 | } |
286 | } |
| 287 | 287 | ||
| 288 | /** Allocate clusters in FAT1. |
288 | /** Allocate clusters in all copies of FAT. |
| 289 | * |
289 | * |
| 290 | * This function will attempt to allocate the requested number of clusters in |
290 | * This function will attempt to allocate the requested number of clusters in |
| 291 | * the first FAT instance. The FAT will be altered so that the allocated |
291 | * all instances of the FAT. The FAT will be altered so that the allocated |
| 292 | * clusters form an independent chain (i.e. a chain which does not belong to any |
292 | * clusters form an independent chain (i.e. a chain which does not belong to any |
| 293 | * file yet). |
293 | * file yet). |
| 294 | * |
294 | * |
| 295 | * @param bs Buffer holding the boot sector of the file system. |
295 | * @param bs Buffer holding the boot sector of the file system. |
| 296 | * @param dev_handle Device handle of the file system. |
296 | * @param dev_handle Device handle of the file system. |
| Line 313... | Line 313... | ||
| 313 | fat_cluster_t *lifo; /* stack for storing free cluster numbers */ |
313 | fat_cluster_t *lifo; /* stack for storing free cluster numbers */ |
| 314 | unsigned found = 0; /* top of the free cluster number stack */ |
314 | unsigned found = 0; /* top of the free cluster number stack */ |
| 315 | unsigned b, c, cl; |
315 | unsigned b, c, cl; |
| 316 | 316 | ||
| 317 | lifo = (fat_cluster_t *) malloc(nclsts * sizeof(fat_cluster_t)); |
317 | lifo = (fat_cluster_t *) malloc(nclsts * sizeof(fat_cluster_t)); |
| 318 | if (lifo) |
318 | if (!lifo) |
| 319 | return ENOMEM; |
319 | return ENOMEM; |
| 320 | 320 | ||
| 321 | bps = uint16_t_le2host(bs->bps); |
321 | bps = uint16_t_le2host(bs->bps); |
| 322 | rscnt = uint16_t_le2host(bs->rscnt); |
322 | rscnt = uint16_t_le2host(bs->rscnt); |
| 323 | sf = uint16_t_le2host(bs->sec_per_fat); |
323 | sf = uint16_t_le2host(bs->sec_per_fat); |
| 324 | 324 | ||
| 325 | /* |
325 | /* |
| 326 | * Search FAT1 for unused clusters. |
326 | * Search FAT1 for unused clusters. |
| 327 | */ |
327 | */ |
| 328 | futex_down(&fat_alloc_lock); |
328 | futex_down(&fat_alloc_lock); |
| 329 | for (b = 0, cl = 0; b < sf; blk++) { |
329 | for (b = 0, cl = 0; b < sf; b++) { |
| 330 | blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NOREAD); |
330 | blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NONE); |
| 331 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
331 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
| 332 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
332 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
| 333 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
333 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
| 334 | /* |
334 | /* |
| 335 | * The cluster is free. Put it into our stack |
335 | * The cluster is free. Put it into our stack |