Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/tmpfs/tmpfs_ops.c

    r1313ee9 re056e820  
    147147hash_table_t nodes;
    148148
    149 #define NODES_KEY_INDEX 0
    150 #define NODES_KEY_DEV   1
     149#define NODES_KEY_DEV   0       
     150#define NODES_KEY_INDEX 1
    151151
    152152/* Implementation of hash table interface for the nodes hash table. */
     
    166166static void nodes_remove_callback(link_t *item)
    167167{
     168        tmpfs_node_t *nodep = hash_table_get_instance(item, tmpfs_node_t,
     169            nh_link);
     170
     171        while (!list_empty(&nodep->cs_head)) {
     172                tmpfs_dentry_t *dentryp = list_get_instance(nodep->cs_head.next,
     173                    tmpfs_dentry_t, link);
     174
     175                assert(nodep->type == TMPFS_DIRECTORY);
     176                list_remove(&dentryp->link);
     177                free(dentryp);
     178        }
     179
     180        if (nodep->data) {
     181                assert(nodep->type == TMPFS_FILE);
     182                free(nodep->data);
     183        }
     184        free(nodep->bp);
     185        free(nodep);
    168186}
    169187
     
    215233}
    216234
     235static void tmpfs_instance_done(dev_handle_t dev_handle)
     236{
     237        unsigned long key[] = {
     238                [NODES_KEY_DEV] = dev_handle
     239        };
     240        /*
     241         * Here we are making use of one special feature of our hash table
     242         * implementation, which allows to remove more items based on a partial
     243         * key match. In the following, we are going to remove all nodes
     244         * matching our device handle. The nodes_remove_callback() function will
     245         * take care of resource deallocation.
     246         */
     247        hash_table_remove(&nodes, key, 1);
     248}
     249
    217250int tmpfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component)
    218251{
     
    237270{
    238271        unsigned long key[] = {
    239                 [NODES_KEY_INDEX] = index,
    240                 [NODES_KEY_DEV] = dev_handle
     272                [NODES_KEY_DEV] = dev_handle,
     273                [NODES_KEY_INDEX] = index
    241274        };
    242275        link_t *lnk = hash_table_find(&nodes, key);
     
    296329        /* Insert the new node into the nodes hash table. */
    297330        unsigned long key[] = {
    298                 [NODES_KEY_INDEX] = nodep->index,
    299                 [NODES_KEY_DEV] = nodep->dev_handle
     331                [NODES_KEY_DEV] = nodep->dev_handle,
     332                [NODES_KEY_INDEX] = nodep->index
    300333        };
    301334        hash_table_insert(&nodes, key, &nodep->nh_link);
     
    312345
    313346        unsigned long key[] = {
    314                 [NODES_KEY_INDEX] = nodep->index,
    315                 [NODES_KEY_DEV] = nodep->dev_handle
     347                [NODES_KEY_DEV] = nodep->dev_handle,
     348                [NODES_KEY_INDEX] = nodep->index
    316349        };
    317350        hash_table_remove(&nodes, key, 2);
    318351
    319         if (nodep->type == TMPFS_FILE)
    320                 free(nodep->data);
    321         free(nodep->bp);
    322         free(nodep);
     352        /*
     353         * The nodes_remove_callback() function takes care of the actual
     354         * resource deallocation.
     355         */
    323356        return EOK;
    324357}
     
    424457        /* Initialize TMPFS instance. */
    425458        if (!tmpfs_instance_init(dev_handle)) {
     459                free(opts);
    426460                ipc_answer_0(rid, ENOMEM);
    427461                return;
     
    442476                    rootp->lnkcnt);
    443477        }
     478        free(opts);
    444479}
    445480
     
    447482{
    448483        libfs_mount(&tmpfs_libfs_ops, tmpfs_reg.fs_handle, rid, request);
     484}
     485
     486void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
     487{
     488        dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     489
     490        tmpfs_instance_done(dev_handle);
     491        ipc_answer_0(rid, EOK);
     492}
     493
     494void tmpfs_unmount(ipc_callid_t rid, ipc_call_t *request)
     495{
     496        libfs_unmount(&tmpfs_libfs_ops, rid, request);
    449497}
    450498
     
    465513        link_t *hlp;
    466514        unsigned long key[] = {
    467                 [NODES_KEY_INDEX] = index,
    468515                [NODES_KEY_DEV] = dev_handle,
     516                [NODES_KEY_INDEX] = index
    469517        };
    470518        hlp = hash_table_find(&nodes, key);
     
    539587        link_t *hlp;
    540588        unsigned long key[] = {
    541                 [NODES_KEY_INDEX] = index,
    542                 [NODES_KEY_DEV] = dev_handle
     589                [NODES_KEY_DEV] = dev_handle,
     590                [NODES_KEY_INDEX] = index
    543591        };
    544592        hlp = hash_table_find(&nodes, key);
     
    603651        link_t *hlp;
    604652        unsigned long key[] = {
    605                 [NODES_KEY_INDEX] = index,
    606                 [NODES_KEY_DEV] = dev_handle
     653                [NODES_KEY_DEV] = dev_handle,
     654                [NODES_KEY_INDEX] = index
    607655        };
    608656        hlp = hash_table_find(&nodes, key);
     
    646694        link_t *hlp;
    647695        unsigned long key[] = {
    648                 [NODES_KEY_INDEX] = index,
    649                 [NODES_KEY_DEV] = dev_handle
     696                [NODES_KEY_DEV] = dev_handle,
     697                [NODES_KEY_INDEX] = index
    650698        };
    651699        hlp = hash_table_find(&nodes, key);
Note: See TracChangeset for help on using the changeset viewer.