Changes in uspace/srv/fs/tmpfs/tmpfs_ops.c [4cac2d69:991f645] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/tmpfs/tmpfs_ops.c
r4cac2d69 r991f645 29 29 /** @addtogroup fs 30 30 * @{ 31 */ 31 */ 32 32 33 33 /** … … 40 40 #include "../../vfs/vfs.h" 41 41 #include <ipc/ipc.h> 42 #include <macros.h> 43 #include <stdint.h> 42 44 #include <async.h> 43 45 #include <errno.h> 44 46 #include <atomic.h> 45 47 #include <stdlib.h> 46 #include <str ing.h>48 #include <str.h> 47 49 #include <stdio.h> 48 50 #include <assert.h> … … 68 70 /* Forward declarations of static functions. */ 69 71 static int tmpfs_match(fs_node_t **, fs_node_t *, const char *); 70 static int tmpfs_node_get(fs_node_t **, dev _handle_t, fs_index_t);72 static int tmpfs_node_get(fs_node_t **, devmap_handle_t, fs_index_t); 71 73 static int tmpfs_node_open(fs_node_t *); 72 74 static int tmpfs_node_put(fs_node_t *); 73 static int tmpfs_create_node(fs_node_t **, dev _handle_t, int);75 static int tmpfs_create_node(fs_node_t **, devmap_handle_t, int); 74 76 static int tmpfs_destroy_node(fs_node_t *); 75 77 static int tmpfs_link_node(fs_node_t *, fs_node_t *, const char *); … … 77 79 78 80 /* Implementation of helper functions. */ 79 static int tmpfs_root_get(fs_node_t **rfn, dev _handle_t dev_handle)80 { 81 return tmpfs_node_get(rfn, dev _handle, TMPFS_SOME_ROOT);81 static int tmpfs_root_get(fs_node_t **rfn, devmap_handle_t devmap_handle) 82 { 83 return tmpfs_node_get(rfn, devmap_handle, TMPFS_SOME_ROOT); 82 84 } 83 85 … … 93 95 } 94 96 95 static size_t tmpfs_size_get(fs_node_t *fn)97 static aoff64_t tmpfs_size_get(fs_node_t *fn) 96 98 { 97 99 return TMPFS_NODE(fn)->size; … … 118 120 } 119 121 120 static dev _handle_t tmpfs_device_get(fs_node_t *fn)122 static devmap_handle_t tmpfs_device_get(fs_node_t *fn) 121 123 { 122 124 return 0; … … 163 165 switch (keys) { 164 166 case 1: 165 return (nodep->dev _handle == key[NODES_KEY_DEV]);167 return (nodep->devmap_handle == key[NODES_KEY_DEV]); 166 168 case 2: 167 return ((nodep->dev _handle == key[NODES_KEY_DEV]) &&169 return ((nodep->devmap_handle == key[NODES_KEY_DEV]) && 168 170 (nodep->index == key[NODES_KEY_INDEX])); 169 171 default: 170 abort(); 171 } 172 assert((keys == 1) || (keys == 2)); 173 } 174 175 return 0; 172 176 } 173 177 … … 205 209 nodep->bp = NULL; 206 210 nodep->index = 0; 207 nodep->dev _handle = 0;211 nodep->devmap_handle = 0; 208 212 nodep->type = TMPFS_NONE; 209 213 nodep->lnkcnt = 0; … … 229 233 } 230 234 231 static bool tmpfs_instance_init(dev _handle_t dev_handle)235 static bool tmpfs_instance_init(devmap_handle_t devmap_handle) 232 236 { 233 237 fs_node_t *rfn; 234 238 int rc; 235 239 236 rc = tmpfs_create_node(&rfn, dev _handle, L_DIRECTORY);240 rc = tmpfs_create_node(&rfn, devmap_handle, L_DIRECTORY); 237 241 if (rc != EOK || !rfn) 238 242 return false; … … 241 245 } 242 246 243 static void tmpfs_instance_done(dev _handle_t dev_handle)247 static void tmpfs_instance_done(devmap_handle_t devmap_handle) 244 248 { 245 249 unsigned long key[] = { 246 [NODES_KEY_DEV] = dev _handle250 [NODES_KEY_DEV] = devmap_handle 247 251 }; 248 252 /* … … 275 279 } 276 280 277 int tmpfs_node_get(fs_node_t **rfn, dev _handle_t dev_handle, fs_index_t index)281 int tmpfs_node_get(fs_node_t **rfn, devmap_handle_t devmap_handle, fs_index_t index) 278 282 { 279 283 unsigned long key[] = { 280 [NODES_KEY_DEV] = dev _handle,284 [NODES_KEY_DEV] = devmap_handle, 281 285 [NODES_KEY_INDEX] = index 282 286 }; … … 304 308 } 305 309 306 int tmpfs_create_node(fs_node_t **rfn, dev _handle_t dev_handle, int lflag)310 int tmpfs_create_node(fs_node_t **rfn, devmap_handle_t devmap_handle, int lflag) 307 311 { 308 312 fs_node_t *rootfn; … … 323 327 nodep->bp->data = nodep; /* link the FS and TMPFS nodes */ 324 328 325 rc = tmpfs_root_get(&rootfn, dev _handle);329 rc = tmpfs_root_get(&rootfn, devmap_handle); 326 330 assert(rc == EOK); 327 331 if (!rootfn) … … 329 333 else 330 334 nodep->index = tmpfs_next_index++; 331 nodep->dev _handle = dev_handle;335 nodep->devmap_handle = devmap_handle; 332 336 if (lflag & L_DIRECTORY) 333 337 nodep->type = TMPFS_DIRECTORY; … … 337 341 /* Insert the new node into the nodes hash table. */ 338 342 unsigned long key[] = { 339 [NODES_KEY_DEV] = nodep->dev _handle,343 [NODES_KEY_DEV] = nodep->devmap_handle, 340 344 [NODES_KEY_INDEX] = nodep->index 341 345 }; … … 353 357 354 358 unsigned long key[] = { 355 [NODES_KEY_DEV] = nodep->dev _handle,359 [NODES_KEY_DEV] = nodep->devmap_handle, 356 360 [NODES_KEY_INDEX] = nodep->index 357 361 }; … … 438 442 void tmpfs_mounted(ipc_callid_t rid, ipc_call_t *request) 439 443 { 440 dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 441 442 /* Accept the mount options */ 444 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 445 fs_node_t *rootfn; 446 int rc; 447 448 /* Accept the mount options. */ 443 449 char *opts; 444 int rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 445 450 rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 446 451 if (rc != EOK) { 447 452 ipc_answer_0(rid, rc); … … 449 454 } 450 455 456 /* Check if this device is not already mounted. */ 457 rc = tmpfs_root_get(&rootfn, devmap_handle); 458 if ((rc == EOK) && (rootfn)) { 459 (void) tmpfs_node_put(rootfn); 460 free(opts); 461 ipc_answer_0(rid, EEXIST); 462 return; 463 } 464 451 465 /* Initialize TMPFS instance. */ 452 if (!tmpfs_instance_init(dev _handle)) {466 if (!tmpfs_instance_init(devmap_handle)) { 453 467 free(opts); 454 468 ipc_answer_0(rid, ENOMEM); … … 456 470 } 457 471 458 fs_node_t *rootfn; 459 rc = tmpfs_root_get(&rootfn, dev_handle); 472 rc = tmpfs_root_get(&rootfn, devmap_handle); 460 473 assert(rc == EOK); 461 474 tmpfs_node_t *rootp = TMPFS_NODE(rootfn); 462 475 if (str_cmp(opts, "restore") == 0) { 463 if (tmpfs_restore(dev _handle))476 if (tmpfs_restore(devmap_handle)) 464 477 ipc_answer_3(rid, EOK, rootp->index, rootp->size, 465 478 rootp->lnkcnt); … … 480 493 void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request) 481 494 { 482 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);483 484 tmpfs_instance_done(dev _handle);495 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 496 497 tmpfs_instance_done(devmap_handle); 485 498 ipc_answer_0(rid, EOK); 486 499 } … … 498 511 void tmpfs_read(ipc_callid_t rid, ipc_call_t *request) 499 512 { 500 dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); 501 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 502 off_t pos = (off_t)IPC_GET_ARG3(*request); 503 513 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 514 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 515 aoff64_t pos = 516 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 517 504 518 /* 505 519 * Lookup the respective TMPFS node. … … 507 521 link_t *hlp; 508 522 unsigned long key[] = { 509 [NODES_KEY_DEV] = dev _handle,523 [NODES_KEY_DEV] = devmap_handle, 510 524 [NODES_KEY_INDEX] = index 511 525 }; … … 517 531 tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t, 518 532 nh_link); 519 533 520 534 /* 521 535 * Receive the read request. … … 524 538 size_t size; 525 539 if (!async_data_read_receive(&callid, &size)) { 526 ipc_answer_0(callid, EINVAL); 540 ipc_answer_0(callid, EINVAL); 527 541 ipc_answer_0(rid, EINVAL); 528 542 return; … … 531 545 size_t bytes; 532 546 if (nodep->type == TMPFS_FILE) { 533 bytes = m ax(0, min(nodep->size - pos, size));547 bytes = min(nodep->size - pos, size); 534 548 (void) async_data_read_finalize(callid, nodep->data + pos, 535 549 bytes); … … 537 551 tmpfs_dentry_t *dentryp; 538 552 link_t *lnk; 539 int i;553 aoff64_t i; 540 554 541 555 assert(nodep->type == TMPFS_DIRECTORY); … … 547 561 */ 548 562 for (i = 0, lnk = nodep->cs_head.next; 549 i < pos && lnk != &nodep->cs_head;563 (i < pos) && (lnk != &nodep->cs_head); 550 564 i++, lnk = lnk->next) 551 565 ; … … 572 586 void tmpfs_write(ipc_callid_t rid, ipc_call_t *request) 573 587 { 574 dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); 575 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 576 off_t pos = (off_t)IPC_GET_ARG3(*request); 577 588 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 589 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 590 aoff64_t pos = 591 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 592 578 593 /* 579 594 * Lookup the respective TMPFS node. … … 581 596 link_t *hlp; 582 597 unsigned long key[] = { 583 [NODES_KEY_DEV] = dev _handle,598 [NODES_KEY_DEV] = devmap_handle, 584 599 [NODES_KEY_INDEX] = index 585 600 }; … … 636 651 void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request) 637 652 { 638 dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); 653 devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 654 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 655 aoff64_t size = 656 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 657 658 /* 659 * Lookup the respective TMPFS node. 660 */ 661 unsigned long key[] = { 662 [NODES_KEY_DEV] = devmap_handle, 663 [NODES_KEY_INDEX] = index 664 }; 665 link_t *hlp = hash_table_find(&nodes, key); 666 if (!hlp) { 667 ipc_answer_0(rid, ENOENT); 668 return; 669 } 670 tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t, 671 nh_link); 672 673 if (size == nodep->size) { 674 ipc_answer_0(rid, EOK); 675 return; 676 } 677 678 if (size > SIZE_MAX) { 679 ipc_answer_0(rid, ENOMEM); 680 return; 681 } 682 683 void *newdata = realloc(nodep->data, size); 684 if (!newdata) { 685 ipc_answer_0(rid, ENOMEM); 686 return; 687 } 688 689 if (size > nodep->size) { 690 size_t delta = size - nodep->size; 691 memset(newdata + nodep->size, 0, delta); 692 } 693 694 nodep->size = size; 695 nodep->data = newdata; 696 ipc_answer_0(rid, EOK); 697 } 698 699 void tmpfs_close(ipc_callid_t rid, ipc_call_t *request) 700 { 701 ipc_answer_0(rid, EOK); 702 } 703 704 void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request) 705 { 706 devmap_handle_t devmap_handle = (devmap_handle_t)IPC_GET_ARG1(*request); 639 707 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); 640 size_t size = (off_t)IPC_GET_ARG3(*request); 641 642 /* 643 * Lookup the respective TMPFS node. 644 */ 708 int rc; 709 645 710 link_t *hlp; 646 711 unsigned long key[] = { 647 [NODES_KEY_DEV] = dev _handle,712 [NODES_KEY_DEV] = devmap_handle, 648 713 [NODES_KEY_INDEX] = index 649 714 }; … … 655 720 tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t, 656 721 nh_link); 657 658 if (size == nodep->size) {659 ipc_answer_0(rid, EOK);660 return;661 }662 663 void *newdata = realloc(nodep->data, size);664 if (!newdata) {665 ipc_answer_0(rid, ENOMEM);666 return;667 }668 if (size > nodep->size) {669 size_t delta = size - nodep->size;670 memset(newdata + nodep->size, 0, delta);671 }672 nodep->size = size;673 nodep->data = newdata;674 ipc_answer_0(rid, EOK);675 }676 677 void tmpfs_close(ipc_callid_t rid, ipc_call_t *request)678 {679 ipc_answer_0(rid, EOK);680 }681 682 void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request)683 {684 dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);685 fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);686 int rc;687 688 link_t *hlp;689 unsigned long key[] = {690 [NODES_KEY_DEV] = dev_handle,691 [NODES_KEY_INDEX] = index692 };693 hlp = hash_table_find(&nodes, key);694 if (!hlp) {695 ipc_answer_0(rid, ENOENT);696 return;697 }698 tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t,699 nh_link);700 722 rc = tmpfs_destroy_node(FS_NODE(nodep)); 701 723 ipc_answer_0(rid, rc); … … 714 736 void tmpfs_sync(ipc_callid_t rid, ipc_call_t *request) 715 737 { 716 /* Dummy implementation */ 738 /* 739 * TMPFS keeps its data structures always consistent, 740 * thus the sync operation is a no-op. 741 */ 717 742 ipc_answer_0(rid, EOK); 718 743 }
Note:
See TracChangeset
for help on using the changeset viewer.