Changes in uspace/srv/fs/locfs/locfs_ops.c [086290d:15f3c3f] in mainline
- File:
-
- 1 edited
-
uspace/srv/fs/locfs/locfs_ops.c (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/locfs/locfs_ops.c
r086290d r15f3c3f 404 404 } 405 405 406 static char locfs_plb_get_char(unsigned pos) 407 { 408 return locfs_reg.plb_ro[pos % PLB_SIZE]; 409 } 410 406 411 static bool locfs_is_directory(fs_node_t *fn) 407 412 { … … 418 423 } 419 424 420 static service_id_t locfs_ service_get(fs_node_t *fn)425 static service_id_t locfs_device_get(fs_node_t *fn) 421 426 { 422 427 locfs_node_t *node = (locfs_node_t *) fn->data; … … 443 448 .size_get = locfs_size_get, 444 449 .lnkcnt_get = locfs_lnkcnt_get, 450 .plb_get_char = locfs_plb_get_char, 445 451 .is_directory = locfs_is_directory, 446 452 .is_file = locfs_is_file, 447 . service_get = locfs_service_get453 .device_get = locfs_device_get 448 454 }; 449 455 … … 457 463 } 458 464 459 static int locfs_mounted(service_id_t service_id, const char *opts, 460 fs_index_t *index, aoff64_t *size, unsigned *lnkcnt) 461 { 462 *index = 0; 463 *size = 0; 464 *lnkcnt = 0; 465 return EOK; 466 } 467 468 static int locfs_unmounted(service_id_t service_id) 469 { 470 return ENOTSUP; 471 } 472 473 static int 474 locfs_read(service_id_t service_id, fs_index_t index, aoff64_t pos, 475 size_t *rbytes) 476 { 465 void locfs_mounted(ipc_callid_t rid, ipc_call_t *request) 466 { 467 char *opts; 468 469 /* Accept the mount options */ 470 sysarg_t retval = async_data_write_accept((void **) &opts, true, 0, 0, 471 0, NULL); 472 if (retval != EOK) { 473 async_answer_0(rid, retval); 474 return; 475 } 476 477 free(opts); 478 async_answer_3(rid, EOK, 0, 0, 0); 479 } 480 481 void locfs_mount(ipc_callid_t rid, ipc_call_t *request) 482 { 483 libfs_mount(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request); 484 } 485 486 void locfs_unmounted(ipc_callid_t rid, ipc_call_t *request) 487 { 488 async_answer_0(rid, ENOTSUP); 489 } 490 491 void locfs_unmount(ipc_callid_t rid, ipc_call_t *request) 492 { 493 libfs_unmount(&locfs_libfs_ops, rid, request); 494 } 495 496 void locfs_lookup(ipc_callid_t rid, ipc_call_t *request) 497 { 498 libfs_lookup(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request); 499 } 500 501 void locfs_open_node(ipc_callid_t rid, ipc_call_t *request) 502 { 503 libfs_open_node(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request); 504 } 505 506 void locfs_stat(ipc_callid_t rid, ipc_call_t *request) 507 { 508 libfs_stat(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request); 509 } 510 511 void locfs_read(ipc_callid_t rid, ipc_call_t *request) 512 { 513 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 514 aoff64_t pos = 515 (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request)); 516 477 517 if (index == 0) { 478 518 ipc_callid_t callid; … … 480 520 if (!async_data_read_receive(&callid, &size)) { 481 521 async_answer_0(callid, EINVAL); 482 return EINVAL; 522 async_answer_0(rid, EINVAL); 523 return; 483 524 } 484 525 … … 500 541 async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1); 501 542 free(desc); 502 *rbytes = 1;503 return EOK;543 async_answer_1(rid, EOK, 1); 544 return; 504 545 } 505 546 … … 515 556 async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1); 516 557 free(desc); 517 *rbytes = 1;518 return EOK;558 async_answer_1(rid, EOK, 1); 559 return; 519 560 } 520 561 … … 523 564 524 565 async_answer_0(callid, ENOENT); 525 return ENOENT; 566 async_answer_1(rid, ENOENT, 0); 567 return; 526 568 } 527 569 … … 534 576 if (!async_data_read_receive(&callid, &size)) { 535 577 async_answer_0(callid, EINVAL); 536 return EINVAL; 578 async_answer_0(rid, EINVAL); 579 return; 537 580 } 538 581 … … 543 586 async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1); 544 587 free(desc); 545 *rbytes = 1;546 return EOK;588 async_answer_1(rid, EOK, 1); 589 return; 547 590 } 548 591 549 592 free(desc); 550 593 async_answer_0(callid, ENOENT); 551 return ENOENT; 594 async_answer_1(rid, ENOENT, 0); 595 return; 552 596 } 553 597 … … 563 607 if (lnk == NULL) { 564 608 fibril_mutex_unlock(&services_mutex); 565 return ENOENT; 609 async_answer_0(rid, ENOENT); 610 return; 566 611 } 567 612 … … 573 618 fibril_mutex_unlock(&services_mutex); 574 619 async_answer_0(callid, EINVAL); 575 return EINVAL; 620 async_answer_0(rid, EINVAL); 621 return; 576 622 } 577 623 … … 580 626 581 627 ipc_call_t answer; 582 aid_t msg = async_send_4(exch, VFS_OUT_READ, service_id, 583 index, LOWER32(pos), UPPER32(pos), &answer); 628 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 629 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 630 IPC_GET_ARG3(*request), &answer); 584 631 585 632 /* Forward the IPC_M_DATA_READ request to the driver */ … … 593 640 sysarg_t rc; 594 641 async_wait_for(msg, &rc); 595 596 /* Do not propagate EHANGUP back to VFS. */ 597 if ((int) rc == EHANGUP) 598 rc = ENOTSUP; 599 600 *rbytes = IPC_GET_ARG1(answer); 601 return rc; 602 } 603 604 return ENOENT; 605 } 606 607 static int 608 locfs_write(service_id_t service_id, fs_index_t index, aoff64_t pos, 609 size_t *wbytes, aoff64_t *nsize) 610 { 611 if (index == 0) 612 return ENOTSUP; 642 size_t bytes = IPC_GET_ARG1(answer); 643 644 /* Driver reply is the final result of the whole operation */ 645 async_answer_1(rid, rc, bytes); 646 return; 647 } 648 649 async_answer_0(rid, ENOENT); 650 } 651 652 void locfs_write(ipc_callid_t rid, ipc_call_t *request) 653 { 654 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 655 if (index == 0) { 656 async_answer_0(rid, ENOTSUP); 657 return; 658 } 613 659 614 660 loc_object_type_t type = loc_id_probe(index); … … 616 662 if (type == LOC_OBJECT_NAMESPACE) { 617 663 /* Namespace directory */ 618 return ENOTSUP; 664 async_answer_0(rid, ENOTSUP); 665 return; 619 666 } 620 667 … … 629 676 if (lnk == NULL) { 630 677 fibril_mutex_unlock(&services_mutex); 631 return ENOENT; 678 async_answer_0(rid, ENOENT); 679 return; 632 680 } 633 681 … … 639 687 fibril_mutex_unlock(&services_mutex); 640 688 async_answer_0(callid, EINVAL); 641 return EINVAL; 689 async_answer_0(rid, EINVAL); 690 return; 642 691 } 643 692 … … 646 695 647 696 ipc_call_t answer; 648 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, service_id, 649 index, LOWER32(pos), UPPER32(pos), &answer); 697 aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request), 698 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), 699 IPC_GET_ARG3(*request), &answer); 650 700 651 701 /* Forward the IPC_M_DATA_WRITE request to the driver */ … … 659 709 sysarg_t rc; 660 710 async_wait_for(msg, &rc); 661 662 /* Do not propagate EHANGUP back to VFS. */663 if ((int) rc == EHANGUP)664 rc = ENOTSUP;665 666 *wbytes = IPC_GET_ARG1(answer);667 *nsize = 0;668 return rc;669 }670 671 return ENOENT; 672 } 673 674 static int 675 locfs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size) 676 { 677 return ENOTSUP; 678 } 679 680 static int locfs_close(service_id_t service_id, fs_index_t index) 681 { 682 if (index == 0)683 return EOK;711 size_t bytes = IPC_GET_ARG1(answer); 712 713 /* Driver reply is the final result of the whole operation */ 714 async_answer_1(rid, rc, bytes); 715 return; 716 } 717 718 async_answer_0(rid, ENOENT); 719 } 720 721 void locfs_truncate(ipc_callid_t rid, ipc_call_t *request) 722 { 723 async_answer_0(rid, ENOTSUP); 724 } 725 726 void locfs_close(ipc_callid_t rid, ipc_call_t *request) 727 { 728 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 729 730 if (index == 0) { 731 async_answer_0(rid, EOK); 732 return; 733 } 684 734 685 735 loc_object_type_t type = loc_id_probe(index); … … 687 737 if (type == LOC_OBJECT_NAMESPACE) { 688 738 /* Namespace directory */ 689 return EOK; 739 async_answer_0(rid, EOK); 740 return; 690 741 } 691 742 … … 699 750 if (lnk == NULL) { 700 751 fibril_mutex_unlock(&services_mutex); 701 return ENOENT; 752 async_answer_0(rid, ENOENT); 753 return; 702 754 } 703 755 … … 713 765 fibril_mutex_unlock(&services_mutex); 714 766 715 return EOK; 716 } 717 718 return ENOENT; 719 } 720 721 static int locfs_sync(service_id_t service_id, fs_index_t index) 722 { 723 if (index == 0) 724 return EOK; 767 async_answer_0(rid, EOK); 768 return; 769 } 770 771 async_answer_0(rid, ENOENT); 772 } 773 774 void locfs_sync(ipc_callid_t rid, ipc_call_t *request) 775 { 776 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 777 778 if (index == 0) { 779 async_answer_0(rid, EOK); 780 return; 781 } 725 782 726 783 loc_object_type_t type = loc_id_probe(index); … … 728 785 if (type == LOC_OBJECT_NAMESPACE) { 729 786 /* Namespace directory */ 730 return EOK; 787 async_answer_0(rid, EOK); 788 return; 731 789 } 732 790 … … 740 798 if (lnk == NULL) { 741 799 fibril_mutex_unlock(&services_mutex); 742 return ENOENT; 800 async_answer_0(rid, ENOENT); 801 return; 743 802 } 744 803 … … 750 809 751 810 ipc_call_t answer; 752 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, service_id,753 index, &answer);811 aid_t msg = async_send_2(exch, IPC_GET_IMETHOD(*request), 812 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), &answer); 754 813 755 814 async_exchange_end(exch); … … 761 820 async_wait_for(msg, &rc); 762 821 763 return rc; 764 } 765 766 return ENOENT; 767 } 768 769 static int locfs_destroy(service_id_t service_id, fs_index_t index) 770 { 771 return ENOTSUP; 772 } 773 774 vfs_out_ops_t locfs_ops = { 775 .mounted = locfs_mounted, 776 .unmounted = locfs_unmounted, 777 .read = locfs_read, 778 .write = locfs_write, 779 .truncate = locfs_truncate, 780 .close = locfs_close, 781 .destroy = locfs_destroy, 782 .sync = locfs_sync, 783 }; 822 /* Driver reply is the final result of the whole operation */ 823 async_answer_0(rid, rc); 824 return; 825 } 826 827 async_answer_0(rid, ENOENT); 828 } 829 830 void locfs_destroy(ipc_callid_t rid, ipc_call_t *request) 831 { 832 async_answer_0(rid, ENOTSUP); 833 } 784 834 785 835 /**
Note:
See TracChangeset
for help on using the changeset viewer.
