Rev 4368 | Rev 4427 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4368 | Rev 4409 | ||
|---|---|---|---|
| Line 82... | Line 82... | ||
| 82 | 82 | ||
| 83 | static void vfs_mount_internal(ipc_callid_t rid, dev_handle_t dev_handle, |
83 | static void vfs_mount_internal(ipc_callid_t rid, dev_handle_t dev_handle, |
| 84 | fs_handle_t fs_handle, char *mp, char *opts) |
84 | fs_handle_t fs_handle, char *mp, char *opts) |
| 85 | { |
85 | { |
| 86 | vfs_lookup_res_t mp_res; |
86 | vfs_lookup_res_t mp_res; |
| - | 87 | vfs_lookup_res_t mr_res; |
|
| 87 | vfs_node_t *mp_node = NULL; |
88 | vfs_node_t *mp_node = NULL; |
| - | 89 | vfs_node_t *mr_node; |
|
| - | 90 | fs_index_t rindex; |
|
| - | 91 | size_t rsize; |
|
| - | 92 | unsigned rlnkcnt; |
|
| 88 | ipcarg_t rc; |
93 | ipcarg_t rc; |
| 89 | int phone; |
94 | int phone; |
| 90 | aid_t msg; |
95 | aid_t msg; |
| 91 | ipc_call_t answer; |
96 | ipc_call_t answer; |
| - | 97 | ||
| 92 | 98 | ||
| 93 | /* Resolve the path to the mountpoint. */ |
99 | /* Resolve the path to the mountpoint. */ |
| 94 | futex_down(&rootfs_futex); |
100 | futex_down(&rootfs_futex); |
| 95 | if (rootfs.fs_handle) { |
101 | if (rootfs.fs_handle) { |
| 96 | /* We already have the root FS. */ |
102 | /* We already have the root FS. */ |
| Line 127... | Line 133... | ||
| 127 | */ |
133 | */ |
| 128 | rwlock_write_unlock(&namespace_rwlock); |
134 | rwlock_write_unlock(&namespace_rwlock); |
| 129 | } else { |
135 | } else { |
| 130 | /* We still don't have the root file system mounted. */ |
136 | /* We still don't have the root file system mounted. */ |
| 131 | if (str_cmp(mp, "/") == 0) { |
137 | if (str_cmp(mp, "/") == 0) { |
| 132 | vfs_lookup_res_t mr_res; |
- | |
| 133 | vfs_node_t *mr_node; |
- | |
| 134 | fs_index_t rindex; |
- | |
| 135 | size_t rsize; |
- | |
| 136 | unsigned rlnkcnt; |
- | |
| 137 | - | ||
| 138 | /* |
138 | /* |
| 139 | * For this simple, but important case, |
139 | * For this simple, but important case, |
| 140 | * we are almost done. |
140 | * we are almost done. |
| 141 | */ |
141 | */ |
| 142 | 142 | ||
| Line 199... | Line 199... | ||
| 199 | /* |
199 | /* |
| 200 | * At this point, we have all necessary pieces: file system and device |
200 | * At this point, we have all necessary pieces: file system and device |
| 201 | * handles, and we know the mount point VFS node. |
201 | * handles, and we know the mount point VFS node. |
| 202 | */ |
202 | */ |
| 203 | 203 | ||
| - | 204 | int mountee_phone = vfs_grab_phone(fs_handle); |
|
| - | 205 | assert(mountee_phone >= 0); |
|
| - | 206 | vfs_release_phone(mountee_phone); |
|
| - | 207 | ||
| 204 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
208 | phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
| 205 | msg = async_send_4(phone, VFS_MOUNT, |
209 | msg = async_send_4(phone, VFS_MOUNT, |
| 206 | (ipcarg_t) mp_res.triplet.dev_handle, |
210 | (ipcarg_t) mp_res.triplet.dev_handle, |
| 207 | (ipcarg_t) mp_res.triplet.index, |
211 | (ipcarg_t) mp_res.triplet.index, |
| 208 | (ipcarg_t) fs_handle, |
212 | (ipcarg_t) fs_handle, |
| 209 | (ipcarg_t) dev_handle, &answer); |
213 | (ipcarg_t) dev_handle, &answer); |
| - | 214 | ||
| - | 215 | /* send connection */ |
|
| - | 216 | rc = async_req_1_0(phone, IPC_M_CONNECTION_CLONE, mountee_phone); |
|
| - | 217 | if (rc != EOK) { |
|
| - | 218 | async_wait_for(msg, NULL); |
|
| - | 219 | vfs_release_phone(phone); |
|
| - | 220 | /* Mount failed, drop reference to mp_node. */ |
|
| - | 221 | if (mp_node) |
|
| - | 222 | vfs_node_put(mp_node); |
|
| - | 223 | ipc_answer_0(rid, rc); |
|
| - | 224 | return; |
|
| - | 225 | } |
|
| - | 226 | ||
| 210 | /* send the mount options */ |
227 | /* send the mount options */ |
| 211 | rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); |
228 | rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); |
| 212 | if (rc != EOK) { |
229 | if (rc != EOK) { |
| 213 | async_wait_for(msg, NULL); |
230 | async_wait_for(msg, NULL); |
| 214 | vfs_release_phone(phone); |
231 | vfs_release_phone(phone); |
| Line 225... | Line 242... | ||
| 225 | /* Mount failed, drop reference to mp_node. */ |
242 | /* Mount failed, drop reference to mp_node. */ |
| 226 | if (mp_node) |
243 | if (mp_node) |
| 227 | vfs_node_put(mp_node); |
244 | vfs_node_put(mp_node); |
| 228 | } |
245 | } |
| 229 | 246 | ||
| - | 247 | rindex = (fs_index_t) IPC_GET_ARG1(answer); |
|
| - | 248 | rsize = (size_t) IPC_GET_ARG2(answer); |
|
| - | 249 | rlnkcnt = (unsigned) IPC_GET_ARG3(answer); |
|
| - | 250 | ||
| - | 251 | mr_res.triplet.fs_handle = fs_handle; |
|
| - | 252 | mr_res.triplet.dev_handle = dev_handle; |
|
| - | 253 | mr_res.triplet.index = rindex; |
|
| - | 254 | mr_res.size = rsize; |
|
| - | 255 | mr_res.lnkcnt = rlnkcnt; |
|
| - | 256 | mr_res.type = VFS_NODE_DIRECTORY; |
|
| - | 257 | ||
| - | 258 | /* Add reference to the mounted root. */ |
|
| - | 259 | mr_node = vfs_node_get(&mr_res); |
|
| - | 260 | assert(mr_node); |
|
| - | 261 | ||
| 230 | ipc_answer_0(rid, rc); |
262 | ipc_answer_0(rid, rc); |
| 231 | } |
263 | } |
| 232 | 264 | ||
| 233 | /** Process pending mount requests */ |
265 | /** Process pending mount requests */ |
| 234 | void vfs_process_pending_mount() |
266 | void vfs_process_pending_mount() |