Rev 2642 | Rev 2660 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2642 | Rev 2643 | ||
---|---|---|---|
Line 33... | Line 33... | ||
33 | * @file |
33 | * @file |
34 | * Glue code which is commonod to all FS implementations. |
34 | * Glue code which is commonod to all FS implementations. |
35 | */ |
35 | */ |
36 | 36 | ||
37 | #include "libfs.h" |
37 | #include "libfs.h" |
- | 38 | #include "../../srv/vfs/vfs.h" |
|
- | 39 | #include <errno.h> |
|
- | 40 | #include <async.h> |
|
- | 41 | #include <ipc/ipc.h> |
|
- | 42 | #include <as.h> |
|
- | 43 | ||
- | 44 | /** Register file system server. |
|
- | 45 | * |
|
- | 46 | * This function abstracts away the tedious registration protocol from |
|
- | 47 | * file system implementations and lets them to reuse this registration glue |
|
- | 48 | * code. |
|
- | 49 | * |
|
- | 50 | * @param vfs_phone Open phone for communication with VFS. |
|
- | 51 | * @param reg File system registration structure. It will be |
|
- | 52 | * initialized by this function. |
|
- | 53 | * @param info VFS info structure supplied by the file system |
|
- | 54 | * implementation. |
|
- | 55 | * @param conn Connection fibril for handling all calls originating in |
|
- | 56 | * VFS. |
|
- | 57 | * |
|
- | 58 | * @return EOK on success or a non-zero error code on errror. |
|
- | 59 | */ |
|
- | 60 | int fs_register(int vfs_phone, fs_reg_t *reg, vfs_info_t *info, |
|
- | 61 | async_client_conn_t conn) |
|
- | 62 | { |
|
- | 63 | /* |
|
- | 64 | * Tell VFS that we are here and want to get registered. |
|
- | 65 | * We use the async framework because VFS will answer the request |
|
- | 66 | * out-of-order, when it knows that the operation succeeded or failed. |
|
- | 67 | */ |
|
- | 68 | ipc_call_t answer; |
|
- | 69 | aid_t req = async_send_0(vfs_phone, VFS_REGISTER, &answer); |
|
- | 70 | ||
- | 71 | /* |
|
- | 72 | * Send our VFS info structure to VFS. |
|
- | 73 | */ |
|
- | 74 | int rc = ipc_data_send(vfs_phone, info, sizeof(*info)); |
|
- | 75 | if (rc != EOK) { |
|
- | 76 | async_wait_for(req, NULL); |
|
- | 77 | return rc; |
|
- | 78 | } |
|
- | 79 | ||
- | 80 | /* |
|
- | 81 | * Ask VFS for callback connection. |
|
- | 82 | */ |
|
- | 83 | ipc_connect_to_me(vfs_phone, 0, 0, 0, ®->vfs_phonehash); |
|
- | 84 | ||
- | 85 | /* |
|
- | 86 | * Allocate piece of address space for PLB. |
|
- | 87 | */ |
|
- | 88 | reg->plb_ro = as_get_mappable_page(PLB_SIZE); |
|
- | 89 | if (!reg->plb_ro) { |
|
- | 90 | async_wait_for(req, NULL); |
|
- | 91 | return ENOMEM; |
|
- | 92 | } |
|
- | 93 | ||
- | 94 | /* |
|
- | 95 | * Request sharing the Path Lookup Buffer with VFS. |
|
- | 96 | */ |
|
- | 97 | rc = ipc_call_sync_2_0(vfs_phone, IPC_M_AS_AREA_RECV, |
|
- | 98 | (ipcarg_t) reg->plb_ro, PLB_SIZE); |
|
- | 99 | if (rc) { |
|
- | 100 | async_wait_for(req, NULL); |
|
- | 101 | return rc; |
|
- | 102 | } |
|
- | 103 | ||
- | 104 | /* |
|
- | 105 | * Pick up the answer for the request to the VFS_REQUEST call. |
|
- | 106 | */ |
|
- | 107 | async_wait_for(req, NULL); |
|
- | 108 | reg->fs_handle = (int) IPC_GET_ARG1(answer); |
|
- | 109 | ||
- | 110 | /* |
|
- | 111 | * Create a connection fibril to handle the callback connection. |
|
- | 112 | */ |
|
- | 113 | async_new_connection(reg->vfs_phonehash, 0, NULL, conn); |
|
- | 114 | ||
- | 115 | /* |
|
- | 116 | * Tell the async framework that other connections are to be handled by |
|
- | 117 | * the same connection fibril as well. |
|
- | 118 | */ |
|
- | 119 | async_set_client_connection(conn); |
|
- | 120 | ||
- | 121 | return IPC_GET_RETVAL(answer); |
|
- | 122 | } |
|
38 | 123 | ||
39 | /** @} |
124 | /** @} |
40 | */ |
125 | */ |