Ignore:
File:
1 edited

Legend:

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

    r1715b6af r1313ee9  
    147147hash_table_t nodes;
    148148
    149 #define NODES_KEY_DEV   0       
    150 #define NODES_KEY_INDEX 1
     149#define NODES_KEY_INDEX 0
     150#define NODES_KEY_DEV   1
    151151
    152152/* Implementation of hash table interface for the nodes hash table. */
     
    160160        tmpfs_node_t *nodep = hash_table_get_instance(item, tmpfs_node_t,
    161161            nh_link);
    162        
    163         switch (keys) {
    164         case 1:
    165                 return (nodep->dev_handle == key[NODES_KEY_DEV]);
    166         case 2:
    167                 return ((nodep->dev_handle == key[NODES_KEY_DEV]) &&
    168                     (nodep->index == key[NODES_KEY_INDEX]));
    169         default:
    170                 abort();
    171         }
     162        return (nodep->index == key[NODES_KEY_INDEX] &&
     163            nodep->dev_handle == key[NODES_KEY_DEV]);
    172164}
    173165
    174166static void nodes_remove_callback(link_t *item)
    175167{
    176         tmpfs_node_t *nodep = hash_table_get_instance(item, tmpfs_node_t,
    177             nh_link);
    178 
    179         while (!list_empty(&nodep->cs_head)) {
    180                 tmpfs_dentry_t *dentryp = list_get_instance(nodep->cs_head.next,
    181                     tmpfs_dentry_t, link);
    182 
    183                 assert(nodep->type == TMPFS_DIRECTORY);
    184                 list_remove(&dentryp->link);
    185                 free(dentryp);
    186         }
    187 
    188         if (nodep->data) {
    189                 assert(nodep->type == TMPFS_FILE);
    190                 free(nodep->data);
    191         }
    192         free(nodep->bp);
    193         free(nodep);
    194168}
    195169
     
    241215}
    242216
    243 static void tmpfs_instance_done(dev_handle_t dev_handle)
    244 {
    245         unsigned long key[] = {
    246                 [NODES_KEY_DEV] = dev_handle
    247         };
    248         /*
    249          * Here we are making use of one special feature of our hash table
    250          * implementation, which allows to remove more items based on a partial
    251          * key match. In the following, we are going to remove all nodes
    252          * matching our device handle. The nodes_remove_callback() function will
    253          * take care of resource deallocation.
    254          */
    255         hash_table_remove(&nodes, key, 1);
    256 }
    257 
    258217int tmpfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component)
    259218{
     
    278237{
    279238        unsigned long key[] = {
    280                 [NODES_KEY_DEV] = dev_handle,
    281                 [NODES_KEY_INDEX] = index
     239                [NODES_KEY_INDEX] = index,
     240                [NODES_KEY_DEV] = dev_handle
    282241        };
    283242        link_t *lnk = hash_table_find(&nodes, key);
     
    337296        /* Insert the new node into the nodes hash table. */
    338297        unsigned long key[] = {
    339                 [NODES_KEY_DEV] = nodep->dev_handle,
    340                 [NODES_KEY_INDEX] = nodep->index
     298                [NODES_KEY_INDEX] = nodep->index,
     299                [NODES_KEY_DEV] = nodep->dev_handle
    341300        };
    342301        hash_table_insert(&nodes, key, &nodep->nh_link);
     
    353312
    354313        unsigned long key[] = {
    355                 [NODES_KEY_DEV] = nodep->dev_handle,
    356                 [NODES_KEY_INDEX] = nodep->index
     314                [NODES_KEY_INDEX] = nodep->index,
     315                [NODES_KEY_DEV] = nodep->dev_handle
    357316        };
    358317        hash_table_remove(&nodes, key, 2);
    359318
    360         /*
    361          * The nodes_remove_callback() function takes care of the actual
    362          * resource deallocation.
    363          */
     319        if (nodep->type == TMPFS_FILE)
     320                free(nodep->data);
     321        free(nodep->bp);
     322        free(nodep);
    364323        return EOK;
    365324}
     
    465424        /* Initialize TMPFS instance. */
    466425        if (!tmpfs_instance_init(dev_handle)) {
    467                 free(opts);
    468426                ipc_answer_0(rid, ENOMEM);
    469427                return;
     
    484442                    rootp->lnkcnt);
    485443        }
    486         free(opts);
    487444}
    488445
     
    490447{
    491448        libfs_mount(&tmpfs_libfs_ops, tmpfs_reg.fs_handle, rid, request);
    492 }
    493 
    494 void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
    495 {
    496         dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
    497 
    498         tmpfs_instance_done(dev_handle);
    499         ipc_answer_0(rid, EOK);
    500 }
    501 
    502 void tmpfs_unmount(ipc_callid_t rid, ipc_call_t *request)
    503 {
    504         libfs_unmount(&tmpfs_libfs_ops, rid, request);
    505449}
    506450
     
    521465        link_t *hlp;
    522466        unsigned long key[] = {
     467                [NODES_KEY_INDEX] = index,
    523468                [NODES_KEY_DEV] = dev_handle,
    524                 [NODES_KEY_INDEX] = index
    525469        };
    526470        hlp = hash_table_find(&nodes, key);
     
    595539        link_t *hlp;
    596540        unsigned long key[] = {
    597                 [NODES_KEY_DEV] = dev_handle,
    598                 [NODES_KEY_INDEX] = index
     541                [NODES_KEY_INDEX] = index,
     542                [NODES_KEY_DEV] = dev_handle
    599543        };
    600544        hlp = hash_table_find(&nodes, key);
     
    659603        link_t *hlp;
    660604        unsigned long key[] = {
    661                 [NODES_KEY_DEV] = dev_handle,
    662                 [NODES_KEY_INDEX] = index
     605                [NODES_KEY_INDEX] = index,
     606                [NODES_KEY_DEV] = dev_handle
    663607        };
    664608        hlp = hash_table_find(&nodes, key);
     
    702646        link_t *hlp;
    703647        unsigned long key[] = {
    704                 [NODES_KEY_DEV] = dev_handle,
    705                 [NODES_KEY_INDEX] = index
     648                [NODES_KEY_INDEX] = index,
     649                [NODES_KEY_DEV] = dev_handle
    706650        };
    707651        hlp = hash_table_find(&nodes, key);
Note: See TracChangeset for help on using the changeset viewer.