Changes in uspace/srv/vfs/vfs_ops.c [286286c:5bb9907] in mainline
- File:
-
- 1 edited
-
uspace/srv/vfs/vfs_ops.c (modified) (29 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r286286c r5bb9907 54 54 55 55 /* Forward declarations of static functions. */ 56 static int vfs_truncate_internal(fs_handle_t, service_id_t, fs_index_t,56 static int vfs_truncate_internal(fs_handle_t, devmap_handle_t, fs_index_t, 57 57 aoff64_t); 58 58 … … 65 65 vfs_pair_t rootfs = { 66 66 .fs_handle = 0, 67 . service_id= 067 .devmap_handle = 0 68 68 }; 69 69 70 static void vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,70 static void vfs_mount_internal(ipc_callid_t rid, devmap_handle_t devmap_handle, 71 71 fs_handle_t fs_handle, char *mp, char *opts) 72 72 { … … 125 125 exch = vfs_exchange_grab(fs_handle); 126 126 msg = async_send_1(exch, VFS_OUT_MOUNTED, 127 (sysarg_t) service_id, &answer);127 (sysarg_t) devmap_handle, &answer); 128 128 /* Send the mount options */ 129 129 rc = async_data_write_start(exch, (void *)opts, … … 146 146 147 147 rindex = (fs_index_t) IPC_GET_ARG1(answer); 148 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), 149 IPC_GET_ARG3(answer)); 148 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 150 149 rlnkcnt = (unsigned) IPC_GET_ARG4(answer); 151 150 152 151 mr_res.triplet.fs_handle = fs_handle; 153 mr_res.triplet. service_id = service_id;152 mr_res.triplet.devmap_handle = devmap_handle; 154 153 mr_res.triplet.index = rindex; 155 154 mr_res.size = rsize; … … 158 157 159 158 rootfs.fs_handle = fs_handle; 160 rootfs. service_id = service_id;159 rootfs.devmap_handle = devmap_handle; 161 160 162 161 /* Add reference to the mounted root. */ … … 179 178 180 179 /* 181 * At this point, we have all necessary pieces: file system handle182 * and service ID, and we know the mount point VFS node.180 * At this point, we have all necessary pieces: file system and device 181 * handles, and we know the mount point VFS node. 183 182 */ 184 183 … … 188 187 exch = vfs_exchange_grab(mp_res.triplet.fs_handle); 189 188 msg = async_send_4(exch, VFS_OUT_MOUNT, 190 (sysarg_t) mp_res.triplet. service_id,189 (sysarg_t) mp_res.triplet.devmap_handle, 191 190 (sysarg_t) mp_res.triplet.index, 192 191 (sysarg_t) fs_handle, 193 (sysarg_t) service_id, &answer);192 (sysarg_t) devmap_handle, &answer); 194 193 195 194 /* Send connection */ … … 225 224 } 226 225 227 /* 228 * Wait for the answer before releasing the exchange to avoid deadlock 229 * in case the answer depends on further calls to the same file system. 230 * Think of a case when mounting a FS on a file_bd backed by a file on 231 * the same FS. 232 */ 226 vfs_exchange_release(exch); 233 227 async_wait_for(msg, &rc); 234 vfs_exchange_release(exch);235 228 236 229 if (rc == EOK) { … … 241 234 242 235 mr_res.triplet.fs_handle = fs_handle; 243 mr_res.triplet. service_id = service_id;236 mr_res.triplet.devmap_handle = devmap_handle; 244 237 mr_res.triplet.index = rindex; 245 238 mr_res.size = rsize; … … 262 255 void vfs_mount(ipc_callid_t rid, ipc_call_t *request) 263 256 { 264 service_id_t service_id;257 devmap_handle_t devmap_handle; 265 258 266 259 /* … … 269 262 * in the request. 270 263 */ 271 service_id = (service_id_t) IPC_GET_ARG1(*request);264 devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 272 265 273 266 /* … … 277 270 278 271 /* 279 * Instance number is passed as ARG3.280 * /281 unsigned int instance = IPC_GET_ARG3(*request);282 272 * For now, don't make use of ARG3, but it can be used to 273 * carry mount options in the future. 274 */ 275 283 276 /* We want the client to send us the mount point. */ 284 277 char *mp; … … 336 329 fs_handle_t fs_handle; 337 330 recheck: 338 fs_handle = fs_name_to_handle( instance,fs_name, false);331 fs_handle = fs_name_to_handle(fs_name, false); 339 332 if (!fs_handle) { 340 333 if (flags & IPC_FLAG_BLOCKING) { … … 357 350 358 351 /* Do the mount */ 359 vfs_mount_internal(rid, service_id, fs_handle, mp, opts);352 vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts); 360 353 free(mp); 361 354 free(fs_name); … … 416 409 */ 417 410 if (vfs_nodes_refcount_sum_get(mr_node->fs_handle, 418 mr_node-> service_id) != 2) {411 mr_node->devmap_handle) != 2) { 419 412 fibril_rwlock_write_unlock(&namespace_rwlock); 420 413 vfs_node_put(mr_node); … … 437 430 exch = vfs_exchange_grab(mr_node->fs_handle); 438 431 rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED, 439 mr_node-> service_id);432 mr_node->devmap_handle); 440 433 vfs_exchange_release(exch); 441 434 … … 448 441 449 442 rootfs.fs_handle = 0; 450 rootfs. service_id= 0;443 rootfs.devmap_handle = 0; 451 444 } else { 452 445 … … 477 470 exch = vfs_exchange_grab(mp_node->fs_handle); 478 471 rc = async_req_2_0(exch, VFS_OUT_UNMOUNT, 479 mp_node-> service_id, mp_node->index);472 mp_node->devmap_handle, mp_node->index); 480 473 vfs_exchange_release(exch); 481 474 … … 582 575 if (node->size) { 583 576 rc = vfs_truncate_internal(node->fs_handle, 584 node-> service_id, node->index, 0);577 node->devmap_handle, node->index, 0); 585 578 if (rc) { 586 579 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 625 618 } 626 619 620 void vfs_open_node(ipc_callid_t rid, ipc_call_t *request) 621 { 622 // FIXME: check for sanity of the supplied fs, dev and index 623 624 /* 625 * The interface is open_node(fs, dev, index, oflag). 626 */ 627 vfs_lookup_res_t lr; 628 629 lr.triplet.fs_handle = IPC_GET_ARG1(*request); 630 lr.triplet.devmap_handle = IPC_GET_ARG2(*request); 631 lr.triplet.index = IPC_GET_ARG3(*request); 632 int oflag = IPC_GET_ARG4(*request); 633 634 fibril_rwlock_read_lock(&namespace_rwlock); 635 636 int rc = vfs_open_node_internal(&lr); 637 if (rc != EOK) { 638 fibril_rwlock_read_unlock(&namespace_rwlock); 639 async_answer_0(rid, rc); 640 return; 641 } 642 643 vfs_node_t *node = vfs_node_get(&lr); 644 fibril_rwlock_read_unlock(&namespace_rwlock); 645 646 /* Truncate the file if requested and if necessary. */ 647 if (oflag & O_TRUNC) { 648 fibril_rwlock_write_lock(&node->contents_rwlock); 649 if (node->size) { 650 rc = vfs_truncate_internal(node->fs_handle, 651 node->devmap_handle, node->index, 0); 652 if (rc) { 653 fibril_rwlock_write_unlock(&node->contents_rwlock); 654 vfs_node_put(node); 655 async_answer_0(rid, rc); 656 return; 657 } 658 node->size = 0; 659 } 660 fibril_rwlock_write_unlock(&node->contents_rwlock); 661 } 662 663 /* 664 * Get ourselves a file descriptor and the corresponding vfs_file_t 665 * structure. 666 */ 667 int fd = vfs_fd_alloc((oflag & O_DESC) != 0); 668 if (fd < 0) { 669 vfs_node_put(node); 670 async_answer_0(rid, fd); 671 return; 672 } 673 vfs_file_t *file = vfs_file_get(fd); 674 file->node = node; 675 if (oflag & O_APPEND) 676 file->append = true; 677 678 /* 679 * The following increase in reference count is for the fact that the 680 * file is being opened and that a file structure is pointing to it. 681 * It is necessary so that the file will not disappear when 682 * vfs_node_put() is called. The reference will be dropped by the 683 * respective VFS_IN_CLOSE. 684 */ 685 vfs_node_addref(node); 686 vfs_node_put(node); 687 vfs_file_put(file); 688 689 /* Success! Return the new file descriptor to the client. */ 690 async_answer_1(rid, EOK, fd); 691 } 692 627 693 void vfs_sync(ipc_callid_t rid, ipc_call_t *request) 628 694 { … … 646 712 aid_t msg; 647 713 ipc_call_t answer; 648 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node-> service_id,714 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->devmap_handle, 649 715 file->node->index, &answer); 650 716 … … 731 797 if (read) { 732 798 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ, 733 file->node-> service_id, file->node->index,799 file->node->devmap_handle, file->node->index, 734 800 LOWER32(file->pos), UPPER32(file->pos), &answer); 735 801 } else { … … 738 804 739 805 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE, 740 file->node-> service_id, file->node->index,806 file->node->devmap_handle, file->node->index, 741 807 LOWER32(file->pos), UPPER32(file->pos), &answer); 742 808 } … … 869 935 } 870 936 871 int vfs_truncate_internal(fs_handle_t fs_handle, service_id_t service_id,937 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle, 872 938 fs_index_t index, aoff64_t size) 873 939 { 874 940 async_exch_t *exch = vfs_exchange_grab(fs_handle); 875 941 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 876 (sysarg_t) service_id, (sysarg_t) index, LOWER32(size),942 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size), 877 943 UPPER32(size)); 878 944 vfs_exchange_release(exch); … … 897 963 fibril_rwlock_write_lock(&file->node->contents_rwlock); 898 964 rc = vfs_truncate_internal(file->node->fs_handle, 899 file->node-> service_id, file->node->index, size);965 file->node->devmap_handle, file->node->index, size); 900 966 if (rc == EOK) 901 967 file->node->size = size; … … 931 997 932 998 aid_t msg; 933 msg = async_send_3(exch, VFS_OUT_STAT, file->node-> service_id,999 msg = async_send_3(exch, VFS_OUT_STAT, file->node->devmap_handle, 934 1000 file->node->index, true, NULL); 935 1001 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 984 1050 985 1051 aid_t msg; 986 msg = async_send_3(exch, VFS_OUT_STAT, node-> service_id,1052 msg = async_send_3(exch, VFS_OUT_STAT, node->devmap_handle, 987 1053 node->index, false, NULL); 988 1054 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1161 1227 /* Check whether linking to the same file system instance. */ 1162 1228 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1163 (old_node-> service_id != new_par_lr.triplet.service_id)) {1229 (old_node->devmap_handle != new_par_lr.triplet.devmap_handle)) { 1164 1230 fibril_rwlock_write_unlock(&namespace_rwlock); 1165 1231 vfs_node_put(old_node); … … 1283 1349 } 1284 1350 1285 void vfs_wait_handle(ipc_callid_t rid, ipc_call_t *request)1286 {1287 int fd = vfs_wait_handle_internal();1288 async_answer_1(rid, EOK, fd);1289 }1290 1291 1351 /** 1292 1352 * @}
Note:
See TracChangeset
for help on using the changeset viewer.
