Changeset 77f0a1d in mainline for uspace/lib/fs/libfs.c
- Timestamp:
- 2018-03-22T22:54:52Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- eed4139
- Parents:
- a46e56b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fs/libfs.c
ra46e56b r77f0a1d 58 58 ((rc1) == EOK ? (rc2) : (rc1)) 59 59 60 #define answer_and_return( rid, rc) \60 #define answer_and_return(chandle, rc) \ 61 61 do { \ 62 async_answer_0(( rid), (rc)); \62 async_answer_0((chandle), (rc)); \ 63 63 return; \ 64 64 } while (0) … … 75 75 static void libfs_lookup(libfs_ops_t *, fs_handle_t, cap_call_handle_t, 76 76 ipc_call_t *); 77 static void libfs_stat(libfs_ops_t *, fs_handle_t, cap_call_handle_t, ipc_call_t *); 77 static void libfs_stat(libfs_ops_t *, fs_handle_t, cap_call_handle_t, 78 ipc_call_t *); 78 79 static void libfs_open_node(libfs_ops_t *, fs_handle_t, cap_call_handle_t, 79 80 ipc_call_t *); … … 81 82 ipc_call_t *); 82 83 83 static void vfs_out_fsprobe(cap_call_handle_t r id, ipc_call_t *req)84 static void vfs_out_fsprobe(cap_call_handle_t req_handle, ipc_call_t *req) 84 85 { 85 86 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 92 93 (size != sizeof(info))) { 93 94 async_answer_0(chandle, EIO); 94 async_answer_0(r id, EIO);95 async_answer_0(req_handle, EIO); 95 96 return; 96 97 } … … 100 101 if (rc != EOK) { 101 102 async_answer_0(chandle, EIO); 102 async_answer_0(r id, rc);103 async_answer_0(req_handle, rc); 103 104 return; 104 105 } 105 106 106 107 async_data_read_finalize(chandle, &info, sizeof(info)); 107 async_answer_0(r id, EOK);108 } 109 110 static void vfs_out_mounted(cap_call_handle_t r id, ipc_call_t *req)108 async_answer_0(req_handle, EOK); 109 } 110 111 static void vfs_out_mounted(cap_call_handle_t req_handle, ipc_call_t *req) 111 112 { 112 113 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 117 118 rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL); 118 119 if (rc != EOK) { 119 async_answer_0(r id, rc);120 async_answer_0(req_handle, rc); 120 121 return; 121 122 } … … 125 126 rc = vfs_out_ops->mounted(service_id, opts, &index, &size); 126 127 127 if (rc == EOK) 128 async_answer_3(rid, EOK, index, LOWER32(size), UPPER32(size)); 129 else 130 async_answer_0(rid, rc); 128 if (rc == EOK) { 129 async_answer_3(req_handle, EOK, index, LOWER32(size), 130 UPPER32(size)); 131 } else 132 async_answer_0(req_handle, rc); 131 133 132 134 free(opts); 133 135 } 134 136 135 static void vfs_out_unmounted(cap_call_handle_t r id, ipc_call_t *req)137 static void vfs_out_unmounted(cap_call_handle_t req_handle, ipc_call_t *req) 136 138 { 137 139 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 140 142 rc = vfs_out_ops->unmounted(service_id); 141 143 142 async_answer_0(r id, rc);143 } 144 145 static void vfs_out_link(cap_call_handle_t r id, ipc_call_t *req)146 { 147 libfs_link(libfs_ops, reg.fs_handle, r id, req);148 } 149 150 static void vfs_out_lookup(cap_call_handle_t r id, ipc_call_t *req)151 { 152 libfs_lookup(libfs_ops, reg.fs_handle, r id, req);153 } 154 155 static void vfs_out_read(cap_call_handle_t r id, ipc_call_t *req)144 async_answer_0(req_handle, rc); 145 } 146 147 static void vfs_out_link(cap_call_handle_t req_handle, ipc_call_t *req) 148 { 149 libfs_link(libfs_ops, reg.fs_handle, req_handle, req); 150 } 151 152 static void vfs_out_lookup(cap_call_handle_t req_handle, ipc_call_t *req) 153 { 154 libfs_lookup(libfs_ops, reg.fs_handle, req_handle, req); 155 } 156 157 static void vfs_out_read(cap_call_handle_t req_handle, ipc_call_t *req) 156 158 { 157 159 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 165 167 166 168 if (rc == EOK) 167 async_answer_1(r id, EOK, rbytes);169 async_answer_1(req_handle, EOK, rbytes); 168 170 else 169 async_answer_0(r id, rc);170 } 171 172 static void vfs_out_write(cap_call_handle_t r id, ipc_call_t *req)171 async_answer_0(req_handle, rc); 172 } 173 174 static void vfs_out_write(cap_call_handle_t req_handle, ipc_call_t *req) 173 175 { 174 176 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 183 185 184 186 if (rc == EOK) { 185 async_answer_3(r id, EOK, wbytes, LOWER32(nsize),187 async_answer_3(req_handle, EOK, wbytes, LOWER32(nsize), 186 188 UPPER32(nsize)); 187 189 } else 188 async_answer_0(r id, rc);189 } 190 191 static void vfs_out_truncate(cap_call_handle_t r id, ipc_call_t *req)190 async_answer_0(req_handle, rc); 191 } 192 193 static void vfs_out_truncate(cap_call_handle_t req_handle, ipc_call_t *req) 192 194 { 193 195 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 199 201 rc = vfs_out_ops->truncate(service_id, index, size); 200 202 201 async_answer_0(r id, rc);202 } 203 204 static void vfs_out_close(cap_call_handle_t r id, ipc_call_t *req)203 async_answer_0(req_handle, rc); 204 } 205 206 static void vfs_out_close(cap_call_handle_t req_handle, ipc_call_t *req) 205 207 { 206 208 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 210 212 rc = vfs_out_ops->close(service_id, index); 211 213 212 async_answer_0(r id, rc);213 } 214 215 static void vfs_out_destroy(cap_call_handle_t r id, ipc_call_t *req)214 async_answer_0(req_handle, rc); 215 } 216 217 static void vfs_out_destroy(cap_call_handle_t req_handle, ipc_call_t *req) 216 218 { 217 219 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 227 229 rc = vfs_out_ops->destroy(service_id, index); 228 230 } 229 async_answer_0(r id, rc);230 } 231 232 static void vfs_out_open_node(cap_call_handle_t r id, ipc_call_t *req)233 { 234 libfs_open_node(libfs_ops, reg.fs_handle, r id, req);235 } 236 237 static void vfs_out_stat(cap_call_handle_t r id, ipc_call_t *req)238 { 239 libfs_stat(libfs_ops, reg.fs_handle, r id, req);240 } 241 242 static void vfs_out_sync(cap_call_handle_t r id, ipc_call_t *req)231 async_answer_0(req_handle, rc); 232 } 233 234 static void vfs_out_open_node(cap_call_handle_t req_handle, ipc_call_t *req) 235 { 236 libfs_open_node(libfs_ops, reg.fs_handle, req_handle, req); 237 } 238 239 static void vfs_out_stat(cap_call_handle_t req_handle, ipc_call_t *req) 240 { 241 libfs_stat(libfs_ops, reg.fs_handle, req_handle, req); 242 } 243 244 static void vfs_out_sync(cap_call_handle_t req_handle, ipc_call_t *req) 243 245 { 244 246 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 248 250 rc = vfs_out_ops->sync(service_id, index); 249 251 250 async_answer_0(r id, rc);251 } 252 253 static void vfs_out_statfs(cap_call_handle_t r id, ipc_call_t *req)254 { 255 libfs_statfs(libfs_ops, reg.fs_handle, r id, req);256 } 257 258 static void vfs_out_is_empty(cap_call_handle_t r id, ipc_call_t *req)252 async_answer_0(req_handle, rc); 253 } 254 255 static void vfs_out_statfs(cap_call_handle_t req_handle, ipc_call_t *req) 256 { 257 libfs_statfs(libfs_ops, reg.fs_handle, req_handle, req); 258 } 259 260 static void vfs_out_is_empty(cap_call_handle_t req_handle, ipc_call_t *req) 259 261 { 260 262 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*req); … … 265 267 rc = libfs_ops->node_get(&node, service_id, index); 266 268 if (rc != EOK) 267 async_answer_0(r id, rc);269 async_answer_0(req_handle, rc); 268 270 if (node == NULL) 269 async_answer_0(r id, EINVAL);271 async_answer_0(req_handle, EINVAL); 270 272 271 273 bool children = false; … … 274 276 275 277 if (rc != EOK) 276 async_answer_0(rid, rc); 277 async_answer_0(rid, children ? ENOTEMPTY : EOK); 278 } 279 280 static void vfs_connection(cap_call_handle_t icall_handle, ipc_call_t *icall, void *arg) 278 async_answer_0(req_handle, rc); 279 async_answer_0(req_handle, children ? ENOTEMPTY : EOK); 280 } 281 282 static void vfs_connection(cap_call_handle_t icall_handle, ipc_call_t *icall, 283 void *arg) 281 284 { 282 285 if (icall_handle) { … … 492 495 /** Link a file at a path. 493 496 */ 494 void libfs_link(libfs_ops_t *ops, fs_handle_t fs_handle, cap_call_handle_t rid,495 ipc_call_t *req)497 void libfs_link(libfs_ops_t *ops, fs_handle_t fs_handle, 498 cap_call_handle_t req_handle, ipc_call_t *req) 496 499 { 497 500 service_id_t parent_sid = IPC_GET_ARG1(*req); … … 502 505 errno_t rc = receive_fname(component); 503 506 if (rc != EOK) { 504 async_answer_0(r id, rc);507 async_answer_0(req_handle, rc); 505 508 return; 506 509 } … … 509 512 rc = ops->node_get(&parent, parent_sid, parent_index); 510 513 if (parent == NULL) { 511 async_answer_0(r id, rc == EOK ? EBADF : rc);514 async_answer_0(req_handle, rc == EOK ? EBADF : rc); 512 515 return; 513 516 } … … 516 519 rc = ops->node_get(&child, parent_sid, child_index); 517 520 if (child == NULL) { 518 async_answer_0(r id, rc == EOK ? EBADF : rc);521 async_answer_0(req_handle, rc == EOK ? EBADF : rc); 519 522 ops->node_put(parent); 520 523 return; … … 524 527 ops->node_put(parent); 525 528 ops->node_put(child); 526 async_answer_0(r id, rc);529 async_answer_0(req_handle, rc); 527 530 } 528 531 … … 532 535 * as returned by the canonify() function. 533 536 * 534 * @param ops libfs operations structure with function pointers to535 * file system implementation536 * @param fs_handle File system handle of the file system where to perform537 * the lookup.538 * @param r id Request IDof the VFS_OUT_LOOKUP request.539 * @param request VFS_OUT_LOOKUP request data itself.537 * @param ops libfs operations structure with function pointers to 538 * file system implementation 539 * @param fs_handle File system handle of the file system where to perform 540 * the lookup. 541 * @param req_handle Call handle of the VFS_OUT_LOOKUP request. 542 * @param request VFS_OUT_LOOKUP request data itself. 540 543 * 541 544 */ 542 void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, cap_call_handle_t rid,543 ipc_call_t *req)545 void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, 546 cap_call_handle_t req_handle, ipc_call_t *req) 544 547 { 545 548 unsigned first = IPC_GET_ARG1(*req); … … 564 567 rc = ops->node_get(&cur, service_id, index); 565 568 if (rc != EOK) { 566 async_answer_0(r id, rc);569 async_answer_0(req_handle, rc); 567 570 goto out; 568 571 } … … 581 584 582 585 if (!ops->is_directory(cur)) { 583 async_answer_0(r id, ENOTDIR);586 async_answer_0(req_handle, ENOTDIR); 584 587 goto out; 585 588 } … … 590 593 assert(rc != ERANGE); 591 594 if (rc != EOK) { 592 async_answer_0(r id, rc);595 async_answer_0(req_handle, rc); 593 596 goto out; 594 597 } … … 604 607 rc = ops->match(&tmp, cur, component); 605 608 if (rc != EOK) { 606 async_answer_0(r id, rc);609 async_answer_0(req_handle, rc); 607 610 goto out; 608 611 } … … 612 615 rc = ops->node_put(par); 613 616 if (rc != EOK) { 614 async_answer_0(r id, rc);617 async_answer_0(req_handle, rc); 615 618 goto out; 616 619 } … … 632 635 633 636 if (cur && (lflag & L_FILE) && (ops->is_directory(cur))) { 634 async_answer_0(r id, EISDIR);637 async_answer_0(req_handle, EISDIR); 635 638 goto out; 636 639 } 637 640 638 641 if (cur && (lflag & L_DIRECTORY) && (ops->is_file(cur))) { 639 async_answer_0(r id, ENOTDIR);642 async_answer_0(req_handle, ENOTDIR); 640 643 goto out; 641 644 } … … 645 648 if (lflag & L_UNLINK) { 646 649 if (!cur) { 647 async_answer_0(r id, ENOENT);650 async_answer_0(req_handle, ENOENT); 648 651 goto out; 649 652 } 650 653 if (!par) { 651 async_answer_0(r id, EINVAL);654 async_answer_0(req_handle, EINVAL); 652 655 goto out; 653 656 } … … 656 659 if (rc == EOK) { 657 660 aoff64_t size = ops->size_get(cur); 658 async_answer_5(r id, EOK, fs_handle,661 async_answer_5(req_handle, EOK, fs_handle, 659 662 ops->index_get(cur), 660 663 (ops->is_directory(cur) << 16) | last, 661 664 LOWER32(size), UPPER32(size)); 662 665 } else { 663 async_answer_0(r id, rc);666 async_answer_0(req_handle, rc); 664 667 } 665 668 goto out; … … 670 673 if (lflag & L_CREATE) { 671 674 if (cur && (lflag & L_EXCLUSIVE)) { 672 async_answer_0(r id, EEXIST);675 async_answer_0(req_handle, EEXIST); 673 676 goto out; 674 677 } … … 678 681 lflag & (L_FILE | L_DIRECTORY)); 679 682 if (rc != EOK) { 680 async_answer_0(r id, rc);683 async_answer_0(req_handle, rc); 681 684 goto out; 682 685 } 683 686 if (!cur) { 684 async_answer_0(r id, ENOSPC);687 async_answer_0(req_handle, ENOSPC); 685 688 goto out; 686 689 } … … 690 693 (void) ops->destroy(cur); 691 694 cur = NULL; 692 async_answer_0(r id, rc);695 async_answer_0(req_handle, rc); 693 696 goto out; 694 697 } … … 699 702 out1: 700 703 if (!cur) { 701 async_answer_5(r id, EOK, fs_handle, ops->index_get(par),704 async_answer_5(req_handle, EOK, fs_handle, ops->index_get(par), 702 705 (ops->is_directory(par) << 16) | last_next, 703 706 LOWER32(ops->size_get(par)), UPPER32(ops->size_get(par))); … … 705 708 } 706 709 707 async_answer_5(r id, EOK, fs_handle, ops->index_get(cur),710 async_answer_5(req_handle, EOK, fs_handle, ops->index_get(cur), 708 711 (ops->is_directory(cur) << 16) | last, LOWER32(ops->size_get(cur)), 709 712 UPPER32(ops->size_get(cur))); … … 720 723 } 721 724 722 void libfs_stat(libfs_ops_t *ops, fs_handle_t fs_handle, cap_call_handle_t rid,723 ipc_call_t *request)725 void libfs_stat(libfs_ops_t *ops, fs_handle_t fs_handle, 726 cap_call_handle_t req_handle, ipc_call_t *request) 724 727 { 725 728 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); … … 728 731 fs_node_t *fn; 729 732 errno_t rc = ops->node_get(&fn, service_id, index); 730 on_error(rc, answer_and_return(r id, rc));733 on_error(rc, answer_and_return(req_handle, rc)); 731 734 732 735 cap_call_handle_t chandle; … … 736 739 ops->node_put(fn); 737 740 async_answer_0(chandle, EINVAL); 738 async_answer_0(r id, EINVAL);741 async_answer_0(req_handle, EINVAL); 739 742 return; 740 743 } … … 756 759 757 760 async_data_read_finalize(chandle, &stat, sizeof(vfs_stat_t)); 758 async_answer_0(r id, EOK);759 } 760 761 void libfs_statfs(libfs_ops_t *ops, fs_handle_t fs_handle, cap_call_handle_t rid,762 ipc_call_t *request)761 async_answer_0(req_handle, EOK); 762 } 763 764 void libfs_statfs(libfs_ops_t *ops, fs_handle_t fs_handle, 765 cap_call_handle_t req_handle, ipc_call_t *request) 763 766 { 764 767 service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request); … … 767 770 fs_node_t *fn; 768 771 errno_t rc = ops->node_get(&fn, service_id, index); 769 on_error(rc, answer_and_return(r id, rc));772 on_error(rc, answer_and_return(req_handle, rc)); 770 773 771 774 cap_call_handle_t chandle; … … 801 804 ops->node_put(fn); 802 805 async_data_read_finalize(chandle, &st, sizeof(vfs_statfs_t)); 803 async_answer_0(r id, EOK);806 async_answer_0(req_handle, EOK); 804 807 return; 805 808 … … 807 810 ops->node_put(fn); 808 811 async_answer_0(chandle, EINVAL); 809 async_answer_0(r id, EINVAL);812 async_answer_0(req_handle, EINVAL); 810 813 } 811 814 … … 813 816 /** Open VFS triplet. 814 817 * 815 * @param ops libfs operations structure with function pointers to816 * file system implementation817 * @param r id Request IDof the VFS_OUT_OPEN_NODE request.818 * @param request VFS_OUT_OPEN_NODE request data itself.818 * @param ops libfs operations structure with function pointers to 819 * file system implementation 820 * @param req_handle Call handle of the VFS_OUT_OPEN_NODE request. 821 * @param request VFS_OUT_OPEN_NODE request data itself. 819 822 * 820 823 */ 821 void libfs_open_node(libfs_ops_t *ops, fs_handle_t fs_handle, cap_call_handle_t rid,822 ipc_call_t *request)824 void libfs_open_node(libfs_ops_t *ops, fs_handle_t fs_handle, 825 cap_call_handle_t req_handle, ipc_call_t *request) 823 826 { 824 827 service_id_t service_id = IPC_GET_ARG1(*request); … … 827 830 fs_node_t *fn; 828 831 errno_t rc = ops->node_get(&fn, service_id, index); 829 on_error(rc, answer_and_return(r id, rc));832 on_error(rc, answer_and_return(req_handle, rc)); 830 833 831 834 if (fn == NULL) { 832 async_answer_0(r id, ENOENT);835 async_answer_0(req_handle, ENOENT); 833 836 return; 834 837 } … … 836 839 rc = ops->node_open(fn); 837 840 aoff64_t size = ops->size_get(fn); 838 async_answer_4(r id, rc, LOWER32(size), UPPER32(size),841 async_answer_4(req_handle, rc, LOWER32(size), UPPER32(size), 839 842 ops->lnkcnt_get(fn), 840 843 (ops->is_file(fn) ? L_FILE : 0) |
Note:
See TracChangeset
for help on using the changeset viewer.