Changeset 19f24fd in mainline for uspace/srv/fs/tmpfs/tmpfs_ops.c
- Timestamp:
- 2010-02-05T22:25:52Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- dafa2d04
- Parents:
- 83349b03 (diff), d42976c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/tmpfs/tmpfs_ops.c
r83349b03 r19f24fd 147 147 hash_table_t nodes; 148 148 149 #define NODES_KEY_ INDEX 0150 #define NODES_KEY_ DEV1149 #define NODES_KEY_DEV 0 150 #define NODES_KEY_INDEX 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 return (nodep->index == key[NODES_KEY_INDEX] && 163 nodep->dev_handle == key[NODES_KEY_DEV]); 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 assert((keys == 1) || (keys == 2)); 171 } 172 173 return 0; 164 174 } 165 175 166 176 static void nodes_remove_callback(link_t *item) 167 177 { 178 tmpfs_node_t *nodep = hash_table_get_instance(item, tmpfs_node_t, 179 nh_link); 180 181 while (!list_empty(&nodep->cs_head)) { 182 tmpfs_dentry_t *dentryp = list_get_instance(nodep->cs_head.next, 183 tmpfs_dentry_t, link); 184 185 assert(nodep->type == TMPFS_DIRECTORY); 186 list_remove(&dentryp->link); 187 free(dentryp); 188 } 189 190 if (nodep->data) { 191 assert(nodep->type == TMPFS_FILE); 192 free(nodep->data); 193 } 194 free(nodep->bp); 195 free(nodep); 168 196 } 169 197 … … 215 243 } 216 244 245 static void tmpfs_instance_done(dev_handle_t dev_handle) 246 { 247 unsigned long key[] = { 248 [NODES_KEY_DEV] = dev_handle 249 }; 250 /* 251 * Here we are making use of one special feature of our hash table 252 * implementation, which allows to remove more items based on a partial 253 * key match. In the following, we are going to remove all nodes 254 * matching our device handle. The nodes_remove_callback() function will 255 * take care of resource deallocation. 256 */ 257 hash_table_remove(&nodes, key, 1); 258 } 259 217 260 int tmpfs_match(fs_node_t **rfn, fs_node_t *pfn, const char *component) 218 261 { … … 237 280 { 238 281 unsigned long key[] = { 239 [NODES_KEY_ INDEX] = index,240 [NODES_KEY_ DEV] = dev_handle282 [NODES_KEY_DEV] = dev_handle, 283 [NODES_KEY_INDEX] = index 241 284 }; 242 285 link_t *lnk = hash_table_find(&nodes, key); … … 296 339 /* Insert the new node into the nodes hash table. */ 297 340 unsigned long key[] = { 298 [NODES_KEY_ INDEX] = nodep->index,299 [NODES_KEY_ DEV] = nodep->dev_handle341 [NODES_KEY_DEV] = nodep->dev_handle, 342 [NODES_KEY_INDEX] = nodep->index 300 343 }; 301 344 hash_table_insert(&nodes, key, &nodep->nh_link); … … 312 355 313 356 unsigned long key[] = { 314 [NODES_KEY_ INDEX] = nodep->index,315 [NODES_KEY_ DEV] = nodep->dev_handle357 [NODES_KEY_DEV] = nodep->dev_handle, 358 [NODES_KEY_INDEX] = nodep->index 316 359 }; 317 360 hash_table_remove(&nodes, key, 2); 318 361 319 if (nodep->type == TMPFS_FILE)320 free(nodep->data);321 free(nodep->bp);322 free(nodep);362 /* 363 * The nodes_remove_callback() function takes care of the actual 364 * resource deallocation. 365 */ 323 366 return EOK; 324 367 } … … 398 441 { 399 442 dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 443 fs_node_t *rootfn; 400 444 int rc; 401 402 /* accept the mount options */ 403 ipc_callid_t callid; 404 size_t size; 405 if (!async_data_write_receive(&callid, &size)) { 406 ipc_answer_0(callid, EINVAL); 407 ipc_answer_0(rid, EINVAL); 408 return; 409 } 410 char *opts = malloc(size + 1); 411 if (!opts) { 412 ipc_answer_0(callid, ENOMEM); 413 ipc_answer_0(rid, ENOMEM); 414 return; 415 } 416 ipcarg_t retval = async_data_write_finalize(callid, opts, size); 417 if (retval != EOK) { 418 ipc_answer_0(rid, retval); 445 446 /* Accept the mount options. */ 447 char *opts; 448 rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 449 if (rc != EOK) { 450 ipc_answer_0(rid, rc); 451 return; 452 } 453 454 /* Check if this device is not already mounted. */ 455 rc = tmpfs_root_get(&rootfn, dev_handle); 456 if ((rc == EOK) && (rootfn)) { 457 (void) tmpfs_node_put(rootfn); 419 458 free(opts); 420 return;421 }422 opts[size] = '\0';459 ipc_answer_0(rid, EEXIST); 460 return; 461 } 423 462 424 463 /* Initialize TMPFS instance. */ 425 464 if (!tmpfs_instance_init(dev_handle)) { 465 free(opts); 426 466 ipc_answer_0(rid, ENOMEM); 427 467 return; 428 468 } 429 469 430 fs_node_t *rootfn;431 470 rc = tmpfs_root_get(&rootfn, dev_handle); 432 471 assert(rc == EOK); … … 442 481 rootp->lnkcnt); 443 482 } 483 free(opts); 444 484 } 445 485 … … 447 487 { 448 488 libfs_mount(&tmpfs_libfs_ops, tmpfs_reg.fs_handle, rid, request); 489 } 490 491 void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request) 492 { 493 dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 494 495 tmpfs_instance_done(dev_handle); 496 ipc_answer_0(rid, EOK); 497 } 498 499 void tmpfs_unmount(ipc_callid_t rid, ipc_call_t *request) 500 { 501 libfs_unmount(&tmpfs_libfs_ops, rid, request); 449 502 } 450 503 … … 465 518 link_t *hlp; 466 519 unsigned long key[] = { 467 [NODES_KEY_INDEX] = index,468 520 [NODES_KEY_DEV] = dev_handle, 521 [NODES_KEY_INDEX] = index 469 522 }; 470 523 hlp = hash_table_find(&nodes, key); … … 539 592 link_t *hlp; 540 593 unsigned long key[] = { 541 [NODES_KEY_ INDEX] = index,542 [NODES_KEY_ DEV] = dev_handle594 [NODES_KEY_DEV] = dev_handle, 595 [NODES_KEY_INDEX] = index 543 596 }; 544 597 hlp = hash_table_find(&nodes, key); … … 603 656 link_t *hlp; 604 657 unsigned long key[] = { 605 [NODES_KEY_ INDEX] = index,606 [NODES_KEY_ DEV] = dev_handle658 [NODES_KEY_DEV] = dev_handle, 659 [NODES_KEY_INDEX] = index 607 660 }; 608 661 hlp = hash_table_find(&nodes, key); … … 646 699 link_t *hlp; 647 700 unsigned long key[] = { 648 [NODES_KEY_ INDEX] = index,649 [NODES_KEY_ DEV] = dev_handle701 [NODES_KEY_DEV] = dev_handle, 702 [NODES_KEY_INDEX] = index 650 703 }; 651 704 hlp = hash_table_find(&nodes, key);
Note:
See TracChangeset
for help on using the changeset viewer.