Changeset 79ae36dd in mainline for uspace/srv/vfs
- Timestamp:
- 2011-06-08T19:01:55Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0eff68e
- Parents:
- 764d71e
- Location:
- uspace/srv/vfs
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs.c
r764d71e r79ae36dd 37 37 38 38 #include <ipc/services.h> 39 #include < ipc/ns.h>39 #include <ns.h> 40 40 #include <async.h> 41 41 #include <errno.h> … … 51 51 static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall) 52 52 { 53 bool keep_on_going= true;54 53 bool cont = true; 54 55 55 /* 56 56 * The connection was opened via the IPC_CONNECT_ME_TO call. … … 59 59 async_answer_0(iid, EOK); 60 60 61 while ( keep_on_going) {61 while (cont) { 62 62 ipc_call_t call; 63 63 ipc_callid_t callid = async_get_call(&call); 64 64 65 if (!IPC_GET_IMETHOD(call)) 66 break; 67 65 68 switch (IPC_GET_IMETHOD(call)) { 66 case IPC_M_PHONE_HUNGUP:67 keep_on_going = false;68 break;69 69 case VFS_IN_REGISTER: 70 70 vfs_register(callid, &call); 71 keep_on_going= false;71 cont = false; 72 72 break; 73 73 case VFS_IN_MOUNT: … … 123 123 } 124 124 } 125 125 126 126 /* 127 127 * Open files for this client will be cleaned up when its last -
uspace/srv/vfs/vfs.h
r764d71e r79ae36dd 53 53 vfs_info_t vfs_info; 54 54 fs_handle_t fs_handle; 55 async_sess_t session;55 async_sess_t *sess; 56 56 } fs_info_t; 57 57 … … 167 167 extern fibril_rwlock_t namespace_rwlock; 168 168 169 extern int vfs_grab_phone(fs_handle_t);170 extern void vfs_ release_phone(fs_handle_t, int);169 extern async_exch_t *vfs_exchange_grab(fs_handle_t); 170 extern void vfs_exchange_release(async_exch_t *); 171 171 172 172 extern fs_handle_t fs_name_to_handle(char *, bool); -
uspace/srv/vfs/vfs_file.c
r764d71e r79ae36dd 45 45 #include "vfs.h" 46 46 47 #define VFS_DATA ((vfs_client_data_t *) async_ client_data_get())47 #define VFS_DATA ((vfs_client_data_t *) async_get_client_data()) 48 48 #define FILES (VFS_DATA->files) 49 49 … … 110 110 static int vfs_file_close_remote(vfs_file_t *file) 111 111 { 112 assert(!file->refcnt); 113 114 async_exch_t *exch = vfs_exchange_grab(file->node->fs_handle); 115 112 116 ipc_call_t answer; 113 aid_t msg; 117 aid_t msg = async_send_2(exch, VFS_OUT_CLOSE, file->node->devmap_handle, 118 file->node->index, &answer); 119 120 vfs_exchange_release(exch); 121 114 122 sysarg_t rc; 115 int phone;116 117 assert(!file->refcnt);118 119 phone = vfs_grab_phone(file->node->fs_handle);120 msg = async_send_2(phone, VFS_OUT_CLOSE, file->node->devmap_handle,121 file->node->index, &answer);122 123 async_wait_for(msg, &rc); 123 vfs_release_phone(file->node->fs_handle, phone); 124 124 125 125 return IPC_GET_ARG1(answer); 126 126 } 127 128 127 129 128 /** Increment reference count of VFS file structure. -
uspace/srv/vfs/vfs_lookup.c
r764d71e r79ae36dd 159 159 160 160 ipc_call_t answer; 161 int phone = vfs_grab_phone(root->fs_handle);162 aid_t req = async_send_5( phone, VFS_OUT_LOOKUP, (sysarg_t) first,161 async_exch_t *exch = vfs_exchange_grab(root->fs_handle); 162 aid_t req = async_send_5(exch, VFS_OUT_LOOKUP, (sysarg_t) first, 163 163 (sysarg_t) (first + len - 1) % PLB_SIZE, 164 164 (sysarg_t) root->devmap_handle, (sysarg_t) lflag, (sysarg_t) index, … … 167 167 sysarg_t rc; 168 168 async_wait_for(req, &rc); 169 vfs_ release_phone(root->fs_handle, phone);169 vfs_exchange_release(exch); 170 170 171 171 fibril_mutex_lock(&plb_mutex); … … 208 208 int vfs_open_node_internal(vfs_lookup_res_t *result) 209 209 { 210 int phone = vfs_grab_phone(result->triplet.fs_handle);210 async_exch_t *exch = vfs_exchange_grab(result->triplet.fs_handle); 211 211 212 212 ipc_call_t answer; 213 aid_t req = async_send_2( phone, VFS_OUT_OPEN_NODE,213 aid_t req = async_send_2(exch, VFS_OUT_OPEN_NODE, 214 214 (sysarg_t) result->triplet.devmap_handle, 215 215 (sysarg_t) result->triplet.index, &answer); … … 217 217 sysarg_t rc; 218 218 async_wait_for(req, &rc); 219 vfs_ release_phone(result->triplet.fs_handle, phone);219 vfs_exchange_release(exch); 220 220 221 221 if (rc == EOK) { -
uspace/srv/vfs/vfs_node.c
r764d71e r79ae36dd 104 104 bool free_vfs_node = false; 105 105 bool free_fs_node = false; 106 107 fibril_mutex_lock(&nodes_mutex); 106 107 fibril_mutex_lock(&nodes_mutex); 108 108 109 if (node->refcnt-- == 1) { 110 109 111 /* 110 112 * We are dropping the last reference to this node. 111 113 * Remove it from the VFS node hash table. 112 114 */ 115 113 116 unsigned long key[] = { 114 117 [KEY_FS_HANDLE] = node->fs_handle, … … 116 119 [KEY_INDEX] = node->index 117 120 }; 121 118 122 hash_table_remove(&nodes, key, 3); 119 123 free_vfs_node = true; 124 120 125 if (!node->lnkcnt) 121 126 free_fs_node = true; 122 127 } 123 fibril_mutex_unlock(&nodes_mutex); 124 128 129 fibril_mutex_unlock(&nodes_mutex); 130 125 131 if (free_fs_node) { 126 /* 132 133 /* 127 134 * The node is not visible in the file system namespace. 128 135 * Free up its resources. 129 136 */ 130 int phone = vfs_grab_phone(node->fs_handle); 131 sysarg_t rc; 132 rc = async_req_2_0(phone, VFS_OUT_DESTROY, 133 (sysarg_t)node->devmap_handle, (sysarg_t)node->index); 137 138 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 139 sysarg_t rc = async_req_2_0(exch, VFS_OUT_DESTROY, 140 (sysarg_t) node->devmap_handle, (sysarg_t)node->index); 141 134 142 assert(rc == EOK); 135 vfs_ release_phone(node->fs_handle, phone);143 vfs_exchange_release(exch); 136 144 } 145 137 146 if (free_vfs_node) 138 147 free(node); -
uspace/srv/vfs/vfs_ops.c
r764d71e r79ae36dd 78 78 size_t rsize; 79 79 unsigned rlnkcnt; 80 async_exch_t *exch; 80 81 sysarg_t rc; 81 int phone;82 82 aid_t msg; 83 83 ipc_call_t answer; … … 123 123 124 124 /* Tell the mountee that it is being mounted. */ 125 phone = vfs_grab_phone(fs_handle);126 msg = async_send_1( phone, VFS_OUT_MOUNTED,125 exch = vfs_exchange_grab(fs_handle); 126 msg = async_send_1(exch, VFS_OUT_MOUNTED, 127 127 (sysarg_t) devmap_handle, &answer); 128 /* send the mount options */129 rc = async_data_write_start( phone, (void *)opts,128 /* Send the mount options */ 129 rc = async_data_write_start(exch, (void *)opts, 130 130 str_size(opts)); 131 vfs_exchange_release(exch); 132 131 133 if (rc != EOK) { 132 134 async_wait_for(msg, NULL); 133 vfs_release_phone(fs_handle, phone);134 135 fibril_rwlock_write_unlock(&namespace_rwlock); 135 136 async_answer_0(rid, rc); … … 137 138 } 138 139 async_wait_for(msg, &rc); 139 vfs_release_phone(fs_handle, phone);140 140 141 141 if (rc != EOK) { … … 182 182 */ 183 183 184 int mountee_phone = vfs_grab_phone(fs_handle);185 assert(mountee_ phone >= 0);186 187 phone = vfs_grab_phone(mp_res.triplet.fs_handle);188 msg = async_send_4( phone, VFS_OUT_MOUNT,184 async_exch_t *mountee_exch = vfs_exchange_grab(fs_handle); 185 assert(mountee_exch); 186 187 exch = vfs_exchange_grab(mp_res.triplet.fs_handle); 188 msg = async_send_4(exch, VFS_OUT_MOUNT, 189 189 (sysarg_t) mp_res.triplet.devmap_handle, 190 190 (sysarg_t) mp_res.triplet.index, … … 192 192 (sysarg_t) devmap_handle, &answer); 193 193 194 /* send connection */ 195 rc = async_req_1_0(phone, IPC_M_CONNECTION_CLONE, mountee_phone); 196 if (rc != EOK) { 194 /* Send connection */ 195 rc = async_exchange_clone(exch, mountee_exch); 196 vfs_exchange_release(mountee_exch); 197 198 if (rc != EOK) { 199 vfs_exchange_release(exch); 197 200 async_wait_for(msg, NULL); 198 vfs_release_phone(fs_handle, mountee_phone); 199 vfs_release_phone(mp_res.triplet.fs_handle, phone); 201 200 202 /* Mount failed, drop reference to mp_node. */ 201 203 if (mp_node) 202 204 vfs_node_put(mp_node); 203 async_answer_0(rid, rc); 204 fibril_rwlock_write_unlock(&namespace_rwlock); 205 return; 206 } 207 208 vfs_release_phone(fs_handle, mountee_phone); 205 206 async_answer_0(rid, rc); 207 fibril_rwlock_write_unlock(&namespace_rwlock); 208 return; 209 } 209 210 210 211 /* send the mount options */ 211 rc = async_data_write_start(phone, (void *)opts, str_size(opts)); 212 if (rc != EOK) { 212 rc = async_data_write_start(exch, (void *) opts, str_size(opts)); 213 if (rc != EOK) { 214 vfs_exchange_release(exch); 213 215 async_wait_for(msg, NULL); 214 vfs_release_phone(mp_res.triplet.fs_handle, phone);216 215 217 /* Mount failed, drop reference to mp_node. */ 216 218 if (mp_node) 217 219 vfs_node_put(mp_node); 218 fibril_rwlock_write_unlock(&namespace_rwlock); 219 async_answer_0(rid, rc); 220 return; 221 } 220 221 fibril_rwlock_write_unlock(&namespace_rwlock); 222 async_answer_0(rid, rc); 223 return; 224 } 225 226 vfs_exchange_release(exch); 222 227 async_wait_for(msg, &rc); 223 vfs_release_phone(mp_res.triplet.fs_handle, phone);224 228 225 229 if (rc == EOK) { … … 227 231 rsize = (size_t) IPC_GET_ARG2(answer); 228 232 rlnkcnt = (unsigned) IPC_GET_ARG3(answer); 229 233 230 234 mr_res.triplet.fs_handle = fs_handle; 231 235 mr_res.triplet.devmap_handle = devmap_handle; … … 234 238 mr_res.lnkcnt = rlnkcnt; 235 239 mr_res.type = VFS_NODE_DIRECTORY; 236 240 237 241 /* Add reference to the mounted root. */ 238 242 mr_node = vfs_node_get(&mr_res); … … 243 247 vfs_node_put(mp_node); 244 248 } 245 249 246 250 async_answer_0(rid, rc); 247 251 fibril_rwlock_write_unlock(&namespace_rwlock); … … 303 307 304 308 /* 305 * Wait for IPC_M_PING so that we can return an error if we don't know309 * Wait for VFS_IN_PING so that we can return an error if we don't know 306 310 * fs_name. 307 311 */ 308 312 ipc_call_t data; 309 313 ipc_callid_t callid = async_get_call(&data); 310 if (IPC_GET_IMETHOD(data) != IPC_M_PING) {314 if (IPC_GET_IMETHOD(data) != VFS_IN_PING) { 311 315 async_answer_0(callid, ENOTSUP); 312 316 async_answer_0(rid, ENOTSUP); … … 358 362 vfs_lookup_res_t mr_res; 359 363 vfs_node_t *mr_node; 360 int phone;361 364 async_exch_t *exch; 365 362 366 /* 363 367 * Receive the mount point path. … … 367 371 if (rc != EOK) 368 372 async_answer_0(rid, rc); 369 373 370 374 /* 371 375 * Taking the namespace lock will do two things for us. First, it will … … 395 399 return; 396 400 } 397 401 398 402 /* 399 403 * Count the total number of references for the mounted file system. We … … 411 415 return; 412 416 } 413 417 414 418 if (str_cmp(mp, "/") == 0) { 415 419 416 420 /* 417 421 * Unmounting the root file system. … … 420 424 * VFS_OUT_UNMOUNTED directly to the mounted file system. 421 425 */ 422 426 423 427 free(mp); 424 phone = vfs_grab_phone(mr_node->fs_handle); 425 rc = async_req_1_0(phone, VFS_OUT_UNMOUNTED, 428 429 exch = vfs_exchange_grab(mr_node->fs_handle); 430 rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED, 426 431 mr_node->devmap_handle); 427 vfs_release_phone(mr_node->fs_handle, phone); 432 vfs_exchange_release(exch); 433 428 434 if (rc != EOK) { 429 435 fibril_rwlock_write_unlock(&namespace_rwlock); … … 432 438 return; 433 439 } 440 434 441 rootfs.fs_handle = 0; 435 442 rootfs.devmap_handle = 0; 436 443 } else { 437 444 438 445 /* 439 446 * Unmounting a non-root file system. … … 442 449 * file system, so we delegate the operation to it. 443 450 */ 444 451 445 452 rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL); 446 453 free(mp); … … 451 458 return; 452 459 } 460 453 461 vfs_node_t *mp_node = vfs_node_get(&mp_res); 454 462 if (!mp_node) { … … 458 466 return; 459 467 } 460 461 phone = vfs_grab_phone(mp_node->fs_handle);462 rc = async_req_2_0( phone, VFS_OUT_UNMOUNT,468 469 exch = vfs_exchange_grab(mp_node->fs_handle); 470 rc = async_req_2_0(exch, VFS_OUT_UNMOUNT, 463 471 mp_node->devmap_handle, mp_node->index); 464 vfs_release_phone(mp_node->fs_handle, phone); 472 vfs_exchange_release(exch); 473 465 474 if (rc != EOK) { 466 475 fibril_rwlock_write_unlock(&namespace_rwlock); … … 470 479 return; 471 480 } 472 481 473 482 /* Drop the reference we got above. */ 474 483 vfs_node_put(mp_node); … … 476 485 vfs_node_put(mp_node); 477 486 } 478 479 487 480 488 /* 481 489 * All went well, the mounted file system was successfully unmounted. … … 483 491 */ 484 492 vfs_node_forget(mr_node); 485 493 486 494 fibril_rwlock_write_unlock(&namespace_rwlock); 487 495 async_answer_0(rid, EOK); … … 698 706 */ 699 707 fibril_mutex_lock(&file->lock); 700 int fs_phone = vfs_grab_phone(file->node->fs_handle);708 async_exch_t *fs_exch = vfs_exchange_grab(file->node->fs_handle); 701 709 702 710 /* Make a VFS_OUT_SYMC request at the destination FS server. */ 703 711 aid_t msg; 704 712 ipc_call_t answer; 705 msg = async_send_2(fs_ phone, VFS_OUT_SYNC, file->node->devmap_handle,713 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->devmap_handle, 706 714 file->node->index, &answer); 707 715 716 vfs_exchange_release(fs_exch); 717 708 718 /* Wait for reply from the FS server. */ 709 719 sysarg_t rc; 710 720 async_wait_for(msg, &rc); 711 721 712 vfs_release_phone(file->node->fs_handle, fs_phone);713 722 fibril_mutex_unlock(&file->lock); 714 723 715 724 vfs_file_put(file); 716 725 async_answer_0(rid, rc); … … 720 729 { 721 730 int fd = IPC_GET_ARG1(*request); 722 int ret; 723 724 ret = vfs_fd_free(fd); 731 int ret = vfs_fd_free(fd); 725 732 async_answer_0(rid, ret); 726 733 } … … 728 735 static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) 729 736 { 730 vfs_info_t *vi;731 732 737 /* 733 738 * The following code strongly depends on the fact that the files data … … 739 744 * open files supports parallel access! 740 745 */ 741 746 742 747 int fd = IPC_GET_ARG1(*request); 743 748 … … 754 759 */ 755 760 fibril_mutex_lock(&file->lock); 756 757 v i= fs_handle_to_info(file->node->fs_handle);758 assert( vi);759 761 762 vfs_info_t *fs_info = fs_handle_to_info(file->node->fs_handle); 763 assert(fs_info); 764 760 765 /* 761 766 * Lock the file's node so that no other client can read/write to it at … … 763 768 * write implementation does not modify the file size. 764 769 */ 765 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 770 if ((read) || 771 ((fs_info->concurrent_read_write) && (fs_info->write_retains_size))) 766 772 fibril_rwlock_read_lock(&file->node->contents_rwlock); 767 773 else 768 774 fibril_rwlock_write_lock(&file->node->contents_rwlock); 769 775 770 776 if (file->node->type == VFS_NODE_DIRECTORY) { 771 777 /* … … 777 783 } 778 784 779 int fs_phone = vfs_grab_phone(file->node->fs_handle);785 async_exch_t *fs_exch = vfs_exchange_grab(file->node->fs_handle); 780 786 781 787 /* … … 789 795 ipc_call_t answer; 790 796 if (read) { 791 rc = async_data_read_forward_3_1(fs_ phone, VFS_OUT_READ,797 rc = async_data_read_forward_3_1(fs_exch, VFS_OUT_READ, 792 798 file->node->devmap_handle, file->node->index, file->pos, 793 799 &answer); … … 796 802 file->pos = file->node->size; 797 803 798 rc = async_data_write_forward_3_1(fs_ phone, VFS_OUT_WRITE,804 rc = async_data_write_forward_3_1(fs_exch, VFS_OUT_WRITE, 799 805 file->node->devmap_handle, file->node->index, file->pos, 800 806 &answer); 801 807 } 802 808 803 vfs_ release_phone(file->node->fs_handle, fs_phone);809 vfs_exchange_release(fs_exch); 804 810 805 811 size_t bytes = IPC_GET_ARG1(answer); … … 809 815 810 816 /* Unlock the VFS node. */ 811 if (read || (vi->concurrent_read_write && vi->write_retains_size)) 817 if ((read) || 818 ((fs_info->concurrent_read_write) && (fs_info->write_retains_size))) 812 819 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 813 820 else { … … 929 936 fs_index_t index, aoff64_t size) 930 937 { 931 sysarg_t rc; 932 int fs_phone; 933 934 fs_phone = vfs_grab_phone(fs_handle); 935 rc = async_req_4_0(fs_phone, VFS_OUT_TRUNCATE, (sysarg_t) devmap_handle, 936 (sysarg_t) index, LOWER32(size), UPPER32(size)); 937 vfs_release_phone(fs_handle, fs_phone); 938 return (int)rc; 938 async_exch_t *exch = vfs_exchange_grab(fs_handle); 939 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 940 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size), 941 UPPER32(size)); 942 vfs_exchange_release(exch); 943 944 return (int) rc; 939 945 } 940 946 … … 986 992 fibril_mutex_lock(&file->lock); 987 993 988 int fs_phone = vfs_grab_phone(file->node->fs_handle);994 async_exch_t *exch = vfs_exchange_grab(file->node->fs_handle); 989 995 990 996 aid_t msg; 991 msg = async_send_3( fs_phone, VFS_OUT_STAT, file->node->devmap_handle,997 msg = async_send_3(exch, VFS_OUT_STAT, file->node->devmap_handle, 992 998 file->node->index, true, NULL); 993 async_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 999 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 1000 1001 vfs_exchange_release(exch); 1002 994 1003 async_wait_for(msg, &rc); 995 vfs_release_phone(file->node->fs_handle, fs_phone); 996 1004 997 1005 fibril_mutex_unlock(&file->lock); 998 1006 vfs_file_put(file); … … 1037 1045 fibril_rwlock_read_unlock(&namespace_rwlock); 1038 1046 1039 int fs_phone = vfs_grab_phone(node->fs_handle); 1047 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 1048 1040 1049 aid_t msg; 1041 msg = async_send_3( fs_phone, VFS_OUT_STAT, node->devmap_handle,1050 msg = async_send_3(exch, VFS_OUT_STAT, node->devmap_handle, 1042 1051 node->index, false, NULL); 1043 async_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 1052 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 1053 1054 vfs_exchange_release(exch); 1044 1055 1045 1056 sysarg_t rv; 1046 1057 async_wait_for(msg, &rv); 1047 vfs_release_phone(node->fs_handle, fs_phone);1048 1058 1049 1059 async_answer_0(rid, rv); -
uspace/srv/vfs/vfs_register.c
r764d71e r79ae36dd 62 62 /** Verify the VFS info structure. 63 63 * 64 * @param info Info structure to be verified. 65 * 66 * @return Non-zero if the info structure is sane, zero otherwise. 64 * @param info Info structure to be verified. 65 * 66 * @return Non-zero if the info structure is sane, zero otherwise. 67 * 67 68 */ 68 69 static bool vfs_info_sane(vfs_info_t *info) 69 70 { 70 71 int i; 71 72 72 73 /* 73 74 * Check if the name is non-empty and is composed solely of ASCII … … 78 79 return false; 79 80 } 81 80 82 for (i = 1; i < FS_NAME_MAXLEN; i++) { 81 83 if (!(islower(info->name[i]) || isdigit(info->name[i])) && … … 90 92 } 91 93 } 94 92 95 /* 93 96 * This check is not redundant. It ensures that the name is … … 104 107 /** VFS_REGISTER protocol function. 105 108 * 106 * @param rid Hash of the call with the request. 107 * @param request Call structure with the request. 109 * @param rid Hash of the call with the request. 110 * @param request Call structure with the request. 111 * 108 112 */ 109 113 void vfs_register(ipc_callid_t rid, ipc_call_t *request) 110 114 { 111 int phone;112 113 115 dprintf("Processing VFS_REGISTER request received from %p.\n", 114 116 request->in_phone_hash); … … 174 176 * which to forward VFS requests to it. 175 177 */ 176 ipc_call_t call; 177 ipc_callid_t callid = async_get_call(&call); 178 if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) { 179 dprintf("Unexpected call, method = %d\n", IPC_GET_IMETHOD(call)); 178 fs_info->sess = async_callback_receive(EXCHANGE_PARALLEL); 179 if (!fs_info->sess) { 180 dprintf("Callback connection expected\n"); 180 181 list_remove(&fs_info->fs_link); 181 182 fibril_mutex_unlock(&fs_head_lock); 182 183 free(fs_info); 183 async_answer_0(callid, EINVAL);184 184 async_answer_0(rid, EINVAL); 185 185 return; 186 186 } 187 187 188 phone = IPC_GET_ARG5(call);189 async_session_create(&fs_info->session, phone, 0);190 async_answer_0(callid, EOK);191 192 188 dprintf("Callback connection to FS created.\n"); 193 189 … … 197 193 198 194 size_t size; 195 ipc_callid_t callid; 199 196 if (!async_share_in_receive(&callid, &size)) { 200 197 dprintf("Unexpected call, method = %d\n", IPC_GET_IMETHOD(call)); 201 198 list_remove(&fs_info->fs_link); 202 199 fibril_mutex_unlock(&fs_head_lock); 203 async_session_destroy(&fs_info->session); 204 async_hangup(phone); 200 async_hangup(fs_info->sess); 205 201 free(fs_info); 206 202 async_answer_0(callid, EINVAL); … … 216 212 list_remove(&fs_info->fs_link); 217 213 fibril_mutex_unlock(&fs_head_lock); 218 async_session_destroy(&fs_info->session); 219 async_hangup(phone); 214 async_hangup(fs_info->sess); 220 215 free(fs_info); 221 216 async_answer_0(callid, EINVAL); … … 247 242 } 248 243 249 /** For a given file system handle, implement policy for allocating a phone. 250 * 251 * @param handle File system handle. 252 * 253 * @return Phone over which a multi-call request can be safely 254 * sent. Return 0 if no phone was found. 255 */ 256 int vfs_grab_phone(fs_handle_t handle) 257 { 244 /** Begin an exchange for a given file system handle 245 * 246 * @param handle File system handle. 247 * 248 * @return Exchange for a multi-call request. 249 * @return NULL if no such file exists. 250 * 251 */ 252 async_exch_t *vfs_exchange_grab(fs_handle_t handle) 253 { 254 /* 255 * For now, we don't try to be very clever and very fast. 256 * We simply lookup the session in the fs_head list and 257 * begin an exchange. 258 */ 259 fibril_mutex_lock(&fs_head_lock); 260 258 261 link_t *cur; 259 fs_info_t *fs;260 int phone;261 262 /*263 * For now, we don't try to be very clever and very fast. We simply264 * lookup the phone in the fs_head list and duplicate it. The duplicate265 * phone will be returned to the client and the client will use it for266 * communication. In the future, we should cache the connections so267 * that they do not have to be reestablished over and over again.268 */269 fibril_mutex_lock(&fs_head_lock);270 262 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { 271 fs = list_get_instance(cur, fs_info_t, fs_link); 263 fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link); 264 272 265 if (fs->fs_handle == handle) { 273 266 fibril_mutex_unlock(&fs_head_lock); 274 phone = async_exchange_begin(&fs->session); 275 276 assert(phone > 0); 277 return phone; 267 268 assert(fs->sess); 269 async_exch_t *exch = async_exchange_begin(fs->sess); 270 271 assert(exch); 272 return exch; 278 273 } 279 274 } 275 280 276 fibril_mutex_unlock(&fs_head_lock); 281 return 0; 282 } 283 284 /** Tell VFS that the phone is not needed anymore. 285 * 286 * @param phone Phone to FS task. 287 */ 288 void vfs_release_phone(fs_handle_t handle, int phone) 289 { 290 link_t *cur; 291 fs_info_t *fs; 292 293 fibril_mutex_lock(&fs_head_lock); 294 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { 295 fs = list_get_instance(cur, fs_info_t, fs_link); 296 if (fs->fs_handle == handle) { 297 fibril_mutex_unlock(&fs_head_lock); 298 async_exchange_end(&fs->session, phone); 299 return; 300 } 301 } 302 /* should not really get here */ 303 abort(); 304 fibril_mutex_unlock(&fs_head_lock); 277 278 return NULL; 279 } 280 281 /** End VFS server exchange. 282 * 283 * @param exch VFS server exchange. 284 * 285 */ 286 void vfs_exchange_release(async_exch_t *exch) 287 { 288 async_exchange_end(exch); 305 289 } 306 290 307 291 /** Convert file system name to its handle. 308 292 * 309 * @param name File system name. 310 * @param lock If true, the function will lock and unlock the 311 * fs_head_lock. 312 * 313 * @return File system handle or zero if file system not found. 293 * @param name File system name. 294 * @param lock If true, the function will lock and unlock the 295 * fs_head_lock. 296 * 297 * @return File system handle or zero if file system not found. 298 * 314 299 */ 315 300 fs_handle_t fs_name_to_handle(char *name, bool lock) … … 319 304 if (lock) 320 305 fibril_mutex_lock(&fs_head_lock); 306 321 307 link_t *cur; 322 308 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { … … 327 313 } 328 314 } 315 329 316 if (lock) 330 317 fibril_mutex_unlock(&fs_head_lock); 318 331 319 return handle; 332 320 } … … 334 322 /** Find the VFS info structure. 335 323 * 336 * @param handle FS handle for which the VFS info structure is sought. 337 * @return VFS info structure on success or NULL otherwise. 324 * @param handle FS handle for which the VFS info structure is sought. 325 * 326 * @return VFS info structure on success or NULL otherwise. 327 * 338 328 */ 339 329 vfs_info_t *fs_handle_to_info(fs_handle_t handle) … … 341 331 vfs_info_t *info = NULL; 342 332 link_t *cur; 343 333 344 334 fibril_mutex_lock(&fs_head_lock); 345 335 for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { … … 351 341 } 352 342 fibril_mutex_unlock(&fs_head_lock); 353 343 354 344 return info; 355 345 } … … 357 347 /** 358 348 * @} 359 */ 349 */
Note:
See TracChangeset
for help on using the changeset viewer.