Rev 3612 | Rev 3675 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3612 | Rev 3623 | ||
---|---|---|---|
Line 214... | Line 214... | ||
214 | idxp->nodep = nodep; |
214 | idxp->nodep = nodep; |
215 | 215 | ||
216 | return nodep; |
216 | return nodep; |
217 | } |
217 | } |
218 | 218 | ||
- | 219 | /* |
|
- | 220 | * Forward declarations of FAT libfs operations. |
|
- | 221 | */ |
|
- | 222 | static void *fat_node_get(dev_handle_t, fs_index_t); |
|
- | 223 | static void fat_node_put(void *); |
|
- | 224 | static void *fat_create_node(dev_handle_t, int); |
|
- | 225 | static int fat_destroy_node(void *); |
|
- | 226 | static bool fat_link(void *, void *, const char *); |
|
- | 227 | static int fat_unlink(void *, void *); |
|
- | 228 | static void *fat_match(void *, const char *); |
|
- | 229 | static fs_index_t fat_index_get(void *); |
|
- | 230 | static size_t fat_size_get(void *); |
|
- | 231 | static unsigned fat_lnkcnt_get(void *); |
|
- | 232 | static bool fat_has_children(void *); |
|
- | 233 | static void *fat_root_get(dev_handle_t); |
|
- | 234 | static char fat_plb_get_char(unsigned); |
|
- | 235 | static bool fat_is_directory(void *); |
|
- | 236 | static bool fat_is_file(void *node); |
|
- | 237 | ||
- | 238 | /* |
|
- | 239 | * FAT libfs operations. |
|
- | 240 | */ |
|
- | 241 | ||
219 | /** Instantiate a FAT in-core node. */ |
242 | /** Instantiate a FAT in-core node. */ |
220 | static void *fat_node_get(dev_handle_t dev_handle, fs_index_t index) |
243 | void *fat_node_get(dev_handle_t dev_handle, fs_index_t index) |
221 | { |
244 | { |
222 | void *node; |
245 | void *node; |
223 | fat_idx_t *idxp; |
246 | fat_idx_t *idxp; |
224 | 247 | ||
225 | idxp = fat_idx_get_by_index(dev_handle, index); |
248 | idxp = fat_idx_get_by_index(dev_handle, index); |
Line 229... | Line 252... | ||
229 | node = fat_node_get_core(idxp); |
252 | node = fat_node_get_core(idxp); |
230 | futex_up(&idxp->lock); |
253 | futex_up(&idxp->lock); |
231 | return node; |
254 | return node; |
232 | } |
255 | } |
233 | 256 | ||
234 | static void fat_node_put(void *node) |
257 | void fat_node_put(void *node) |
235 | { |
258 | { |
236 | fat_node_t *nodep = (fat_node_t *)node; |
259 | fat_node_t *nodep = (fat_node_t *)node; |
237 | bool destroy = false; |
260 | bool destroy = false; |
238 | 261 | ||
239 | futex_down(&nodep->lock); |
262 | futex_down(&nodep->lock); |
Line 255... | Line 278... | ||
255 | futex_up(&nodep->lock); |
278 | futex_up(&nodep->lock); |
256 | if (destroy) |
279 | if (destroy) |
257 | free(node); |
280 | free(node); |
258 | } |
281 | } |
259 | 282 | ||
260 | static void *fat_create_node(dev_handle_t dev_handle, int flags) |
283 | void *fat_create_node(dev_handle_t dev_handle, int flags) |
261 | { |
284 | { |
262 | fat_idx_t *idxp; |
285 | fat_idx_t *idxp; |
263 | fat_node_t *nodep; |
286 | fat_node_t *nodep; |
264 | 287 | ||
265 | nodep = fat_node_get_new(); |
288 | nodep = fat_node_get_new(); |
Line 286... | Line 309... | ||
286 | 309 | ||
287 | futex_up(&idxp->lock); |
310 | futex_up(&idxp->lock); |
288 | return nodep; |
311 | return nodep; |
289 | } |
312 | } |
290 | 313 | ||
291 | static int fat_destroy_node(void *node) |
314 | int fat_destroy_node(void *node) |
292 | { |
315 | { |
- | 316 | fat_node_t *nodep = (fat_node_t *)node; |
|
- | 317 | fat_bs_t *bs; |
|
- | 318 | ||
- | 319 | /* |
|
- | 320 | * The node is not reachable from the file system. This means that the |
|
- | 321 | * link count should be zero and that the index structure cannot be |
|
- | 322 | * found in the position hash. Obviously, we don't need to lock the node |
|
- | 323 | * nor its index structure. |
|
- | 324 | */ |
|
- | 325 | assert(nodep->lnkcnt == 0); |
|
- | 326 | ||
- | 327 | /* |
|
- | 328 | * The node may not have any children. |
|
- | 329 | */ |
|
- | 330 | assert(fat_has_children(node) == false); |
|
- | 331 | ||
- | 332 | bs = block_bb_get(nodep->idx->dev_handle); |
|
- | 333 | if (nodep->firstc != FAT_CLST_RES0) { |
|
- | 334 | assert(nodep->size); |
|
293 | return ENOTSUP; /* not supported at the moment */ |
335 | /* Free all clusters allocated to the node. */ |
- | 336 | fat_free_clusters(bs, nodep->idx->dev_handle, nodep->firstc); |
|
- | 337 | } |
|
- | 338 | ||
- | 339 | fat_idx_destroy(nodep->idx); |
|
- | 340 | free(nodep); |
|
- | 341 | return EOK; |
|
294 | } |
342 | } |
295 | 343 | ||
296 | static bool fat_link(void *prnt, void *chld, const char *name) |
344 | bool fat_link(void *prnt, void *chld, const char *name) |
297 | { |
345 | { |
298 | return false; /* not supported at the moment */ |
346 | return false; /* not supported at the moment */ |
299 | } |
347 | } |
300 | 348 | ||
301 | static int fat_unlink(void *prnt, void *chld) |
349 | int fat_unlink(void *prnt, void *chld) |
302 | { |
350 | { |
303 | return ENOTSUP; /* not supported at the moment */ |
351 | return ENOTSUP; /* not supported at the moment */ |
304 | } |
352 | } |
305 | 353 | ||
306 | static void *fat_match(void *prnt, const char *component) |
354 | void *fat_match(void *prnt, const char *component) |
307 | { |
355 | { |
308 | fat_bs_t *bs; |
356 | fat_bs_t *bs; |
309 | fat_node_t *parentp = (fat_node_t *)prnt; |
357 | fat_node_t *parentp = (fat_node_t *)prnt; |
310 | char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1]; |
358 | char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1]; |
311 | unsigned i, j; |
359 | unsigned i, j; |
Line 368... | Line 416... | ||
368 | 416 | ||
369 | futex_up(&parentp->idx->lock); |
417 | futex_up(&parentp->idx->lock); |
370 | return NULL; |
418 | return NULL; |
371 | } |
419 | } |
372 | 420 | ||
373 | static fs_index_t fat_index_get(void *node) |
421 | fs_index_t fat_index_get(void *node) |
374 | { |
422 | { |
375 | fat_node_t *fnodep = (fat_node_t *)node; |
423 | fat_node_t *fnodep = (fat_node_t *)node; |
376 | if (!fnodep) |
424 | if (!fnodep) |
377 | return 0; |
425 | return 0; |
378 | return fnodep->idx->index; |
426 | return fnodep->idx->index; |
379 | } |
427 | } |
380 | 428 | ||
381 | static size_t fat_size_get(void *node) |
429 | size_t fat_size_get(void *node) |
382 | { |
430 | { |
383 | return ((fat_node_t *)node)->size; |
431 | return ((fat_node_t *)node)->size; |
384 | } |
432 | } |
385 | 433 | ||
386 | static unsigned fat_lnkcnt_get(void *node) |
434 | unsigned fat_lnkcnt_get(void *node) |
387 | { |
435 | { |
388 | return ((fat_node_t *)node)->lnkcnt; |
436 | return ((fat_node_t *)node)->lnkcnt; |
389 | } |
437 | } |
390 | 438 | ||
391 | static bool fat_has_children(void *node) |
439 | bool fat_has_children(void *node) |
392 | { |
440 | { |
393 | fat_bs_t *bs; |
441 | fat_bs_t *bs; |
394 | fat_node_t *nodep = (fat_node_t *)node; |
442 | fat_node_t *nodep = (fat_node_t *)node; |
395 | unsigned bps; |
443 | unsigned bps; |
396 | unsigned dps; |
444 | unsigned dps; |
Line 436... | Line 484... | ||
436 | 484 | ||
437 | futex_up(&nodep->idx->lock); |
485 | futex_up(&nodep->idx->lock); |
438 | return false; |
486 | return false; |
439 | } |
487 | } |
440 | 488 | ||
441 | static void *fat_root_get(dev_handle_t dev_handle) |
489 | void *fat_root_get(dev_handle_t dev_handle) |
442 | { |
490 | { |
443 | return fat_node_get(dev_handle, 0); |
491 | return fat_node_get(dev_handle, 0); |
444 | } |
492 | } |
445 | 493 | ||
446 | static char fat_plb_get_char(unsigned pos) |
494 | char fat_plb_get_char(unsigned pos) |
447 | { |
495 | { |
448 | return fat_reg.plb_ro[pos % PLB_SIZE]; |
496 | return fat_reg.plb_ro[pos % PLB_SIZE]; |
449 | } |
497 | } |
450 | 498 | ||
451 | static bool fat_is_directory(void *node) |
499 | bool fat_is_directory(void *node) |
452 | { |
500 | { |
453 | return ((fat_node_t *)node)->type == FAT_DIRECTORY; |
501 | return ((fat_node_t *)node)->type == FAT_DIRECTORY; |
454 | } |
502 | } |
455 | 503 | ||
456 | static bool fat_is_file(void *node) |
504 | bool fat_is_file(void *node) |
457 | { |
505 | { |
458 | return ((fat_node_t *)node)->type == FAT_FILE; |
506 | return ((fat_node_t *)node)->type == FAT_FILE; |
459 | } |
507 | } |
460 | 508 | ||
461 | /** libfs operations */ |
509 | /** libfs operations */ |
Line 836... | Line 884... | ||
836 | fat_node_put(nodep); |
884 | fat_node_put(nodep); |
837 | ipc_answer_0(rid, rc); |
885 | ipc_answer_0(rid, rc); |
838 | return; |
886 | return; |
839 | } |
887 | } |
840 | 888 | ||
- | 889 | void fat_destroy(ipc_callid_t rid, ipc_call_t *request) |
|
- | 890 | { |
|
- | 891 | dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
|
- | 892 | fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); |
|
- | 893 | int rc; |
|
- | 894 | ||
- | 895 | fat_node_t *nodep = fat_node_get(dev_handle, index); |
|
- | 896 | if (!nodep) { |
|
- | 897 | ipc_answer_0(rid, ENOENT); |
|
- | 898 | return; |
|
- | 899 | } |
|
- | 900 | ||
- | 901 | rc = fat_destroy_node(nodep); |
|
- | 902 | ipc_answer_0(rid, rc); |
|
- | 903 | } |
|
- | 904 | ||
841 | /** |
905 | /** |
842 | * @} |
906 | * @} |
843 | */ |
907 | */ |