Changes in uspace/srv/fs/fat/fat.c [efcebe1:9934f7d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/fat/fat.c
refcebe1 r9934f7d 56 56 }; 57 57 58 fs_reg_t fat_reg; 59 60 /** 61 * This connection fibril processes VFS requests from VFS. 62 * 63 * In order to support simultaneous VFS requests, our design is as follows. 64 * The connection fibril accepts VFS requests from VFS. If there is only one 65 * instance of the fibril, VFS will need to serialize all VFS requests it sends 66 * to FAT. To overcome this bottleneck, VFS can send FAT the IPC_M_CONNECT_ME_TO 67 * call. In that case, a new connection fibril will be created, which in turn 68 * will accept the call. Thus, a new phone will be opened for VFS. 69 * 70 * There are few issues with this arrangement. First, VFS can run out of 71 * available phones. In that case, VFS can close some other phones or use one 72 * phone for more serialized requests. Similarily, FAT can refuse to duplicate 73 * the connection. VFS should then just make use of already existing phones and 74 * route its requests through them. To avoid paying the fibril creation price 75 * upon each request, FAT might want to keep the connections open after the 76 * request has been completed. 77 */ 78 static void fat_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 79 { 80 if (iid) { 81 /* 82 * This only happens for connections opened by 83 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections 84 * created by IPC_M_CONNECT_TO_ME. 85 */ 86 async_answer_0(iid, EOK); 87 } 88 89 dprintf(NAME ": connection opened\n"); 90 91 while (true) { 92 ipc_call_t call; 93 ipc_callid_t callid = async_get_call(&call); 94 95 if (!IPC_GET_IMETHOD(call)) 96 return; 97 98 switch (IPC_GET_IMETHOD(call)) { 99 case VFS_OUT_MOUNTED: 100 fat_mounted(callid, &call); 101 break; 102 case VFS_OUT_MOUNT: 103 fat_mount(callid, &call); 104 break; 105 case VFS_OUT_UNMOUNTED: 106 fat_unmounted(callid, &call); 107 break; 108 case VFS_OUT_UNMOUNT: 109 fat_unmount(callid, &call); 110 break; 111 case VFS_OUT_LOOKUP: 112 fat_lookup(callid, &call); 113 break; 114 case VFS_OUT_READ: 115 fat_read(callid, &call); 116 break; 117 case VFS_OUT_WRITE: 118 fat_write(callid, &call); 119 break; 120 case VFS_OUT_TRUNCATE: 121 fat_truncate(callid, &call); 122 break; 123 case VFS_OUT_STAT: 124 fat_stat(callid, &call); 125 break; 126 case VFS_OUT_CLOSE: 127 fat_close(callid, &call); 128 break; 129 case VFS_OUT_DESTROY: 130 fat_destroy(callid, &call); 131 break; 132 case VFS_OUT_OPEN_NODE: 133 fat_open_node(callid, &call); 134 break; 135 case VFS_OUT_SYNC: 136 fat_sync(callid, &call); 137 break; 138 default: 139 async_answer_0(callid, ENOTSUP); 140 break; 141 } 142 } 143 } 144 58 145 int main(int argc, char **argv) 59 146 { … … 71 158 } 72 159 73 rc = fs_register(vfs_sess, &fat_ vfs_info, &fat_ops, &fat_libfs_ops);160 rc = fs_register(vfs_sess, &fat_reg, &fat_vfs_info, fat_connection); 74 161 if (rc != EOK) { 75 162 fat_idx_fini();
Note:
See TracChangeset
for help on using the changeset viewer.