Changes in uspace/srv/fs/tmpfs/tmpfs_ops.c [1715b6af:1313ee9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/tmpfs/tmpfs_ops.c
r1715b6af r1313ee9 147 147 hash_table_t nodes; 148 148 149 #define NODES_KEY_ DEV 0150 #define NODES_KEY_ INDEX1149 #define NODES_KEY_INDEX 0 150 #define NODES_KEY_DEV 1 151 151 152 152 /* Implementation of hash table interface for the nodes hash table. */ … … 160 160 tmpfs_node_t *nodep = hash_table_get_instance(item, tmpfs_node_t, 161 161 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]); 172 164 } 173 165 174 166 static void nodes_remove_callback(link_t *item) 175 167 { 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);194 168 } 195 169 … … 241 215 } 242 216 243 static void tmpfs_instance_done(dev_handle_t dev_handle)244 {245 unsigned long key[] = {246 [NODES_KEY_DEV] = dev_handle247 };248 /*249 * Here we are making use of one special feature of our hash table250 * implementation, which allows to remove more items based on a partial251 * key match. In the following, we are going to remove all nodes252 * matching our device handle. The nodes_remove_callback() function will253 * take care of resource deallocation.254 */255 hash_table_remove(&nodes, key, 1);256 }257 258 217 int tmpfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component) 259 218 { … … 278 237 { 279 238 unsigned long key[] = { 280 [NODES_KEY_ DEV] = dev_handle,281 [NODES_KEY_ INDEX] = index239 [NODES_KEY_INDEX] = index, 240 [NODES_KEY_DEV] = dev_handle 282 241 }; 283 242 link_t *lnk = hash_table_find(&nodes, key); … … 337 296 /* Insert the new node into the nodes hash table. */ 338 297 unsigned long key[] = { 339 [NODES_KEY_ DEV] = nodep->dev_handle,340 [NODES_KEY_ INDEX] = nodep->index298 [NODES_KEY_INDEX] = nodep->index, 299 [NODES_KEY_DEV] = nodep->dev_handle 341 300 }; 342 301 hash_table_insert(&nodes, key, &nodep->nh_link); … … 353 312 354 313 unsigned long key[] = { 355 [NODES_KEY_ DEV] = nodep->dev_handle,356 [NODES_KEY_ INDEX] = nodep->index314 [NODES_KEY_INDEX] = nodep->index, 315 [NODES_KEY_DEV] = nodep->dev_handle 357 316 }; 358 317 hash_table_remove(&nodes, key, 2); 359 318 360 /*361 * The nodes_remove_callback() function takes care of the actual362 * resource deallocation.363 */319 if (nodep->type == TMPFS_FILE) 320 free(nodep->data); 321 free(nodep->bp); 322 free(nodep); 364 323 return EOK; 365 324 } … … 465 424 /* Initialize TMPFS instance. */ 466 425 if (!tmpfs_instance_init(dev_handle)) { 467 free(opts);468 426 ipc_answer_0(rid, ENOMEM); 469 427 return; … … 484 442 rootp->lnkcnt); 485 443 } 486 free(opts);487 444 } 488 445 … … 490 447 { 491 448 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);505 449 } 506 450 … … 521 465 link_t *hlp; 522 466 unsigned long key[] = { 467 [NODES_KEY_INDEX] = index, 523 468 [NODES_KEY_DEV] = dev_handle, 524 [NODES_KEY_INDEX] = index525 469 }; 526 470 hlp = hash_table_find(&nodes, key); … … 595 539 link_t *hlp; 596 540 unsigned long key[] = { 597 [NODES_KEY_ DEV] = dev_handle,598 [NODES_KEY_ INDEX] = index541 [NODES_KEY_INDEX] = index, 542 [NODES_KEY_DEV] = dev_handle 599 543 }; 600 544 hlp = hash_table_find(&nodes, key); … … 659 603 link_t *hlp; 660 604 unsigned long key[] = { 661 [NODES_KEY_ DEV] = dev_handle,662 [NODES_KEY_ INDEX] = index605 [NODES_KEY_INDEX] = index, 606 [NODES_KEY_DEV] = dev_handle 663 607 }; 664 608 hlp = hash_table_find(&nodes, key); … … 702 646 link_t *hlp; 703 647 unsigned long key[] = { 704 [NODES_KEY_ DEV] = dev_handle,705 [NODES_KEY_ INDEX] = index648 [NODES_KEY_INDEX] = index, 649 [NODES_KEY_DEV] = dev_handle 706 650 }; 707 651 hlp = hash_table_find(&nodes, key);
Note:
See TracChangeset
for help on using the changeset viewer.