Rev 3517 | Rev 3521 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3517 | Rev 3518 | ||
---|---|---|---|
Line 51... | Line 51... | ||
51 | * during allocation of clusters. The lock does not have to be held durring |
51 | * during allocation of clusters. The lock does not have to be held durring |
52 | * deallocation of clusters. |
52 | * deallocation of clusters. |
53 | */ |
53 | */ |
54 | static futex_t fat_alloc_lock = FUTEX_INITIALIZER; |
54 | static futex_t fat_alloc_lock = FUTEX_INITIALIZER; |
55 | 55 | ||
- | 56 | /** Read block from file located on a FAT file system. |
|
- | 57 | * |
|
- | 58 | * @param bs Buffer holding the boot sector of the file system. |
|
- | 59 | * @param dev_handle Device handle of the file system. |
|
- | 60 | * @param firstc First cluster used by the file. Can be zero if the file |
|
- | 61 | * is empty. |
|
- | 62 | * @param offset Offset in blocks. |
|
- | 63 | * |
|
- | 64 | * @return Block structure holding the requested block. |
|
- | 65 | */ |
|
56 | block_t * |
66 | block_t * |
57 | _fat_block_get(fat_bs_t *bs, dev_handle_t dev_handle, fat_cluster_t firstc, |
67 | _fat_block_get(fat_bs_t *bs, dev_handle_t dev_handle, fat_cluster_t firstc, |
58 | off_t offset) |
68 | off_t offset) |
59 | { |
69 | { |
60 | block_t *b; |
70 | block_t *b; |
Line 206... | Line 216... | ||
206 | b->dirty = true; /* need to sync node */ |
216 | b->dirty = true; /* need to sync node */ |
207 | block_put(b); |
217 | block_put(b); |
208 | } |
218 | } |
209 | } |
219 | } |
210 | 220 | ||
- | 221 | /** Mark cluster in one instance of FAT. |
|
- | 222 | * |
|
- | 223 | * @param bs Buffer holding the boot sector for the file system. |
|
- | 224 | * @param dev_handle Device handle for the file system. |
|
- | 225 | * @param fatno Number of the FAT instance where to make the change. |
|
- | 226 | * @param clst Cluster which is to be marked. |
|
- | 227 | * @param value Value mark the cluster with. |
|
- | 228 | */ |
|
211 | void |
229 | void |
212 | fat_mark_cluster(fat_bs_t *bs, dev_handle_t dev_handle, unsigned fatno, |
230 | fat_mark_cluster(fat_bs_t *bs, dev_handle_t dev_handle, unsigned fatno, |
213 | fat_cluster_t clst, fat_cluster_t value) |
231 | fat_cluster_t clst, fat_cluster_t value) |
214 | { |
232 | { |
215 | block_t *b; |
233 | block_t *b; |
Line 229... | Line 247... | ||
229 | *cp = host2uint16_t_le(value); |
247 | *cp = host2uint16_t_le(value); |
230 | b->dirty = true; /* need to sync block */ |
248 | b->dirty = true; /* need to sync block */ |
231 | block_put(b); |
249 | block_put(b); |
232 | } |
250 | } |
233 | 251 | ||
- | 252 | /** Replay the allocatoin of clusters in all shadow instances of FAT. |
|
- | 253 | * |
|
- | 254 | * @param bs Buffer holding the boot sector of the file system. |
|
- | 255 | * @param dev_handle Device handle of the file system. |
|
- | 256 | * @param lifo Chain of allocated clusters. |
|
- | 257 | * @param nclsts Number of clusters in the lifo chain. |
|
- | 258 | */ |
|
234 | void fat_alloc_shadow_clusters(fat_bs_t *bs, dev_handle_t dev_handle, |
259 | void fat_alloc_shadow_clusters(fat_bs_t *bs, dev_handle_t dev_handle, |
235 | fat_cluster_t *lifo, unsigned nclsts) |
260 | fat_cluster_t *lifo, unsigned nclsts) |
236 | { |
261 | { |
237 | uint8_t fatno; |
262 | uint8_t fatno; |
238 | unsigned c; |
263 | unsigned c; |
Line 243... | Line 268... | ||
243 | c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]); |
268 | c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]); |
244 | } |
269 | } |
245 | } |
270 | } |
246 | } |
271 | } |
247 | 272 | ||
- | 273 | /** Allocate clusters in FAT1. |
|
- | 274 | * |
|
- | 275 | * This function will attempt to allocate the requested number of clusters in |
|
- | 276 | * the first FAT instance. The FAT will be altered so that the allocated |
|
- | 277 | * clusters form an independent chain (i.e. a chain which does not belong to any |
|
- | 278 | * file yet). |
|
- | 279 | * |
|
- | 280 | * @param bs Buffer holding the boot sector of the file system. |
|
- | 281 | * @param dev_handle Device handle of the file system. |
|
- | 282 | * @param nclsts Number of clusters to allocate. |
|
- | 283 | * @param mcl Output parameter where the first cluster in the chain |
|
- | 284 | * will be returned. |
|
- | 285 | * @param lcl Output parameter where the last cluster in the chain |
|
- | 286 | * will be returned. |
|
- | 287 | * |
|
- | 288 | * @return EOK on success, a negative error code otherwise. |
|
- | 289 | */ |
|
248 | int |
290 | int |
249 | fat_alloc_clusters(fat_bs_t *bs, dev_handle_t dev_handle, unsigned nclsts, |
291 | fat_alloc_clusters(fat_bs_t *bs, dev_handle_t dev_handle, unsigned nclsts, |
250 | fat_cluster_t *mcl, fat_cluster_t *lcl) |
292 | fat_cluster_t *mcl, fat_cluster_t *lcl) |
251 | { |
293 | { |
252 | uint16_t bps; |
294 | uint16_t bps; |
Line 312... | Line 354... | ||
312 | 354 | ||
313 | free(lifo); |
355 | free(lifo); |
314 | return ENOSPC; |
356 | return ENOSPC; |
315 | } |
357 | } |
316 | 358 | ||
- | 359 | /** Append a cluster chain to the last file cluster in all FATs. |
|
- | 360 | * |
|
- | 361 | * @param bs Buffer holding boot sector of the file system. |
|
- | 362 | * @param nodep Node representing the file. |
|
- | 363 | * @param mcl First cluster of the cluster chain to append. |
|
- | 364 | */ |
|
317 | void fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl) |
365 | void fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl) |
318 | { |
366 | { |
319 | dev_handle_t dev_handle = nodep->idx->dev_handle; |
367 | dev_handle_t dev_handle = nodep->idx->dev_handle; |
320 | fat_cluster_t lcl; |
368 | fat_cluster_t lcl; |
321 | uint8_t fatno; |
369 | uint8_t fatno; |