Changes in / [ce8c848:bb0d3d24] in mainline


Ignore:
File:
1 edited

Legend:

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

    rce8c848 rbb0d3d24  
    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
     
    451486void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
    452487{
    453         ipc_answer_0(rid, ENOTSUP);
     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);
    454492}
    455493
     
    475513        link_t *hlp;
    476514        unsigned long key[] = {
    477                 [NODES_KEY_INDEX] = index,
    478515                [NODES_KEY_DEV] = dev_handle,
     516                [NODES_KEY_INDEX] = index
    479517        };
    480518        hlp = hash_table_find(&nodes, key);
     
    549587        link_t *hlp;
    550588        unsigned long key[] = {
    551                 [NODES_KEY_INDEX] = index,
    552                 [NODES_KEY_DEV] = dev_handle
     589                [NODES_KEY_DEV] = dev_handle,
     590                [NODES_KEY_INDEX] = index
    553591        };
    554592        hlp = hash_table_find(&nodes, key);
     
    613651        link_t *hlp;
    614652        unsigned long key[] = {
    615                 [NODES_KEY_INDEX] = index,
    616                 [NODES_KEY_DEV] = dev_handle
     653                [NODES_KEY_DEV] = dev_handle,
     654                [NODES_KEY_INDEX] = index
    617655        };
    618656        hlp = hash_table_find(&nodes, key);
     
    656694        link_t *hlp;
    657695        unsigned long key[] = {
    658                 [NODES_KEY_INDEX] = index,
    659                 [NODES_KEY_DEV] = dev_handle
     696                [NODES_KEY_DEV] = dev_handle,
     697                [NODES_KEY_INDEX] = index
    660698        };
    661699        hlp = hash_table_find(&nodes, key);
Note: See TracChangeset for help on using the changeset viewer.