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 | */ |