Changeset e503517a in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2016-09-02T14:09:40Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c1f7a315
- Parents:
- 42d08592
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r42d08592 re503517a 734 734 } 735 735 736 typedef sysarg_t (* rdwr_ipc_cb_t)(async_exch_t *, vfs_file_t *, ipc_call_t *,736 typedef int (* rdwr_ipc_cb_t)(async_exch_t *, vfs_file_t *, ipc_call_t *, 737 737 bool, void *); 738 738 739 static sysarg_t rdwr_ipc_client(async_exch_t *exch, vfs_file_t *file,739 static int rdwr_ipc_client(async_exch_t *exch, vfs_file_t *file, 740 740 ipc_call_t *answer, bool read, void *data) 741 741 { 742 size_t *bytes = (size_t *) data; 743 int rc; 744 742 745 /* 743 746 * Make a VFS_READ/VFS_WRITE request at the destination FS server … … 749 752 750 753 if (read) { 751 r eturnasync_data_read_forward_4_1(exch, VFS_OUT_READ,754 rc = async_data_read_forward_4_1(exch, VFS_OUT_READ, 752 755 file->node->service_id, file->node->index, 753 756 LOWER32(file->pos), UPPER32(file->pos), answer); 754 757 } else { 755 r eturnasync_data_write_forward_4_1(exch, VFS_OUT_WRITE,758 rc = async_data_write_forward_4_1(exch, VFS_OUT_WRITE, 756 759 file->node->service_id, file->node->index, 757 760 LOWER32(file->pos), UPPER32(file->pos), answer); 758 } 759 } 760 761 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read, 762 rdwr_ipc_cb_t ipc_cb, void *ipc_cb_data) 761 } 762 763 *bytes = IPC_GET_ARG1(*answer); 764 return rc; 765 } 766 767 static int rdwr_ipc_internal(async_exch_t *exch, vfs_file_t *file, 768 ipc_call_t *answer, bool read, void *data) 769 { 770 rdwr_io_chunk_t *chunk = (rdwr_io_chunk_t *) data; 771 772 if (exch == NULL) 773 return ENOENT; 774 775 aid_t msg = async_send_fast(exch, read ? VFS_OUT_READ : VFS_OUT_WRITE, 776 file->node->service_id, file->node->index, LOWER32(file->pos), 777 UPPER32(file->pos), answer); 778 if (msg == 0) 779 return EINVAL; 780 781 int retval = async_data_read_start(exch, chunk->buffer, chunk->size); 782 if (retval != EOK) { 783 async_forget(msg); 784 return retval; 785 } 786 787 sysarg_t rc; 788 async_wait_for(msg, &rc); 789 790 chunk->size = IPC_GET_ARG1(*answer); 791 792 return (int) rc; 793 } 794 795 static int vfs_rdwr(int fd, bool read, rdwr_ipc_cb_t ipc_cb, void *ipc_cb_data) 763 796 { 764 797 /* … … 772 805 */ 773 806 774 int fd = IPC_GET_ARG1(*request);775 776 807 /* Lookup the file structure corresponding to the file descriptor. */ 777 808 vfs_file_t *file = vfs_file_get(fd); 778 if (!file) { 779 async_answer_0(rid, ENOENT); 780 return; 781 } 809 if (!file) 810 return ENOENT; 782 811 783 812 /* … … 819 848 */ 820 849 ipc_call_t answer; 821 sysarg_t rc = ipc_cb(fs_exch, file, &answer, read, ipc_cb_data);850 int rc = ipc_cb(fs_exch, file, &answer, read, ipc_cb_data); 822 851 823 852 vfs_exchange_release(fs_exch); … … 846 875 vfs_file_put(file); 847 876 848 /* 849 * FS server's reply is the final result of the whole operation we 850 * return to the client. 851 */ 877 return rc; 878 } 879 880 static void vfs_rdwr_client(ipc_callid_t rid, ipc_call_t *request, bool read) 881 { 882 size_t bytes = 0; 883 int rc = vfs_rdwr(IPC_GET_ARG1(*request), read, rdwr_ipc_client, 884 &bytes); 852 885 async_answer_1(rid, rc, bytes); 853 886 } 854 887 888 int vfs_rdwr_internal(int fd, bool read, rdwr_io_chunk_t *chunk) 889 { 890 return vfs_rdwr(fd, read, rdwr_ipc_internal, chunk); 891 } 892 855 893 void vfs_read(ipc_callid_t rid, ipc_call_t *request) 856 894 { 857 vfs_rdwr (rid, request, true, rdwr_ipc_client, NULL);895 vfs_rdwr_client(rid, request, true); 858 896 } 859 897 860 898 void vfs_write(ipc_callid_t rid, ipc_call_t *request) 861 899 { 862 vfs_rdwr (rid, request, false, rdwr_ipc_client, NULL);900 vfs_rdwr_client(rid, request, false); 863 901 } 864 902
Note:
See TracChangeset
for help on using the changeset viewer.