Changeset bd5f3b7 in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2011-08-21T13:07:35Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 00aece0, f1a9e87
- Parents:
- 86a34d3e (diff), a6480d5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r86a34d3e rbd5f3b7 54 54 55 55 /* Forward declarations of static functions. */ 56 static int vfs_truncate_internal(fs_handle_t, devmap_handle_t, fs_index_t,56 static int vfs_truncate_internal(fs_handle_t, service_id_t, fs_index_t, 57 57 aoff64_t); 58 58 … … 65 65 vfs_pair_t rootfs = { 66 66 .fs_handle = 0, 67 . devmap_handle= 067 .service_id = 0 68 68 }; 69 69 70 static void vfs_mount_internal(ipc_callid_t rid, devmap_handle_t devmap_handle,70 static void vfs_mount_internal(ipc_callid_t rid, service_id_t service_id, 71 71 fs_handle_t fs_handle, char *mp, char *opts) 72 72 { … … 76 76 vfs_node_t *mr_node; 77 77 fs_index_t rindex; 78 size_t rsize;78 aoff64_t rsize; 79 79 unsigned rlnkcnt; 80 80 async_exch_t *exch; … … 125 125 exch = vfs_exchange_grab(fs_handle); 126 126 msg = async_send_1(exch, VFS_OUT_MOUNTED, 127 (sysarg_t) devmap_handle, &answer);127 (sysarg_t) service_id, &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 = ( size_t) IPC_GET_ARG2(answer);149 rlnkcnt = (unsigned) IPC_GET_ARG 3(answer);148 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 149 rlnkcnt = (unsigned) IPC_GET_ARG4(answer); 150 150 151 151 mr_res.triplet.fs_handle = fs_handle; 152 mr_res.triplet. devmap_handle = devmap_handle;152 mr_res.triplet.service_id = service_id; 153 153 mr_res.triplet.index = rindex; 154 154 mr_res.size = rsize; … … 157 157 158 158 rootfs.fs_handle = fs_handle; 159 rootfs. devmap_handle = devmap_handle;159 rootfs.service_id = service_id; 160 160 161 161 /* Add reference to the mounted root. */ … … 178 178 179 179 /* 180 * At this point, we have all necessary pieces: file system and device181 * handles, and we know the mount point VFS node.180 * At this point, we have all necessary pieces: file system handle 181 * and service ID, and we know the mount point VFS node. 182 182 */ 183 183 … … 187 187 exch = vfs_exchange_grab(mp_res.triplet.fs_handle); 188 188 msg = async_send_4(exch, VFS_OUT_MOUNT, 189 (sysarg_t) mp_res.triplet. devmap_handle,189 (sysarg_t) mp_res.triplet.service_id, 190 190 (sysarg_t) mp_res.triplet.index, 191 191 (sysarg_t) fs_handle, 192 (sysarg_t) devmap_handle, &answer);192 (sysarg_t) service_id, &answer); 193 193 194 194 /* Send connection */ … … 229 229 if (rc == EOK) { 230 230 rindex = (fs_index_t) IPC_GET_ARG1(answer); 231 rsize = (size_t) IPC_GET_ARG2(answer); 232 rlnkcnt = (unsigned) IPC_GET_ARG3(answer); 231 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), 232 IPC_GET_ARG3(answer)); 233 rlnkcnt = (unsigned) IPC_GET_ARG4(answer); 233 234 234 235 mr_res.triplet.fs_handle = fs_handle; 235 mr_res.triplet. devmap_handle = devmap_handle;236 mr_res.triplet.service_id = service_id; 236 237 mr_res.triplet.index = rindex; 237 238 mr_res.size = rsize; … … 254 255 void vfs_mount(ipc_callid_t rid, ipc_call_t *request) 255 256 { 256 devmap_handle_t devmap_handle;257 service_id_t service_id; 257 258 258 259 /* … … 261 262 * in the request. 262 263 */ 263 devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);264 service_id = (service_id_t) IPC_GET_ARG1(*request); 264 265 265 266 /* … … 349 350 350 351 /* Do the mount */ 351 vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts);352 vfs_mount_internal(rid, service_id, fs_handle, mp, opts); 352 353 free(mp); 353 354 free(fs_name); … … 408 409 */ 409 410 if (vfs_nodes_refcount_sum_get(mr_node->fs_handle, 410 mr_node-> devmap_handle) != 2) {411 mr_node->service_id) != 2) { 411 412 fibril_rwlock_write_unlock(&namespace_rwlock); 412 413 vfs_node_put(mr_node); … … 429 430 exch = vfs_exchange_grab(mr_node->fs_handle); 430 431 rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED, 431 mr_node-> devmap_handle);432 mr_node->service_id); 432 433 vfs_exchange_release(exch); 433 434 … … 440 441 441 442 rootfs.fs_handle = 0; 442 rootfs. devmap_handle= 0;443 rootfs.service_id = 0; 443 444 } else { 444 445 … … 469 470 exch = vfs_exchange_grab(mp_node->fs_handle); 470 471 rc = async_req_2_0(exch, VFS_OUT_UNMOUNT, 471 mp_node-> devmap_handle, mp_node->index);472 mp_node->service_id, mp_node->index); 472 473 vfs_exchange_release(exch); 473 474 … … 574 575 if (node->size) { 575 576 rc = vfs_truncate_internal(node->fs_handle, 576 node-> devmap_handle, node->index, 0);577 node->service_id, node->index, 0); 577 578 if (rc) { 578 579 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 617 618 } 618 619 619 void vfs_open_node(ipc_callid_t rid, ipc_call_t *request)620 {621 // FIXME: check for sanity of the supplied fs, dev and index622 623 /*624 * The interface is open_node(fs, dev, index, oflag).625 */626 vfs_lookup_res_t lr;627 628 lr.triplet.fs_handle = IPC_GET_ARG1(*request);629 lr.triplet.devmap_handle = IPC_GET_ARG2(*request);630 lr.triplet.index = IPC_GET_ARG3(*request);631 int oflag = IPC_GET_ARG4(*request);632 633 fibril_rwlock_read_lock(&namespace_rwlock);634 635 int rc = vfs_open_node_internal(&lr);636 if (rc != EOK) {637 fibril_rwlock_read_unlock(&namespace_rwlock);638 async_answer_0(rid, rc);639 return;640 }641 642 vfs_node_t *node = vfs_node_get(&lr);643 fibril_rwlock_read_unlock(&namespace_rwlock);644 645 /* Truncate the file if requested and if necessary. */646 if (oflag & O_TRUNC) {647 fibril_rwlock_write_lock(&node->contents_rwlock);648 if (node->size) {649 rc = vfs_truncate_internal(node->fs_handle,650 node->devmap_handle, node->index, 0);651 if (rc) {652 fibril_rwlock_write_unlock(&node->contents_rwlock);653 vfs_node_put(node);654 async_answer_0(rid, rc);655 return;656 }657 node->size = 0;658 }659 fibril_rwlock_write_unlock(&node->contents_rwlock);660 }661 662 /*663 * Get ourselves a file descriptor and the corresponding vfs_file_t664 * structure.665 */666 int fd = vfs_fd_alloc((oflag & O_DESC) != 0);667 if (fd < 0) {668 vfs_node_put(node);669 async_answer_0(rid, fd);670 return;671 }672 vfs_file_t *file = vfs_file_get(fd);673 file->node = node;674 if (oflag & O_APPEND)675 file->append = true;676 677 /*678 * The following increase in reference count is for the fact that the679 * file is being opened and that a file structure is pointing to it.680 * It is necessary so that the file will not disappear when681 * vfs_node_put() is called. The reference will be dropped by the682 * respective VFS_IN_CLOSE.683 */684 vfs_node_addref(node);685 vfs_node_put(node);686 vfs_file_put(file);687 688 /* Success! Return the new file descriptor to the client. */689 async_answer_1(rid, EOK, fd);690 }691 692 620 void vfs_sync(ipc_callid_t rid, ipc_call_t *request) 693 621 { … … 711 639 aid_t msg; 712 640 ipc_call_t answer; 713 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node-> devmap_handle,641 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->service_id, 714 642 file->node->index, &answer); 715 643 … … 795 723 ipc_call_t answer; 796 724 if (read) { 797 rc = async_data_read_forward_ 3_1(fs_exch, VFS_OUT_READ,798 file->node-> devmap_handle, file->node->index, file->pos,799 &answer);725 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ, 726 file->node->service_id, file->node->index, 727 LOWER32(file->pos), UPPER32(file->pos), &answer); 800 728 } else { 801 729 if (file->append) 802 730 file->pos = file->node->size; 803 731 804 rc = async_data_write_forward_ 3_1(fs_exch, VFS_OUT_WRITE,805 file->node-> devmap_handle, file->node->index, file->pos,806 &answer);732 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE, 733 file->node->service_id, file->node->index, 734 LOWER32(file->pos), UPPER32(file->pos), &answer); 807 735 } 808 736 … … 821 749 /* Update the cached version of node's size. */ 822 750 if (rc == EOK) 823 file->node->size = IPC_GET_ARG2(answer); 751 file->node->size = MERGE_LOUP32(IPC_GET_ARG2(answer), 752 IPC_GET_ARG3(answer)); 824 753 fibril_rwlock_write_unlock(&file->node->contents_rwlock); 825 754 } … … 933 862 } 934 863 935 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle,864 int vfs_truncate_internal(fs_handle_t fs_handle, service_id_t service_id, 936 865 fs_index_t index, aoff64_t size) 937 866 { 938 867 async_exch_t *exch = vfs_exchange_grab(fs_handle); 939 868 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 940 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size),869 (sysarg_t) service_id, (sysarg_t) index, LOWER32(size), 941 870 UPPER32(size)); 942 871 vfs_exchange_release(exch); … … 961 890 fibril_rwlock_write_lock(&file->node->contents_rwlock); 962 891 rc = vfs_truncate_internal(file->node->fs_handle, 963 file->node-> devmap_handle, file->node->index, size);892 file->node->service_id, file->node->index, size); 964 893 if (rc == EOK) 965 894 file->node->size = size; … … 995 924 996 925 aid_t msg; 997 msg = async_send_3(exch, VFS_OUT_STAT, file->node-> devmap_handle,926 msg = async_send_3(exch, VFS_OUT_STAT, file->node->service_id, 998 927 file->node->index, true, NULL); 999 928 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1048 977 1049 978 aid_t msg; 1050 msg = async_send_3(exch, VFS_OUT_STAT, node-> devmap_handle,979 msg = async_send_3(exch, VFS_OUT_STAT, node->service_id, 1051 980 node->index, false, NULL); 1052 981 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1225 1154 /* Check whether linking to the same file system instance. */ 1226 1155 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1227 (old_node-> devmap_handle != new_par_lr.triplet.devmap_handle)) {1156 (old_node->service_id != new_par_lr.triplet.service_id)) { 1228 1157 fibril_rwlock_write_unlock(&namespace_rwlock); 1229 1158 vfs_node_put(old_node); … … 1347 1276 } 1348 1277 1278 void vfs_wait_handle(ipc_callid_t rid, ipc_call_t *request) 1279 { 1280 int fd = vfs_wait_handle_internal(); 1281 async_answer_1(rid, EOK, fd); 1282 } 1283 1349 1284 /** 1350 1285 * @}
Note:
See TracChangeset
for help on using the changeset viewer.