Changes in uspace/srv/fs/locfs/locfs_ops.c [b33870b:15f3c3f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/locfs/locfs_ops.c
rb33870b 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 *rbytes = IPC_GET_ARG1(answer); 597 return rc; 598 } 599 600 return ENOENT; 601 } 602 603 static int 604 locfs_write(service_id_t service_id, fs_index_t index, aoff64_t pos, 605 size_t *wbytes, aoff64_t *nsize) 606 { 607 if (index == 0) 608 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 } 609 659 610 660 loc_object_type_t type = loc_id_probe(index); … … 612 662 if (type == LOC_OBJECT_NAMESPACE) { 613 663 /* Namespace directory */ 614 return ENOTSUP; 664 async_answer_0(rid, ENOTSUP); 665 return; 615 666 } 616 667 … … 625 676 if (lnk == NULL) { 626 677 fibril_mutex_unlock(&services_mutex); 627 return ENOENT; 678 async_answer_0(rid, ENOENT); 679 return; 628 680 } 629 681 … … 635 687 fibril_mutex_unlock(&services_mutex); 636 688 async_answer_0(callid, EINVAL); 637 return EINVAL; 689 async_answer_0(rid, EINVAL); 690 return; 638 691 } 639 692 … … 642 695 643 696 ipc_call_t answer; 644 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, service_id, 645 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); 646 700 647 701 /* Forward the IPC_M_DATA_WRITE request to the driver */ … … 655 709 sysarg_t rc; 656 710 async_wait_for(msg, &rc); 657 658 *wbytes = IPC_GET_ARG1(answer); 659 *nsize = 0; 660 return rc; 661 } 662 663 return ENOENT; 664 } 665 666 static int 667 locfs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size) 668 { 669 return ENOTSUP; 670 } 671 672 static int locfs_close(service_id_t service_id, fs_index_t index) 673 { 674 if (index == 0) 675 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 } 676 734 677 735 loc_object_type_t type = loc_id_probe(index); … … 679 737 if (type == LOC_OBJECT_NAMESPACE) { 680 738 /* Namespace directory */ 681 return EOK; 739 async_answer_0(rid, EOK); 740 return; 682 741 } 683 742 … … 691 750 if (lnk == NULL) { 692 751 fibril_mutex_unlock(&services_mutex); 693 return ENOENT; 752 async_answer_0(rid, ENOENT); 753 return; 694 754 } 695 755 … … 705 765 fibril_mutex_unlock(&services_mutex); 706 766 707 return EOK; 708 } 709 710 return ENOENT; 711 } 712 713 static int locfs_sync(service_id_t service_id, fs_index_t index) 714 { 715 if (index == 0) 716 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 } 717 782 718 783 loc_object_type_t type = loc_id_probe(index); … … 720 785 if (type == LOC_OBJECT_NAMESPACE) { 721 786 /* Namespace directory */ 722 return EOK; 787 async_answer_0(rid, EOK); 788 return; 723 789 } 724 790 … … 732 798 if (lnk == NULL) { 733 799 fibril_mutex_unlock(&services_mutex); 734 return ENOENT; 800 async_answer_0(rid, ENOENT); 801 return; 735 802 } 736 803 … … 742 809 743 810 ipc_call_t answer; 744 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, service_id,745 index, &answer);811 aid_t msg = async_send_2(exch, IPC_GET_IMETHOD(*request), 812 IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), &answer); 746 813 747 814 async_exchange_end(exch); … … 753 820 async_wait_for(msg, &rc); 754 821 755 return rc; 756 } 757 758 return ENOENT; 759 } 760 761 static int locfs_destroy(service_id_t service_id, fs_index_t index) 762 { 763 return ENOTSUP; 764 } 765 766 vfs_out_ops_t locfs_ops = { 767 .mounted = locfs_mounted, 768 .unmounted = locfs_unmounted, 769 .read = locfs_read, 770 .write = locfs_write, 771 .truncate = locfs_truncate, 772 .close = locfs_close, 773 .destroy = locfs_destroy, 774 .sync = locfs_sync, 775 }; 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 } 776 834 777 835 /**
Note:
See TracChangeset
for help on using the changeset viewer.