Rev 2637 | Rev 2644 | Go to most recent revision | Show entire file | Regard 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 | 139 | ||
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); |
140 | dprintf("FAT filesystem registered, fs_handle=%d.\n", fat_reg.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 | - | ||
189 | /* |
- | |
190 | * Tell the async framework that other connections are to be handled by |
- | |
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 | } |