Rev 3674 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3674 | Rev 4691 | ||
---|---|---|---|
Line 43... | Line 43... | ||
43 | #include <libblock.h> |
43 | #include <libblock.h> |
44 | #include <errno.h> |
44 | #include <errno.h> |
45 | #include <byteorder.h> |
45 | #include <byteorder.h> |
46 | #include <align.h> |
46 | #include <align.h> |
47 | #include <assert.h> |
47 | #include <assert.h> |
- | 48 | #include <fibril_sync.h> |
|
48 | #include <futex.h> |
49 | #include <mem.h> |
49 | 50 | ||
50 | /** |
51 | /** |
51 | * The fat_alloc_lock futex protects all copies of the File Allocation Table |
52 | * The fat_alloc_lock mutex protects all copies of the File Allocation Table |
52 | * during allocation of clusters. The lock does not have to be held durring |
53 | * during allocation of clusters. The lock does not have to be held durring |
53 | * deallocation of clusters. |
54 | * deallocation of clusters. |
54 | */ |
55 | */ |
55 | static futex_t fat_alloc_lock = FUTEX_INITIALIZER; |
56 | static FIBRIL_MUTEX_INITIALIZE(fat_alloc_lock); |
56 | 57 | ||
57 | /** Walk the cluster chain. |
58 | /** Walk the cluster chain. |
58 | * |
59 | * |
59 | * @param bs Buffer holding the boot sector for the file. |
60 | * @param bs Buffer holding the boot sector for the file. |
60 | * @param dev_handle Device handle of the device with the file. |
61 | * @param dev_handle Device handle of the device with the file. |
Line 323... | Line 324... | ||
323 | sf = uint16_t_le2host(bs->sec_per_fat); |
324 | sf = uint16_t_le2host(bs->sec_per_fat); |
324 | 325 | ||
325 | /* |
326 | /* |
326 | * Search FAT1 for unused clusters. |
327 | * Search FAT1 for unused clusters. |
327 | */ |
328 | */ |
328 | futex_down(&fat_alloc_lock); |
329 | fibril_mutex_lock(&fat_alloc_lock); |
329 | for (b = 0, cl = 0; b < sf; b++) { |
330 | for (b = 0, cl = 0; b < sf; b++) { |
330 | blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NONE); |
331 | blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NONE); |
331 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
332 | for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { |
332 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
333 | fat_cluster_t *clst = (fat_cluster_t *)blk->data + c; |
333 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
334 | if (uint16_t_le2host(*clst) == FAT_CLST_RES0) { |
Line 347... | Line 348... | ||
347 | fat_alloc_shadow_clusters(bs, |
348 | fat_alloc_shadow_clusters(bs, |
348 | dev_handle, lifo, nclsts); |
349 | dev_handle, lifo, nclsts); |
349 | *mcl = lifo[found - 1]; |
350 | *mcl = lifo[found - 1]; |
350 | *lcl = lifo[0]; |
351 | *lcl = lifo[0]; |
351 | free(lifo); |
352 | free(lifo); |
352 | futex_up(&fat_alloc_lock); |
353 | fibril_mutex_unlock(&fat_alloc_lock); |
353 | return EOK; |
354 | return EOK; |
354 | } |
355 | } |
355 | } |
356 | } |
356 | } |
357 | } |
357 | block_put(blk); |
358 | block_put(blk); |
358 | } |
359 | } |
359 | futex_up(&fat_alloc_lock); |
360 | fibril_mutex_unlock(&fat_alloc_lock); |
360 | 361 | ||
361 | /* |
362 | /* |
362 | * We could not find enough clusters. Now we need to free the clusters |
363 | * We could not find enough clusters. Now we need to free the clusters |
363 | * we have allocated so far. |
364 | * we have allocated so far. |
364 | */ |
365 | */ |