Changes in uspace/srv/fs/mfs/mfs_ops.c [44ecf89:7769ec9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/mfs/mfs_ops.c
r44ecf89 r7769ec9 35 35 #include <align.h> 36 36 #include <adt/hash_table.h> 37 #include <adt/hash.h>38 37 #include "mfs.h" 39 38 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 40 43 41 44 static bool check_magic_number(uint16_t magic, bool *native, … … 58 61 static int mfs_unlink(fs_node_t *, fs_node_t *, const char *name); 59 62 static 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); 60 67 static int mfs_node_get(fs_node_t **rfn, service_id_t service_id, 61 68 fs_index_t index); … … 88 95 89 96 /* Hash table interface for open nodes hash table */ 90 91 typedef struct { 92 service_id_t service_id; 93 fs_index_t index; 94 } node_key_t; 95 96 static size_t 97 open_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 103 static size_t 104 open_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 110 static bool 111 open_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 120 static hash_table_ops_t open_nodes_ops = { 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 = { 121 129 .hash = open_nodes_hash, 122 .key_hash = open_nodes_key_hash, 123 .key_equal = open_nodes_key_equal, 124 .equal = NULL, 125 .remove_callback = NULL, 130 .compare = open_nodes_compare, 131 .remove_callback = open_nodes_remove_cb, 126 132 }; 127 133 … … 129 135 mfs_global_init(void) 130 136 { 131 if (!hash_table_create(&open_nodes, 0, 0, &open_nodes_ops)) { 137 if (!hash_table_create(&open_nodes, OPEN_NODES_BUCKETS, 138 OPEN_NODES_KEYS, &open_nodes_ops)) { 132 139 return ENOMEM; 133 140 } … … 190 197 /* This is a V1 or V2 Minix filesystem */ 191 198 magic = sb->s_magic; 192 } else if (check_magic_number(sb3->s_magic, &native, &version, &longnames)) { 199 } else if (check_magic_number(sb3->s_magic, &native, 200 &version, &longnames)) { 193 201 /* This is a V3 Minix filesystem */ 194 202 magic = sb3->s_magic; … … 400 408 mnode->refcnt = 1; 401 409 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 402 417 fibril_mutex_lock(&open_nodes_lock); 403 hash_table_insert(&open_nodes, &mnode->link);418 hash_table_insert(&open_nodes, key, &mnode->link); 404 419 fibril_mutex_unlock(&open_nodes_lock); 405 420 inst->open_nodes_cnt++; … … 452 467 453 468 if (comp_size == dentry_name_size && 454 memcmp(component, d_info.d_name, dentry_name_size) == 0) {469 !bcmp(component, d_info.d_name, dentry_name_size)) { 455 470 /* Hit! */ 456 471 mfs_node_core_get(rfn, mnode->instance, … … 500 515 mnode->refcnt--; 501 516 if (mnode->refcnt == 0) { 502 hash_table_remove_item(&open_nodes, &mnode->link); 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); 503 522 assert(mnode->instance->open_nodes_cnt > 0); 504 523 mnode->instance->open_nodes_cnt--; … … 559 578 560 579 /* Check if the node is not already open */ 561 node_key_t key= {562 .service_id= inst->service_id,563 .index = index580 unsigned long key[] = { 581 [OPEN_NODES_SERVICE_KEY] = inst->service_id, 582 [OPEN_NODES_INODE_KEY] = index, 564 583 }; 565 566 ht_link_t *already_open = hash_table_find(&open_nodes, &key); 584 link_t *already_open = hash_table_find(&open_nodes, key); 567 585 568 586 if (already_open) { 569 mnode = hash_table_get_inst(already_open, struct mfs_node, link); 587 mnode = hash_table_get_instance(already_open, 588 struct mfs_node, link); 570 589 *rfn = mnode->fsnode; 571 590 mnode->refcnt++; … … 598 617 mnode->ino_i = ino_i; 599 618 mnode->refcnt = 1; 619 link_initialize(&mnode->link); 600 620 601 621 mnode->instance = inst; … … 604 624 *rfn = node; 605 625 606 hash_table_insert(&open_nodes, &mnode->link);626 hash_table_insert(&open_nodes, key, &mnode->link); 607 627 inst->open_nodes_cnt++; 608 628 … … 773 793 { 774 794 int rc; 775 fs_node_t *fn = NULL;795 fs_node_t *fn; 776 796 777 797 rc = mfs_node_get(&fn, service_id, index); … … 1108 1128 mfs_sync(service_id_t service_id, fs_index_t index) 1109 1129 { 1110 fs_node_t *fn = NULL;1130 fs_node_t *fn; 1111 1131 int rc = mfs_node_get(&fn, service_id, index); 1112 1132 if (rc != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.