Changes in uspace/lib/libfs/libfs.c [ed903174:1313ee9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libfs/libfs.c
red903174 r1313ee9 37 37 #include "libfs.h" 38 38 #include "../../srv/vfs/vfs.h" 39 #include <macros.h>40 39 #include <errno.h> 41 40 #include <async.h> … … 162 161 /* Accept the phone */ 163 162 callid = async_get_call(&call); 164 int mountee_phone = (int) 163 int mountee_phone = (int)IPC_GET_ARG1(call); 165 164 if ((IPC_GET_METHOD(call) != IPC_M_CONNECTION_CLONE) || 166 165 (mountee_phone < 0)) { … … 173 172 ipc_answer_0(callid, EOK); 174 173 174 res = async_data_write_receive(&callid, NULL); 175 if (!res) { 176 ipc_hangup(mountee_phone); 177 ipc_answer_0(callid, EINVAL); 178 ipc_answer_0(rid, EINVAL); 179 return; 180 } 181 175 182 fs_node_t *fn; 176 183 res = ops->node_get(&fn, mp_dev_handle, mp_fs_index); 177 184 if ((res != EOK) || (!fn)) { 178 185 ipc_hangup(mountee_phone); 179 async_data_write_void(combine_rc(res, ENOENT));186 ipc_answer_0(callid, combine_rc(res, ENOENT)); 180 187 ipc_answer_0(rid, combine_rc(res, ENOENT)); 181 188 return; … … 185 192 ipc_hangup(mountee_phone); 186 193 (void) ops->node_put(fn); 187 async_data_write_void(EBUSY);194 ipc_answer_0(callid, EBUSY); 188 195 ipc_answer_0(rid, EBUSY); 189 196 return; … … 194 201 ipc_hangup(mountee_phone); 195 202 (void) ops->node_put(fn); 196 async_data_write_void(rc);203 ipc_answer_0(callid, rc); 197 204 ipc_answer_0(rid, rc); 198 205 return; … … 200 207 201 208 ipc_call_t answer; 202 rc = async_data_write_forward_1_1(mountee_phone, VFS_OUT_MOUNTED, 203 mr_dev_handle, &answer); 209 aid_t msg = async_send_1(mountee_phone, VFS_OUT_MOUNTED, mr_dev_handle, 210 &answer); 211 ipc_forward_fast(callid, mountee_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 212 async_wait_for(msg, &rc); 204 213 205 214 if (rc == EOK) { … … 215 224 ipc_answer_3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer), 216 225 IPC_GET_ARG3(answer)); 217 }218 219 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request)220 {221 dev_handle_t mp_dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);222 fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*request);223 fs_node_t *fn;224 int res;225 226 res = ops->node_get(&fn, mp_dev_handle, mp_fs_index);227 if ((res != EOK) || (!fn)) {228 ipc_answer_0(rid, combine_rc(res, ENOENT));229 return;230 }231 232 /*233 * We are clearly expecting to find the mount point active.234 */235 if (!fn->mp_data.mp_active) {236 (void) ops->node_put(fn);237 ipc_answer_0(rid, EINVAL);238 return;239 }240 241 /*242 * Tell the mounted file system to unmount.243 */244 res = async_req_1_0(fn->mp_data.phone, VFS_OUT_UNMOUNTED,245 fn->mp_data.dev_handle);246 247 /*248 * If everything went well, perform the clean-up on our side.249 */250 if (res == EOK) {251 ipc_hangup(fn->mp_data.phone);252 fn->mp_data.mp_active = false;253 fn->mp_data.fs_handle = 0;254 fn->mp_data.dev_handle = 0;255 fn->mp_data.phone = 0;256 /* Drop the reference created in libfs_mount(). */257 (void) ops->node_put(fn);258 }259 260 (void) ops->node_put(fn);261 ipc_answer_0(rid, res);262 226 } 263 227 … … 340 304 on_error(rc, goto out_with_answer); 341 305 342 /* 343 * If the matching component is a mount point, there are two 344 * legitimate semantics of the lookup operation. The first is 345 * the commonly used one in which the lookup crosses each mount 346 * point into the mounted file system. The second semantics is 347 * used mostly during unmount() and differs from the first one 348 * only in that the last mount point in the looked up path, 349 * which is also its last component, is not crossed. 350 */ 351 352 if ((tmp) && (tmp->mp_data.mp_active) && 353 (!(lflag & L_MP) || (next <= last))) { 306 if ((tmp) && (tmp->mp_data.mp_active)) { 354 307 if (next > last) 355 308 next = last = first; … … 399 352 ipc_answer_0(rid, rc); 400 353 } else { 401 aoff64_t size = ops->size_get(fn); 402 ipc_answer_5(rid, fs_handle, 403 dev_handle, 354 ipc_answer_5(rid, EOK, 355 fs_handle, dev_handle, 404 356 ops->index_get(fn), 405 LOWER32(size), 406 UPPER32(size), 357 ops->size_get(fn), 407 358 ops->lnkcnt_get(fn)); 408 359 (void) ops->node_put(fn); … … 481 432 ipc_answer_0(rid, rc); 482 433 } else { 483 aoff64_t size = ops->size_get(fn); 484 ipc_answer_5(rid, fs_handle, 485 dev_handle, 434 ipc_answer_5(rid, EOK, 435 fs_handle, dev_handle, 486 436 ops->index_get(fn), 487 LOWER32(size), 488 UPPER32(size), 437 ops->size_get(fn), 489 438 ops->lnkcnt_get(fn)); 490 439 (void) ops->node_put(fn); … … 506 455 unsigned int old_lnkcnt = ops->lnkcnt_get(cur); 507 456 rc = ops->unlink(par, cur, component); 508 509 if (rc == EOK) { 510 aoff64_t size = ops->size_get(cur); 511 ipc_answer_5(rid, fs_handle, dev_handle, 512 ops->index_get(cur), LOWER32(size), UPPER32(size), 513 old_lnkcnt); 514 } else 515 ipc_answer_0(rid, rc); 516 457 ipc_answer_5(rid, (ipcarg_t) rc, fs_handle, dev_handle, 458 ops->index_get(cur), ops->size_get(cur), old_lnkcnt); 517 459 goto out; 518 460 } … … 533 475 goto out; 534 476 } 535 536 if ((lflag & L_ROOT) && par) {537 ipc_answer_0(rid, EINVAL);538 goto out;539 }540 477 541 478 out_with_answer: … … 545 482 rc = ops->node_open(cur); 546 483 547 if (rc == EOK) { 548 aoff64_t size = ops->size_get(cur); 549 ipc_answer_5(rid, fs_handle, dev_handle, 550 ops->index_get(cur), LOWER32(size), UPPER32(size), 551 ops->lnkcnt_get(cur)); 552 } else 553 ipc_answer_0(rid, rc); 554 484 ipc_answer_5(rid, rc, fs_handle, dev_handle, 485 ops->index_get(cur), ops->size_get(cur), 486 ops->lnkcnt_get(cur)); 555 487 } else 556 488 ipc_answer_0(rid, rc); … … 619 551 dev_handle_t dev_handle = IPC_GET_ARG1(*request); 620 552 fs_index_t index = IPC_GET_ARG2(*request); 621 622 553 fs_node_t *fn; 623 int rc = ops->node_get(&fn, dev_handle, index); 554 int rc; 555 556 rc = ops->node_get(&fn, dev_handle, index); 624 557 on_error(rc, answer_and_return(rid, rc)); 625 558 … … 630 563 631 564 rc = ops->node_open(fn); 632 aoff64_t size = ops->size_get(fn); 633 ipc_answer_4(rid, rc, LOWER32(size), UPPER32(size), ops->lnkcnt_get(fn), 565 ipc_answer_3(rid, rc, ops->size_get(fn), ops->lnkcnt_get(fn), 634 566 (ops->is_file(fn) ? L_FILE : 0) | (ops->is_directory(fn) ? L_DIRECTORY : 0)); 635 567
Note:
See TracChangeset
for help on using the changeset viewer.