Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/mfs/mfs_ops.c

    r7769ec9 r44ecf89  
    3535#include <align.h>
    3636#include <adt/hash_table.h>
     37#include <adt/hash.h>
    3738#include "mfs.h"
    3839
    39 #define OPEN_NODES_KEYS 2
    40 #define OPEN_NODES_SERVICE_KEY 0
    41 #define OPEN_NODES_INODE_KEY 1
    42 #define OPEN_NODES_BUCKETS 256
    4340
    4441static bool check_magic_number(uint16_t magic, bool *native,
     
    6158static int mfs_unlink(fs_node_t *, fs_node_t *, const char *name);
    6259static int mfs_destroy_node(fs_node_t *fn);
    63 static hash_index_t open_nodes_hash(unsigned long key[]);
    64 static int open_nodes_compare(unsigned long key[], hash_count_t keys,
    65     link_t *item);
    66 static void open_nodes_remove_cb(link_t *link);
    6760static int mfs_node_get(fs_node_t **rfn, service_id_t service_id,
    6861    fs_index_t index);
     
    9588
    9689/* Hash table interface for open nodes hash table */
    97 static hash_index_t
    98 open_nodes_hash(unsigned long key[])
    99 {
    100         /* TODO: This is very simple and probably can be improved */
    101         return key[OPEN_NODES_INODE_KEY] % OPEN_NODES_BUCKETS;
    102 }
    103 
    104 static int
    105 open_nodes_compare(unsigned long key[], hash_count_t keys,
    106     link_t *item)
    107 {
    108         struct mfs_node *mnode = hash_table_get_instance(item,
    109             struct mfs_node, link);
    110         assert(keys > 0);
    111         if (mnode->instance->service_id !=
    112             ((service_id_t) key[OPEN_NODES_SERVICE_KEY])) {
    113                 return false;
    114         }
    115         if (keys == 1) {
    116                 return true;
    117         }
    118         assert(keys == 2);
    119         return (mnode->ino_i->index == key[OPEN_NODES_INODE_KEY]);
    120 }
    121 
    122 static void
    123 open_nodes_remove_cb(link_t *link)
    124 {
    125         /* We don't use remove callback for this hash table */
    126 }
    127 
    128 static hash_table_operations_t open_nodes_ops = {
     90
     91typedef struct {
     92        service_id_t service_id;
     93        fs_index_t index;
     94} node_key_t;
     95
     96static size_t
     97open_nodes_key_hash(void *key)
     98{
     99        node_key_t *node_key = (node_key_t*)key;
     100        return hash_combine(node_key->service_id, node_key->index);
     101}
     102
     103static size_t
     104open_nodes_hash(const ht_link_t *item)
     105{
     106        struct mfs_node *m = hash_table_get_inst(item, struct mfs_node, link);
     107        return hash_combine(m->instance->service_id, m->ino_i->index);
     108}
     109
     110static bool
     111open_nodes_key_equal(void *key, const ht_link_t *item)
     112{
     113        node_key_t *node_key = (node_key_t*)key;
     114        struct mfs_node *mnode = hash_table_get_inst(item, struct mfs_node, link);
     115
     116        return node_key->service_id == mnode->instance->service_id
     117                && node_key->index == mnode->ino_i->index;
     118}
     119
     120static hash_table_ops_t open_nodes_ops = {
    129121        .hash = open_nodes_hash,
    130         .compare = open_nodes_compare,
    131         .remove_callback = open_nodes_remove_cb,
     122        .key_hash = open_nodes_key_hash,
     123        .key_equal = open_nodes_key_equal,
     124        .equal = NULL,
     125        .remove_callback = NULL,
    132126};
    133127
     
    135129mfs_global_init(void)
    136130{
    137         if (!hash_table_create(&open_nodes, OPEN_NODES_BUCKETS,
    138             OPEN_NODES_KEYS, &open_nodes_ops)) {
     131        if (!hash_table_create(&open_nodes, 0, 0, &open_nodes_ops)) {
    139132                return ENOMEM;
    140133        }
     
    197190                /* This is a V1 or V2 Minix filesystem */
    198191                magic = sb->s_magic;
    199         } else if (check_magic_number(sb3->s_magic, &native,
    200             &version, &longnames)) {
     192        } else if (check_magic_number(sb3->s_magic, &native, &version, &longnames)) {
    201193                /* This is a V3 Minix filesystem */
    202194                magic = sb3->s_magic;
     
    408400        mnode->refcnt = 1;
    409401
    410         link_initialize(&mnode->link);
    411 
    412         unsigned long key[] = {
    413                 [OPEN_NODES_SERVICE_KEY] = inst->service_id,
    414                 [OPEN_NODES_INODE_KEY] = inum,
    415         };
    416 
    417402        fibril_mutex_lock(&open_nodes_lock);
    418         hash_table_insert(&open_nodes, key, &mnode->link);
     403        hash_table_insert(&open_nodes, &mnode->link);
    419404        fibril_mutex_unlock(&open_nodes_lock);
    420405        inst->open_nodes_cnt++;
     
    467452
    468453                if (comp_size == dentry_name_size &&
    469                     !bcmp(component, d_info.d_name, dentry_name_size)) {
     454                    memcmp(component, d_info.d_name, dentry_name_size) == 0) {
    470455                        /* Hit! */
    471456                        mfs_node_core_get(rfn, mnode->instance,
     
    515500        mnode->refcnt--;
    516501        if (mnode->refcnt == 0) {
    517                 unsigned long key[] = {
    518                         [OPEN_NODES_SERVICE_KEY] = mnode->instance->service_id,
    519                         [OPEN_NODES_INODE_KEY] = mnode->ino_i->index
    520                 };
    521                 hash_table_remove(&open_nodes, key, OPEN_NODES_KEYS);
     502                hash_table_remove_item(&open_nodes, &mnode->link);
    522503                assert(mnode->instance->open_nodes_cnt > 0);
    523504                mnode->instance->open_nodes_cnt--;
     
    578559
    579560        /* Check if the node is not already open */
    580         unsigned long key[] = {
    581                 [OPEN_NODES_SERVICE_KEY] = inst->service_id,
    582                 [OPEN_NODES_INODE_KEY] = index,
     561        node_key_t key = {
     562                .service_id = inst->service_id,
     563                .index = index
    583564        };
    584         link_t *already_open = hash_table_find(&open_nodes, key);
     565       
     566        ht_link_t *already_open = hash_table_find(&open_nodes, &key);
    585567
    586568        if (already_open) {
    587                 mnode = hash_table_get_instance(already_open,
    588                     struct mfs_node, link);
     569                mnode = hash_table_get_inst(already_open, struct mfs_node, link);
    589570                *rfn = mnode->fsnode;
    590571                mnode->refcnt++;
     
    617598        mnode->ino_i = ino_i;
    618599        mnode->refcnt = 1;
    619         link_initialize(&mnode->link);
    620600
    621601        mnode->instance = inst;
     
    624604        *rfn = node;
    625605
    626         hash_table_insert(&open_nodes, key, &mnode->link);
     606        hash_table_insert(&open_nodes, &mnode->link);
    627607        inst->open_nodes_cnt++;
    628608
     
    793773{
    794774        int rc;
    795         fs_node_t *fn;
     775        fs_node_t *fn = NULL;
    796776
    797777        rc = mfs_node_get(&fn, service_id, index);
     
    11281108mfs_sync(service_id_t service_id, fs_index_t index)
    11291109{
    1130         fs_node_t *fn;
     1110        fs_node_t *fn = NULL;
    11311111        int rc = mfs_node_get(&fn, service_id, index);
    11321112        if (rc != EOK)
Note: See TracChangeset for help on using the changeset viewer.