401 | | |
402 | | |
403 | | ////////////////////////////////////////////////////////////////////////////////// |
404 | | // This recursive function scans one File-Cache (or Fat-Cache) from root to |
405 | | // leaves. All memory allocated for 4KB buffers, and buffer descriptors (in |
406 | | // leaves) is released, along with the 64-Tree structure (root node is kept). |
407 | | // The cache is identified by the "root" and "levels" arguments. |
408 | | // It should not contain any dirty clusters. |
409 | | ////////////////////////////////////////////////////////////////////////////////// |
410 | | |
411 | | static void _release_cache_memory( fat_cache_node_t* root, |
412 | | unsigned int levels ); |
413 | | |
414 | | ////////////////////////////////////////////////////////////////////////////////// |
415 | | // The following function allocates and initializes a new cache node. |
416 | | // Its first child can be specified (used when adding a cache level). |
417 | | // The 63 other children are set to NULL. |
418 | | // It returns a pointer to a new Fat-Cache node. |
419 | | ////////////////////////////////////////////////////////////////////////////////// |
420 | | |
421 | | static fat_cache_node_t* _allocate_one_cache_node( fat_cache_node_t* first_child ); |
422 | | |
423 | | ////////////////////////////////////////////////////////////////////////////////// |
424 | | // The following function allocates and initializes a new inode, |
425 | | // using the values defined by the arguments. |
426 | | // If the "cache_allocate" argument is true, an empty cache is allocated. |
427 | | // It returns a pointer on the new inode. |
428 | | ////////////////////////////////////////////////////////////////////////////////// |
429 | | |
430 | | static fat_inode_t* _allocate_one_inode( char* name, |
431 | | unsigned int is_dir, |
432 | | unsigned int cluster, |
433 | | unsigned int size, |
434 | | unsigned int count, |
435 | | unsigned int dentry, |
436 | | unsigned int cache_allocate ); |
437 | | |
438 | | ////////////////////////////////////////////////////////////////////////////////// |
439 | | // The following function allocates a 4 Kbytes buffer and the associated cluster |
440 | | // descriptor for the file (or directory) identified by the <inode> argument, |
441 | | // and updates the Cache_File slot identified by the <cluster_id> argument. |
442 | | // The File-Cache slot must be empty. |
443 | | // It updates the buffer descriptor, using the <cluster> argument, that is |
444 | | // the cluster index in FAT. The cluster descriptor dirty field is set. |
445 | | // It traverse the 64-tree Cache-file from top to bottom to find the last level. |
446 | | ////////////////////////////////////////////////////////////////////////////////// |
447 | | |
448 | | static void _allocate_one_buffer( fat_inode_t* inode, |
449 | | unsigned int cluster_id, |
450 | | unsigned int cluster ); |
451 | | |
452 | | ////////////////////////////////////////////////////////////////////////////////// |
453 | | // The following function allocates one free cluster from the FAT |
454 | | // and returns the cluster index in the <cluster> argument. |
455 | | // It updates the FAT slot, and the two FAT global variables: first_free_cluster, |
456 | | // and free_clusters_number. |
457 | | // It returns 0 on success. |
458 | | // It returns 1 on error. |
459 | | ////////////////////////////////////////////////////////////////////////////////// |
460 | | |
461 | | static unsigned int _allocate_one_cluster( unsigned int* cluster ); |
462 | | |
463 | | ///////////////////////////////////////////////////////////////////////////// |
464 | | // This function remove from the file system a file or a directory |
465 | | // identified by the <inode> argument. |
466 | | // The remove condition must be checked by the caller. |
467 | | // The relevant lock(s) must have been taken by te caller. |
468 | | // It returns 0 on success. |
469 | | // It returns 1 on error. |
470 | | ///////////////////////////////////////////////////////////////////////////// |
471 | | |
472 | | static unsigned int _remove_node_from_fs( fat_inode_t* inode ); |
473 | | |
| 401 | === __void '''_release_cache_memory'''( fat_cache_node_t* root , unsigned int levels )__ === |
| 402 | This recursive function scans one File-Cache (or Fat-Cache) from root to leaves. All memory allocated for 4KB buffers, and buffer descriptors (in leaves) is released, along with the 64-Tree structure (root node is kept). |
| 403 | The released cache is identified by the <root> and <levels> arguments. |
| 404 | It should not contain any dirty clusters. |
| 405 | |
| 406 | === __fat_cache_node_t* '''_allocate_one_cache_node'''( fat_cache_node_t* first_child )__ === |
| 407 | This function allocates and initializes a new cache node. |
| 408 | Its first child can be specified (used when adding a cache level). |
| 409 | The 63 other children are set to NULL. |
| 410 | It returns a pointer to the new Fat-Cache node. |
| 411 | |
| 412 | === __fat_inode_t* '''_allocate_one_inode'''( char* name , unsigned int is_dir , unsigned int cluster , unsigned int size , unsigned int count , unsigned int dentry , unsigned int cache_allocate )__ === |
| 413 | This function allocates and initializes a new inode, using the values defined by the <name>, <is_dir>, <cluster>, <size>, <count>, and <dentry> arguments. If the <cache_allocate> argument is true, an empty cache is allocated. |
| 414 | It returns a pointer on the new inode. |
| 415 | |
| 416 | === __void '''_allocate_one_buffer'''( fat_inode_t* inode , unsigned int cluster_id , unsigned int cluster )__ === |
| 417 | This function allocates a 4 Kbytes buffer and the associated cluster descriptor from the heap[x,y] defined by the calling thread, for the file (or directory) identified by the <inode> argument. It updates the Cache_File slot identified by the <cluster_id> argument. |
| 418 | The File-Cache slot must be empty. It updates the buffer descriptor, using the <cluster> argument, that is the cluster index in FAT. The buffer descriptor dirty bit is set. |
| 419 | It traverses the 64-tree Cache-file from top to bottom to find the last level. |
| 420 | |
| 421 | === __unsigned int '''_allocate_one_cluster'''( unsigned int* cluster )__ == |
| 422 | This function allocates one free cluster from the FAT and returns the cluster index in the <cluster> argument. |
| 423 | It updates the FAT slot, and the two FAT global variables "first_free_cluster" and "free_clusters_number". |
| 424 | It returns 0 on success. It returns 1 on error. |
| 425 | |
| 426 | === __unsigned int '''_remove_node_from_fs'''( fat_inode_t* inode )__ === |
| 427 | This function remove from the file system a file or a directory identified by the <inode> argument. |
| 428 | The remove conditions must be checked by the caller. The relevant lock(s) must have been taken by te caller. |
| 429 | It returns 0 on success. It returns 1 on error. |