Changeset 594303b in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2009-04-18T15:32:56Z (14 years ago)
- Branches:
- lfn, master, serial
- Children:
- 8d049ee0
- Parents:
- 6b6e423a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r6b6e423a r594303b 61 61 char *fs_name; /**< File system name */ 62 62 char *mp; /**< Mount point */ 63 char *opts; /**< Mount options. */ 63 64 ipc_callid_t callid; /**< Call ID waiting for the mount */ 64 65 ipc_callid_t rid; /**< Request ID */ … … 81 82 82 83 static void vfs_mount_internal(ipc_callid_t rid, dev_handle_t dev_handle, 83 fs_handle_t fs_handle, char *mp) 84 { 85 /* Resolve the path to the mountpoint. */ 84 fs_handle_t fs_handle, char *mp, char *opts) 85 { 86 86 vfs_lookup_res_t mp_res; 87 87 vfs_node_t *mp_node = NULL; 88 i nt rc;88 ipcarg_t rc; 89 89 int phone; 90 aid_t msg; 91 ipc_call_t answer; 92 93 /* Resolve the path to the mountpoint. */ 90 94 futex_down(&rootfs_futex); 91 95 if (rootfs.fs_handle) { … … 128 132 vfs_lookup_res_t mr_res; 129 133 vfs_node_t *mr_node; 130 ipcarg_t rindex;131 ipcarg_t rsize;132 ipcarg_trlnkcnt;134 fs_index_t rindex; 135 size_t rsize; 136 unsigned rlnkcnt; 133 137 134 138 /* … … 139 143 /* Tell the mountee that it is being mounted. */ 140 144 phone = vfs_grab_phone(fs_handle); 141 rc = async_req_1_3(phone, VFS_MOUNTED, 142 (ipcarg_t) dev_handle, &rindex, &rsize, &rlnkcnt); 145 msg = async_send_1(phone, VFS_MOUNTED, 146 (ipcarg_t) dev_handle, &answer); 147 /* send the mount options */ 148 rc = ipc_data_write_start(phone, (void *)opts, 149 str_size(opts)); 150 if (rc != EOK) { 151 async_wait_for(msg, NULL); 152 vfs_release_phone(phone); 153 futex_up(&rootfs_futex); 154 ipc_answer_0(rid, rc); 155 return; 156 } 157 async_wait_for(msg, &rc); 143 158 vfs_release_phone(phone); 144 159 … … 148 163 return; 149 164 } 165 166 rindex = (fs_index_t) IPC_GET_ARG1(answer); 167 rsize = (size_t) IPC_GET_ARG2(answer); 168 rlnkcnt = (unsigned) IPC_GET_ARG3(answer); 150 169 151 170 mr_res.triplet.fs_handle = fs_handle; 152 171 mr_res.triplet.dev_handle = dev_handle; 153 mr_res.triplet.index = (fs_index_t)rindex;154 mr_res.size = (size_t)rsize;155 mr_res.lnkcnt = (unsigned)rlnkcnt;172 mr_res.triplet.index = rindex; 173 mr_res.size = rsize; 174 mr_res.lnkcnt = rlnkcnt; 156 175 mr_res.type = VFS_NODE_DIRECTORY; 157 176 … … 184 203 185 204 phone = vfs_grab_phone(mp_res.triplet.fs_handle); 186 rc = async_req_4_0(phone, VFS_MOUNT,205 msg = async_send_4(phone, VFS_MOUNT, 187 206 (ipcarg_t) mp_res.triplet.dev_handle, 188 207 (ipcarg_t) mp_res.triplet.index, 189 208 (ipcarg_t) fs_handle, 190 (ipcarg_t) dev_handle); 209 (ipcarg_t) dev_handle, &answer); 210 /* send the mount options */ 211 rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); 212 if (rc != EOK) { 213 async_wait_for(msg, NULL); 214 vfs_release_phone(phone); 215 /* Mount failed, drop reference to mp_node. */ 216 if (mp_node) 217 vfs_node_put(mp_node); 218 ipc_answer_0(rid, rc); 219 return; 220 } 221 async_wait_for(msg, &rc); 191 222 vfs_release_phone(phone); 192 223 … … 217 248 218 249 /* Do the mount */ 219 vfs_mount_internal(pr->rid, pr->dev_handle, fs_handle, pr->mp); 250 vfs_mount_internal(pr->rid, pr->dev_handle, fs_handle, pr->mp, 251 pr->opts); 220 252 221 253 free(pr->fs_name); 222 254 free(pr->mp); 255 free(pr->opts); 223 256 list_remove(cur); 224 257 free(pr); … … 279 312 mp[size] = '\0'; 280 313 314 /* Now we expect to receive the mount options. */ 315 if (!ipc_data_write_receive(&callid, &size)) { 316 ipc_answer_0(callid, EINVAL); 317 ipc_answer_0(rid, EINVAL); 318 free(mp); 319 return; 320 } 321 322 /* Check the offered options size. */ 323 if (size < 0 || size > MAX_MNTOPTS_LEN) { 324 ipc_answer_0(callid, EINVAL); 325 ipc_answer_0(rid, EINVAL); 326 free(mp); 327 return; 328 } 329 330 /* Allocate buffer for the mount options. */ 331 char *opts = (char *) malloc(size + 1); 332 if (!opts) { 333 ipc_answer_0(callid, ENOMEM); 334 ipc_answer_0(rid, ENOMEM); 335 free(mp); 336 return; 337 } 338 339 /* Deliver the mount options. */ 340 retval = ipc_data_write_finalize(callid, opts, size); 341 if (retval != EOK) { 342 ipc_answer_0(rid, retval); 343 free(mp); 344 free(opts); 345 return; 346 } 347 opts[size] = '\0'; 348 281 349 /* 282 350 * Now, we expect the client to send us data with the name of the file … … 287 355 ipc_answer_0(rid, EINVAL); 288 356 free(mp); 357 free(opts); 289 358 return; 290 359 } … … 298 367 ipc_answer_0(rid, EINVAL); 299 368 free(mp); 369 free(opts); 300 370 return; 301 371 } … … 309 379 ipc_answer_0(rid, ENOMEM); 310 380 free(mp); 381 free(opts); 311 382 return; 312 383 } … … 317 388 ipc_answer_0(rid, retval); 318 389 free(mp); 390 free(opts); 319 391 free(fs_name); 320 392 return; … … 332 404 ipc_answer_0(rid, ENOTSUP); 333 405 free(mp); 406 free(opts); 334 407 free(fs_name); 335 408 return; … … 352 425 free(mp); 353 426 free(fs_name); 427 free(opts); 354 428 return; 355 429 } … … 357 431 pr->fs_name = fs_name; 358 432 pr->mp = mp; 433 pr->opts = opts; 359 434 pr->callid = callid; 360 435 pr->rid = rid; … … 369 444 free(mp); 370 445 free(fs_name); 446 free(opts); 371 447 return; 372 448 } … … 376 452 377 453 /* Do the mount */ 378 vfs_mount_internal(rid, dev_handle, fs_handle, mp );454 vfs_mount_internal(rid, dev_handle, fs_handle, mp, opts); 379 455 free(mp); 380 456 free(fs_name); 457 free(opts); 381 458 } 382 459
Note: See TracChangeset
for help on using the changeset viewer.