Changes in uspace/srv/fs/tmpfs/tmpfs.c [ffa2c8ef:4979403] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/fs/tmpfs/tmpfs.c
rffa2c8ef r4979403 30 30 /** @addtogroup fs 31 31 * @{ 32 */ 32 */ 33 33 34 34 /** … … 43 43 #include "tmpfs.h" 44 44 #include <ipc/services.h> 45 #include < ipc/ns.h>45 #include <ns.h> 46 46 #include <async.h> 47 47 #include <errno.h> … … 59 59 .concurrent_read_write = false, 60 60 .write_retains_size = false, 61 .instance = 0, 61 62 }; 62 63 fs_reg_t tmpfs_reg;64 65 /**66 * This connection fibril processes VFS requests from VFS.67 *68 * In order to support simultaneous VFS requests, our design is as follows.69 * The connection fibril accepts VFS requests from VFS. If there is only one70 * instance of the fibril, VFS will need to serialize all VFS requests it sends71 * to FAT. To overcome this bottleneck, VFS can send TMPFS the72 * IPC_M_CONNECT_ME_TO call. In that case, a new connection fibril will be73 * created, which in turn will accept the call. Thus, a new phone will be74 * opened for VFS.75 *76 * There are few issues with this arrangement. First, VFS can run out of77 * available phones. In that case, VFS can close some other phones or use one78 * phone for more serialized requests. Similarily, TMPFS can refuse to duplicate79 * the connection. VFS should then just make use of already existing phones and80 * route its requests through them. To avoid paying the fibril creation price81 * upon each request, TMPFS might want to keep the connections open after the82 * request has been completed.83 */84 static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall)85 {86 if (iid) {87 /*88 * This only happens for connections opened by89 * IPC_M_CONNECT_ME_TO calls as opposed to callback connections90 * created by IPC_M_CONNECT_TO_ME.91 */92 async_answer_0(iid, EOK);93 }94 95 dprintf(NAME ": connection opened\n");96 while (1) {97 ipc_callid_t callid;98 ipc_call_t call;99 100 callid = async_get_call(&call);101 switch (IPC_GET_IMETHOD(call)) {102 case IPC_M_PHONE_HUNGUP:103 return;104 case VFS_OUT_MOUNTED:105 tmpfs_mounted(callid, &call);106 break;107 case VFS_OUT_MOUNT:108 tmpfs_mount(callid, &call);109 break;110 case VFS_OUT_UNMOUNTED:111 tmpfs_unmounted(callid, &call);112 break;113 case VFS_OUT_UNMOUNT:114 tmpfs_unmount(callid, &call);115 break;116 case VFS_OUT_LOOKUP:117 tmpfs_lookup(callid, &call);118 break;119 case VFS_OUT_READ:120 tmpfs_read(callid, &call);121 break;122 case VFS_OUT_WRITE:123 tmpfs_write(callid, &call);124 break;125 case VFS_OUT_TRUNCATE:126 tmpfs_truncate(callid, &call);127 break;128 case VFS_OUT_CLOSE:129 tmpfs_close(callid, &call);130 break;131 case VFS_OUT_DESTROY:132 tmpfs_destroy(callid, &call);133 break;134 case VFS_OUT_OPEN_NODE:135 tmpfs_open_node(callid, &call);136 break;137 case VFS_OUT_STAT:138 tmpfs_stat(callid, &call);139 break;140 case VFS_OUT_SYNC:141 tmpfs_sync(callid, &call);142 break;143 default:144 async_answer_0(callid, ENOTSUP);145 break;146 }147 }148 }149 63 150 64 int main(int argc, char **argv) … … 152 66 printf(NAME ": HelenOS TMPFS file system server\n"); 153 67 68 if (argc == 3) { 69 if (!str_cmp(argv[1], "--instance")) 70 tmpfs_vfs_info.instance = strtol(argv[2], NULL, 10); 71 else { 72 printf(NAME " Unrecognized parameters"); 73 return -1; 74 } 75 } 76 154 77 if (!tmpfs_init()) { 155 78 printf(NAME ": failed to initialize TMPFS\n"); 156 79 return -1; 157 80 } 158 159 int vfs_phone = service_connect_blocking(SERVICE_VFS, 0, 0); 160 if (vfs_phone < EOK) { 81 82 async_sess_t *vfs_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 83 SERVICE_VFS, 0, 0); 84 if (!vfs_sess) { 161 85 printf(NAME ": Unable to connect to VFS\n"); 162 86 return -1; 163 87 } 164 165 int rc = fs_register(vfs_ phone, &tmpfs_reg, &tmpfs_vfs_info,166 tmpfs_connection);88 89 int rc = fs_register(vfs_sess, &tmpfs_vfs_info, &tmpfs_ops, 90 &tmpfs_libfs_ops); 167 91 if (rc != EOK) { 168 92 printf(NAME ": Failed to register file system (%d)\n", rc); 169 93 return rc; 170 94 } 171 95 172 96 printf(NAME ": Accepting connections\n"); 173 97 task_retval(0); 174 98 async_manager(); 175 /* not reached */ 99 100 /* Not reached */ 176 101 return 0; 177 102 } … … 179 104 /** 180 105 * @} 181 */ 106 */
Note:
See TracChangeset
for help on using the changeset viewer.