Rev 4581 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4581 | Rev 4718 | ||
|---|---|---|---|
| Line 41... | Line 41... | ||
| 41 | #include <ipc/ipc.h> |
41 | #include <ipc/ipc.h> |
| 42 | #include <as.h> |
42 | #include <as.h> |
| 43 | #include <assert.h> |
43 | #include <assert.h> |
| 44 | #include <dirent.h> |
44 | #include <dirent.h> |
| 45 | #include <mem.h> |
45 | #include <mem.h> |
| - | 46 | #include <sys/stat.h> |
|
| 46 | 47 | ||
| 47 | /** Register file system server. |
48 | /** Register file system server. |
| 48 | * |
49 | * |
| 49 | * This function abstracts away the tedious registration protocol from |
50 | * This function abstracts away the tedious registration protocol from |
| 50 | * file system implementations and lets them to reuse this registration glue |
51 | * file system implementations and lets them to reuse this registration glue |
| Line 67... | Line 68... | ||
| 67 | * Tell VFS that we are here and want to get registered. |
68 | * Tell VFS that we are here and want to get registered. |
| 68 | * We use the async framework because VFS will answer the request |
69 | * We use the async framework because VFS will answer the request |
| 69 | * out-of-order, when it knows that the operation succeeded or failed. |
70 | * out-of-order, when it knows that the operation succeeded or failed. |
| 70 | */ |
71 | */ |
| 71 | ipc_call_t answer; |
72 | ipc_call_t answer; |
| 72 | aid_t req = async_send_0(vfs_phone, VFS_REGISTER, &answer); |
73 | aid_t req = async_send_0(vfs_phone, VFS_IN_REGISTER, &answer); |
| 73 | 74 | ||
| 74 | /* |
75 | /* |
| 75 | * Send our VFS info structure to VFS. |
76 | * Send our VFS info structure to VFS. |
| 76 | */ |
77 | */ |
| 77 | int rc = ipc_data_write_start(vfs_phone, info, sizeof(*info)); |
78 | int rc = ipc_data_write_start(vfs_phone, info, sizeof(*info)); |
| Line 102... | Line 103... | ||
| 102 | async_wait_for(req, NULL); |
103 | async_wait_for(req, NULL); |
| 103 | return rc; |
104 | return rc; |
| 104 | } |
105 | } |
| 105 | 106 | ||
| 106 | /* |
107 | /* |
| 107 | * Pick up the answer for the request to the VFS_REQUEST call. |
108 | * Pick up the answer for the request to the VFS_IN_REQUEST call. |
| 108 | */ |
109 | */ |
| 109 | async_wait_for(req, NULL); |
110 | async_wait_for(req, NULL); |
| 110 | reg->fs_handle = (int) IPC_GET_ARG1(answer); |
111 | reg->fs_handle = (int) IPC_GET_ARG1(answer); |
| 111 | 112 | ||
| 112 | /* |
113 | /* |
| Line 184... | Line 185... | ||
| 184 | ipc_answer_0(rid, rc); |
185 | ipc_answer_0(rid, rc); |
| 185 | return; |
186 | return; |
| 186 | } |
187 | } |
| 187 | 188 | ||
| 188 | ipc_call_t answer; |
189 | ipc_call_t answer; |
| 189 | aid_t msg = async_send_1(mountee_phone, VFS_MOUNTED, mr_dev_handle, |
190 | aid_t msg = async_send_1(mountee_phone, VFS_OUT_MOUNTED, mr_dev_handle, |
| 190 | &answer); |
191 | &answer); |
| 191 | ipc_forward_fast(callid, mountee_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
192 | ipc_forward_fast(callid, mountee_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
| 192 | async_wait_for(msg, &rc); |
193 | async_wait_for(msg, &rc); |
| 193 | 194 | ||
| 194 | if (rc == EOK) { |
195 | if (rc == EOK) { |
| Line 211... | Line 212... | ||
| 211 | * |
212 | * |
| 212 | * @param ops libfs operations structure with function pointers to |
213 | * @param ops libfs operations structure with function pointers to |
| 213 | * file system implementation |
214 | * file system implementation |
| 214 | * @param fs_handle File system handle of the file system where to perform |
215 | * @param fs_handle File system handle of the file system where to perform |
| 215 | * the lookup. |
216 | * the lookup. |
| 216 | * @param rid Request ID of the VFS_LOOKUP request. |
217 | * @param rid Request ID of the VFS_OUT_LOOKUP request. |
| 217 | * @param request VFS_LOOKUP request data itself. |
218 | * @param request VFS_OUT_LOOKUP request data itself. |
| 218 | * |
219 | * |
| 219 | */ |
220 | */ |
| 220 | void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
221 | void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
| 221 | ipc_call_t *request) |
222 | ipc_call_t *request) |
| 222 | { |
223 | { |
| Line 235... | Line 236... | ||
| 235 | fs_node_t *par = NULL; |
236 | fs_node_t *par = NULL; |
| 236 | fs_node_t *cur = ops->root_get(dev_handle); |
237 | fs_node_t *cur = ops->root_get(dev_handle); |
| 237 | fs_node_t *tmp = NULL; |
238 | fs_node_t *tmp = NULL; |
| 238 | 239 | ||
| 239 | if (cur->mp_data.mp_active) { |
240 | if (cur->mp_data.mp_active) { |
| 240 | ipc_forward_slow(rid, cur->mp_data.phone, VFS_LOOKUP, |
241 | ipc_forward_slow(rid, cur->mp_data.phone, VFS_OUT_LOOKUP, |
| 241 | next, last, cur->mp_data.dev_handle, lflag, index, |
242 | next, last, cur->mp_data.dev_handle, lflag, index, |
| 242 | IPC_FF_ROUTE_FROM_ME); |
243 | IPC_FF_ROUTE_FROM_ME); |
| 243 | ops->node_put(cur); |
244 | ops->node_put(cur); |
| 244 | return; |
245 | return; |
| 245 | } |
246 | } |
| Line 270... | Line 271... | ||
| 270 | if (next > last) |
271 | if (next > last) |
| 271 | next = last = first; |
272 | next = last = first; |
| 272 | else |
273 | else |
| 273 | next--; |
274 | next--; |
| 274 | 275 | ||
| 275 | ipc_forward_slow(rid, tmp->mp_data.phone, VFS_LOOKUP, |
276 | ipc_forward_slow(rid, tmp->mp_data.phone, |
| 276 | next, last, tmp->mp_data.dev_handle, lflag, index, |
277 | VFS_OUT_LOOKUP, next, last, tmp->mp_data.dev_handle, |
| 277 | IPC_FF_ROUTE_FROM_ME); |
278 | lflag, index, IPC_FF_ROUTE_FROM_ME); |
| 278 | ops->node_put(cur); |
279 | ops->node_put(cur); |
| 279 | ops->node_put(tmp); |
280 | ops->node_put(tmp); |
| 280 | if (par) |
281 | if (par) |
| 281 | ops->node_put(par); |
282 | ops->node_put(par); |
| 282 | return; |
283 | return; |
| Line 426... | Line 427... | ||
| 426 | ops->node_put(cur); |
427 | ops->node_put(cur); |
| 427 | if (tmp) |
428 | if (tmp) |
| 428 | ops->node_put(tmp); |
429 | ops->node_put(tmp); |
| 429 | } |
430 | } |
| 430 | 431 | ||
| - | 432 | void libfs_stat(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
|
| - | 433 | ipc_call_t *request) |
|
| - | 434 | { |
|
| - | 435 | dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); |
|
| - | 436 | fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); |
|
| - | 437 | fs_node_t *fn = ops->node_get(dev_handle, index); |
|
| - | 438 | ||
| - | 439 | ipc_callid_t callid; |
|
| - | 440 | size_t size; |
|
| - | 441 | if (!ipc_data_read_receive(&callid, &size) || |
|
| - | 442 | size != sizeof(struct stat)) { |
|
| - | 443 | ipc_answer_0(callid, EINVAL); |
|
| - | 444 | ipc_answer_0(rid, EINVAL); |
|
| - | 445 | return; |
|
| - | 446 | } |
|
| - | 447 | ||
| - | 448 | struct stat stat; |
|
| - | 449 | memset(&stat, 0, sizeof(struct stat)); |
|
| - | 450 | ||
| - | 451 | stat.fs_handle = fs_handle; |
|
| - | 452 | stat.dev_handle = dev_handle; |
|
| - | 453 | stat.index = index; |
|
| - | 454 | stat.lnkcnt = ops->lnkcnt_get(fn); |
|
| - | 455 | stat.is_file = ops->is_file(fn); |
|
| - | 456 | stat.size = ops->size_get(fn); |
|
| - | 457 | ||
| - | 458 | ipc_data_read_finalize(callid, &stat, sizeof(struct stat)); |
|
| - | 459 | ipc_answer_0(rid, EOK); |
|
| - | 460 | } |
|
| - | 461 | ||
| 431 | /** Open VFS triplet. |
462 | /** Open VFS triplet. |
| 432 | * |
463 | * |
| 433 | * @param ops libfs operations structure with function pointers to |
464 | * @param ops libfs operations structure with function pointers to |
| 434 | * file system implementation |
465 | * file system implementation |
| 435 | * @param rid Request ID of the VFS_OPEN_NODE request. |
466 | * @param rid Request ID of the VFS_OUT_OPEN_NODE request. |
| 436 | * @param request VFS_OPEN_NODE request data itself. |
467 | * @param request VFS_OUT_OPEN_NODE request data itself. |
| 437 | * |
468 | * |
| 438 | */ |
469 | */ |
| 439 | void libfs_open_node(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
470 | void libfs_open_node(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
| 440 | ipc_call_t *request) |
471 | ipc_call_t *request) |
| 441 | { |
472 | { |