Rev 2637 | Rev 2644 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2637 | Rev 2643 | ||
|---|---|---|---|
| Line 41... | Line 41... | ||
| 41 | #include <ipc/services.h> |
41 | #include <ipc/services.h> |
| 42 | #include <async.h> |
42 | #include <async.h> |
| 43 | #include <errno.h> |
43 | #include <errno.h> |
| 44 | #include <unistd.h> |
44 | #include <unistd.h> |
| 45 | #include <stdio.h> |
45 | #include <stdio.h> |
| 46 | #include <as.h> |
46 | #include <libfs.h> |
| 47 | #include "../../vfs/vfs.h" |
47 | #include "../../vfs/vfs.h" |
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | vfs_info_t fat_vfs_info = { |
50 | vfs_info_t fat_vfs_info = { |
| 51 | .name = "fat", |
51 | .name = "fat", |
| Line 61... | Line 61... | ||
| 61 | [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL, |
61 | [IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL, |
| 62 | [IPC_METHOD_TO_VFS_OP(VFS_SEEK)] = VFS_OP_DEFAULT |
62 | [IPC_METHOD_TO_VFS_OP(VFS_SEEK)] = VFS_OP_DEFAULT |
| 63 | } |
63 | } |
| 64 | }; |
64 | }; |
| 65 | 65 | ||
| 66 | uint8_t *plb_ro = NULL; |
66 | fs_reg_t fat_reg; |
| 67 | - | ||
| 68 | int fs_handle = 0; |
- | |
| 69 | 67 | ||
| 70 | /** |
68 | /** |
| 71 | * This connection fibril processes VFS requests from VFS. |
69 | * This connection fibril processes VFS requests from VFS. |
| 72 | * |
70 | * |
| 73 | * In order to support simultaneous VFS requests, our design is as follows. |
71 | * In order to support simultaneous VFS requests, our design is as follows. |
| Line 130... | Line 128... | ||
| 130 | while (vfs_phone < EOK) { |
128 | while (vfs_phone < EOK) { |
| 131 | usleep(10000); |
129 | usleep(10000); |
| 132 | vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
130 | vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
| 133 | } |
131 | } |
| 134 | 132 | ||
| 135 | /* |
- | |
| 136 | * Tell VFS that we are here and want to get registered. |
- | |
| 137 | * We use the async framework because VFS will answer the request |
- | |
| 138 | * out-of-order, when it knows that the operation succeeded or failed. |
- | |
| 139 | */ |
133 | int rc; |
| 140 | ipc_call_t answer; |
- | |
| 141 | aid_t req = async_send_2(vfs_phone, VFS_REGISTER, 0, 0, &answer); |
- | |
| 142 | - | ||
| 143 | /* |
- | |
| 144 | * Send our VFS info structure to VFS. |
- | |
| 145 | */ |
- | |
| 146 | int rc = ipc_data_send(vfs_phone, &fat_vfs_info, sizeof(fat_vfs_info)); |
134 | rc = fs_register(vfs_phone, &fat_reg, &fat_vfs_info, fat_connection); |
| 147 | if (rc != EOK) { |
135 | if (rc != EOK) { |
| 148 | async_wait_for(req, NULL); |
- | |
| 149 | return rc; |
- | |
| 150 | } |
- | |
| 151 | - | ||
| 152 | /* |
- | |
| 153 | * Ask VFS for callback connection. |
- | |
| 154 | */ |
- | |
| 155 | ipcarg_t phonehash; |
- | |
| 156 | ipc_connect_to_me(vfs_phone, 0, 0, 0, &phonehash); |
136 | printf("Failed to register the FAT file system (%d)\n", rc); |
| 157 | - | ||
| 158 | /* |
- | |
| 159 | * Allocate piece of address space for PLB. |
- | |
| 160 | */ |
- | |
| 161 | plb_ro = as_get_mappable_page(PLB_SIZE); |
- | |
| 162 | if (!plb_ro) { |
- | |
| 163 | async_wait_for(req, NULL); |
- | |
| 164 | return ENOMEM; |
- | |
| 165 | } |
- | |
| 166 | - | ||
| 167 | /* |
- | |
| 168 | * Request sharing the Path Lookup Buffer with VFS. |
- | |
| 169 | */ |
- | |
| 170 | rc = ipc_call_sync_2_0(vfs_phone, IPC_M_AS_AREA_RECV, (ipcarg_t) plb_ro, |
- | |
| 171 | PLB_SIZE); |
- | |
| 172 | if (rc) { |
- | |
| 173 | async_wait_for(req, NULL); |
- | |
| 174 | return rc; |
137 | return rc; |
| 175 | } |
138 | } |
| 176 | - | ||
| 177 | /* |
- | |
| 178 | * Pick up the answer for the request to the VFS_REQUEST call. |
- | |
| 179 | */ |
- | |
| 180 | async_wait_for(req, NULL); |
- | |
| 181 | fs_handle = (int) IPC_GET_ARG1(answer); |
- | |
| 182 | dprintf("FAT filesystem registered, fs_handle=%d.\n", fs_handle); |
- | |
| 183 | - | ||
| 184 | /* |
- | |
| 185 | * Create a connection fibril to handle the callback connection. |
- | |
| 186 | */ |
- | |
| 187 | async_new_connection(phonehash, 0, NULL, fat_connection); |
- | |
| 188 | 139 | ||
| 189 | /* |
- | |
| 190 | * Tell the async framework that other connections are to be handled by |
140 | dprintf("FAT filesystem registered, fs_handle=%d.\n", fat_reg.fs_handle); |
| 191 | * the same connection fibril as well. |
- | |
| 192 | */ |
- | |
| 193 | async_set_client_connection(fat_connection); |
- | |
| 194 | 141 | ||
| 195 | async_manager(); |
142 | async_manager(); |
| 196 | /* not reached */ |
143 | /* not reached */ |
| 197 | return 0; |
144 | return 0; |
| 198 | } |
145 | } |