Changeset efd4a72 in mainline for uspace/lib/libfs/libfs.c
- Timestamp:
- 2007-12-16T16:25:26Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0c82d28
- Parents:
- 74303b6
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libfs/libfs.c
r74303b6 refd4a72 36 36 37 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 /** @}
Note:
See TracChangeset
for help on using the changeset viewer.