Rev 4539 | Rev 4555 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4539 | Rev 4551 | ||
|---|---|---|---|
| Line 141... | Line 141... | ||
| 141 | (ipcarg_t) dev_handle, &answer); |
141 | (ipcarg_t) dev_handle, &answer); |
| 142 | /* send the mount options */ |
142 | /* send the mount options */ |
| 143 | rc = ipc_data_write_start(phone, (void *)opts, |
143 | rc = ipc_data_write_start(phone, (void *)opts, |
| 144 | str_size(opts)); |
144 | str_size(opts)); |
| 145 | if (rc != EOK) { |
145 | if (rc != EOK) { |
| 146 | vfs_release_phone(phone); |
- | |
| 147 | async_wait_for(msg, NULL); |
146 | async_wait_for(msg, NULL); |
| - | 147 | vfs_release_phone(phone); |
|
| 148 | fibril_rwlock_write_unlock(&namespace_rwlock); |
148 | fibril_rwlock_write_unlock(&namespace_rwlock); |
| 149 | ipc_answer_0(rid, rc); |
149 | ipc_answer_0(rid, rc); |
| 150 | return; |
150 | return; |
| 151 | } |
151 | } |
| 152 | vfs_release_phone(phone); |
- | |
| 153 | async_wait_for(msg, &rc); |
152 | async_wait_for(msg, &rc); |
| - | 153 | vfs_release_phone(phone); |
|
| 154 | 154 | ||
| 155 | if (rc != EOK) { |
155 | if (rc != EOK) { |
| 156 | fibril_rwlock_write_unlock(&namespace_rwlock); |
156 | fibril_rwlock_write_unlock(&namespace_rwlock); |
| 157 | ipc_answer_0(rid, rc); |
157 | ipc_answer_0(rid, rc); |
| 158 | return; |
158 | return; |
| Line 195... | Line 195... | ||
| 195 | * handles, and we know the mount point VFS node. |
195 | * handles, and we know the mount point VFS node. |
| 196 | */ |
196 | */ |
| 197 | 197 | ||
| 198 | int mountee_phone = vfs_grab_phone(fs_handle); |
198 | int mountee_phone = vfs_grab_phone(fs_handle); |
| 199 | assert(mountee_phone >= 0); |
199 | assert(mountee_phone >= 0); |
| 200 | vfs_release_phone(mountee_phone); |
- | |
| 201 | 200 | ||
| 202 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
201 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
| 203 | msg = async_send_4(phone, VFS_MOUNT, |
202 | msg = async_send_4(phone, VFS_MOUNT, |
| 204 | (ipcarg_t) mp_res.triplet.dev_handle, |
203 | (ipcarg_t) mp_res.triplet.dev_handle, |
| 205 | (ipcarg_t) mp_res.triplet.index, |
204 | (ipcarg_t) mp_res.triplet.index, |
| Line 207... | Line 206... | ||
| 207 | (ipcarg_t) dev_handle, &answer); |
206 | (ipcarg_t) dev_handle, &answer); |
| 208 | 207 | ||
| 209 | /* send connection */ |
208 | /* send connection */ |
| 210 | rc = async_req_1_0(phone, IPC_M_CONNECTION_CLONE, mountee_phone); |
209 | rc = async_req_1_0(phone, IPC_M_CONNECTION_CLONE, mountee_phone); |
| 211 | if (rc != EOK) { |
210 | if (rc != EOK) { |
| 212 | vfs_release_phone(phone); |
- | |
| 213 | async_wait_for(msg, NULL); |
211 | async_wait_for(msg, NULL); |
| - | 212 | vfs_release_phone(mountee_phone); |
|
| - | 213 | vfs_release_phone(phone); |
|
| 214 | /* Mount failed, drop reference to mp_node. */ |
214 | /* Mount failed, drop reference to mp_node. */ |
| 215 | if (mp_node) |
215 | if (mp_node) |
| 216 | vfs_node_put(mp_node); |
216 | vfs_node_put(mp_node); |
| 217 | ipc_answer_0(rid, rc); |
217 | ipc_answer_0(rid, rc); |
| 218 | fibril_rwlock_write_unlock(&namespace_rwlock); |
218 | fibril_rwlock_write_unlock(&namespace_rwlock); |
| 219 | return; |
219 | return; |
| 220 | } |
220 | } |
| - | 221 | ||
| - | 222 | vfs_release_phone(mountee_phone); |
|
| 221 | 223 | ||
| 222 | /* send the mount options */ |
224 | /* send the mount options */ |
| 223 | rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); |
225 | rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); |
| 224 | if (rc != EOK) { |
226 | if (rc != EOK) { |
| 225 | vfs_release_phone(phone); |
- | |
| 226 | async_wait_for(msg, NULL); |
227 | async_wait_for(msg, NULL); |
| - | 228 | vfs_release_phone(phone); |
|
| 227 | /* Mount failed, drop reference to mp_node. */ |
229 | /* Mount failed, drop reference to mp_node. */ |
| 228 | if (mp_node) |
230 | if (mp_node) |
| 229 | vfs_node_put(mp_node); |
231 | vfs_node_put(mp_node); |
| 230 | fibril_rwlock_write_unlock(&namespace_rwlock); |
232 | fibril_rwlock_write_unlock(&namespace_rwlock); |
| 231 | ipc_answer_0(rid, rc); |
233 | ipc_answer_0(rid, rc); |
| 232 | return; |
234 | return; |
| 233 | } |
235 | } |
| 234 | vfs_release_phone(phone); |
- | |
| 235 | async_wait_for(msg, &rc); |
236 | async_wait_for(msg, &rc); |
| - | 237 | vfs_release_phone(phone); |
|
| 236 | 238 | ||
| 237 | if (rc == EOK) { |
239 | if (rc == EOK) { |
| 238 | rindex = (fs_index_t) IPC_GET_ARG1(answer); |
240 | rindex = (fs_index_t) IPC_GET_ARG1(answer); |
| 239 | rsize = (size_t) IPC_GET_ARG2(answer); |
241 | rsize = (size_t) IPC_GET_ARG2(answer); |
| 240 | rlnkcnt = (unsigned) IPC_GET_ARG3(answer); |
242 | rlnkcnt = (unsigned) IPC_GET_ARG3(answer); |
| Line 753... | Line 755... | ||
| 753 | /* Make a VFS_DEVICE request at the destination FS server. */ |
755 | /* Make a VFS_DEVICE request at the destination FS server. */ |
| 754 | aid_t msg; |
756 | aid_t msg; |
| 755 | ipc_call_t answer; |
757 | ipc_call_t answer; |
| 756 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
758 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
| 757 | file->node->dev_handle, file->node->index, &answer); |
759 | file->node->dev_handle, file->node->index, &answer); |
| 758 | - | ||
| 759 | vfs_release_phone(fs_phone); |
- | |
| 760 | 760 | ||
| 761 | /* Wait for reply from the FS server. */ |
761 | /* Wait for reply from the FS server. */ |
| 762 | ipcarg_t rc; |
762 | ipcarg_t rc; |
| 763 | async_wait_for(msg, &rc); |
763 | async_wait_for(msg, &rc); |
| 764 | 764 | ||
| - | 765 | vfs_release_phone(fs_phone); |
|
| 765 | fibril_mutex_unlock(&file->lock); |
766 | fibril_mutex_unlock(&file->lock); |
| 766 | 767 | ||
| 767 | ipc_answer_1(rid, EOK, IPC_GET_ARG1(answer)); |
768 | ipc_answer_1(rid, EOK, IPC_GET_ARG1(answer)); |
| 768 | } |
769 | } |
| 769 | 770 | ||
| Line 789... | Line 790... | ||
| 789 | aid_t msg; |
790 | aid_t msg; |
| 790 | ipc_call_t answer; |
791 | ipc_call_t answer; |
| 791 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
792 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
| 792 | file->node->dev_handle, file->node->index, &answer); |
793 | file->node->dev_handle, file->node->index, &answer); |
| 793 | 794 | ||
| 794 | vfs_release_phone(fs_phone); |
- | |
| 795 | - | ||
| 796 | /* Wait for reply from the FS server. */ |
795 | /* Wait for reply from the FS server. */ |
| 797 | ipcarg_t rc; |
796 | ipcarg_t rc; |
| 798 | async_wait_for(msg, &rc); |
797 | async_wait_for(msg, &rc); |
| 799 | 798 | ||
| - | 799 | vfs_release_phone(fs_phone); |
|
| 800 | fibril_mutex_unlock(&file->lock); |
800 | fibril_mutex_unlock(&file->lock); |
| 801 | 801 | ||
| 802 | ipc_answer_0(rid, rc); |
802 | ipc_answer_0(rid, rc); |
| 803 | } |
803 | } |
| 804 | 804 | ||
| Line 816... | Line 816... | ||
| 816 | /* |
816 | /* |
| 817 | * Lock the open file structure so that no other thread can manipulate |
817 | * Lock the open file structure so that no other thread can manipulate |
| 818 | * the same open file at a time. |
818 | * the same open file at a time. |
| 819 | */ |
819 | */ |
| 820 | fibril_mutex_lock(&file->lock); |
820 | fibril_mutex_lock(&file->lock); |
| 821 | - | ||
| 822 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
821 | int fs_phone = vfs_grab_phone(file->node->fs_handle); |
| 823 | 822 | ||
| 824 | /* Make a VFS_CLOSE request at the destination FS server. */ |
823 | /* Make a VFS_CLOSE request at the destination FS server. */ |
| 825 | aid_t msg; |
824 | aid_t msg; |
| 826 | ipc_call_t answer; |
825 | ipc_call_t answer; |
| 827 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
826 | msg = async_send_2(fs_phone, IPC_GET_METHOD(*request), |
| 828 | file->node->dev_handle, file->node->index, &answer); |
827 | file->node->dev_handle, file->node->index, &answer); |
| 829 | 828 | ||
| 830 | vfs_release_phone(fs_phone); |
- | |
| 831 | - | ||
| 832 | /* Wait for reply from the FS server. */ |
829 | /* Wait for reply from the FS server. */ |
| 833 | ipcarg_t rc; |
830 | ipcarg_t rc; |
| 834 | async_wait_for(msg, &rc); |
831 | async_wait_for(msg, &rc); |
| 835 | 832 | ||
| - | 833 | vfs_release_phone(fs_phone); |
|
| 836 | fibril_mutex_unlock(&file->lock); |
834 | fibril_mutex_unlock(&file->lock); |
| 837 | 835 | ||
| 838 | int retval = IPC_GET_ARG1(answer); |
836 | int retval = IPC_GET_ARG1(answer); |
| 839 | if (retval != EOK) |
837 | if (retval != EOK) |
| 840 | ipc_answer_0(rid, retval); |
838 | ipc_answer_0(rid, retval); |
| Line 921... | Line 919... | ||
| 921 | * ourselves. Note that call arguments are immutable in this case so we |
919 | * ourselves. Note that call arguments are immutable in this case so we |
| 922 | * don't have to bother. |
920 | * don't have to bother. |
| 923 | */ |
921 | */ |
| 924 | ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
922 | ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
| 925 | 923 | ||
| 926 | vfs_release_phone(fs_phone); |
- | |
| 927 | - | ||
| 928 | /* Wait for reply from the FS server. */ |
924 | /* Wait for reply from the FS server. */ |
| 929 | ipcarg_t rc; |
925 | ipcarg_t rc; |
| 930 | async_wait_for(msg, &rc); |
926 | async_wait_for(msg, &rc); |
| 931 | 927 | ||
| - | 928 | vfs_release_phone(fs_phone); |
|
| - | 929 | ||
| 932 | size_t bytes = IPC_GET_ARG1(answer); |
930 | size_t bytes = IPC_GET_ARG1(answer); |
| 933 | 931 | ||
| 934 | if (file->node->type == VFS_NODE_DIRECTORY) |
932 | if (file->node->type == VFS_NODE_DIRECTORY) |
| 935 | fibril_rwlock_read_unlock(&namespace_rwlock); |
933 | fibril_rwlock_read_unlock(&namespace_rwlock); |
| 936 | 934 | ||