Changeset 925a21e in mainline for uspace/srv/vfs/vfs_ops.c
- Timestamp:
- 2011-09-24T14:20:29Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5bf76c1
- Parents:
- 867e2555 (diff), 1ab4aca (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
r867e2555 r925a21e 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 { … … 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 = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 148 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), 149 IPC_GET_ARG3(answer)); 149 150 rlnkcnt = (unsigned) IPC_GET_ARG4(answer); 150 151 151 152 mr_res.triplet.fs_handle = fs_handle; 152 mr_res.triplet. devmap_handle = devmap_handle;153 mr_res.triplet.service_id = service_id; 153 154 mr_res.triplet.index = rindex; 154 155 mr_res.size = rsize; … … 157 158 158 159 rootfs.fs_handle = fs_handle; 159 rootfs. devmap_handle = devmap_handle;160 rootfs.service_id = service_id; 160 161 161 162 /* Add reference to the mounted root. */ … … 178 179 179 180 /* 180 * At this point, we have all necessary pieces: file system and device181 * handles, and we know the mount point VFS node.181 * At this point, we have all necessary pieces: file system handle 182 * and service ID, and we know the mount point VFS node. 182 183 */ 183 184 … … 187 188 exch = vfs_exchange_grab(mp_res.triplet.fs_handle); 188 189 msg = async_send_4(exch, VFS_OUT_MOUNT, 189 (sysarg_t) mp_res.triplet. devmap_handle,190 (sysarg_t) mp_res.triplet.service_id, 190 191 (sysarg_t) mp_res.triplet.index, 191 192 (sysarg_t) fs_handle, 192 (sysarg_t) devmap_handle, &answer);193 (sysarg_t) service_id, &answer); 193 194 194 195 /* Send connection */ … … 224 225 } 225 226 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 */ 233 async_wait_for(msg, &rc); 226 234 vfs_exchange_release(exch); 227 async_wait_for(msg, &rc);228 235 229 236 if (rc == EOK) { … … 234 241 235 242 mr_res.triplet.fs_handle = fs_handle; 236 mr_res.triplet. devmap_handle = devmap_handle;243 mr_res.triplet.service_id = service_id; 237 244 mr_res.triplet.index = rindex; 238 245 mr_res.size = rsize; … … 255 262 void vfs_mount(ipc_callid_t rid, ipc_call_t *request) 256 263 { 257 devmap_handle_t devmap_handle;264 service_id_t service_id; 258 265 259 266 /* … … 262 269 * in the request. 263 270 */ 264 devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);271 service_id = (service_id_t) IPC_GET_ARG1(*request); 265 272 266 273 /* … … 270 277 271 278 /* 272 * For now, don't make use of ARG3, but it can be used to273 * carry mount options in the future.274 */275 279 * Instance number is passed as ARG3. 280 */ 281 unsigned int instance = IPC_GET_ARG3(*request); 282 276 283 /* We want the client to send us the mount point. */ 277 284 char *mp; … … 329 336 fs_handle_t fs_handle; 330 337 recheck: 331 fs_handle = fs_name_to_handle( fs_name, false);338 fs_handle = fs_name_to_handle(instance, fs_name, false); 332 339 if (!fs_handle) { 333 340 if (flags & IPC_FLAG_BLOCKING) { … … 350 357 351 358 /* Do the mount */ 352 vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts);359 vfs_mount_internal(rid, service_id, fs_handle, mp, opts); 353 360 free(mp); 354 361 free(fs_name); … … 409 416 */ 410 417 if (vfs_nodes_refcount_sum_get(mr_node->fs_handle, 411 mr_node-> devmap_handle) != 2) {418 mr_node->service_id) != 2) { 412 419 fibril_rwlock_write_unlock(&namespace_rwlock); 413 420 vfs_node_put(mr_node); … … 430 437 exch = vfs_exchange_grab(mr_node->fs_handle); 431 438 rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED, 432 mr_node-> devmap_handle);439 mr_node->service_id); 433 440 vfs_exchange_release(exch); 434 441 … … 441 448 442 449 rootfs.fs_handle = 0; 443 rootfs. devmap_handle= 0;450 rootfs.service_id = 0; 444 451 } else { 445 452 … … 470 477 exch = vfs_exchange_grab(mp_node->fs_handle); 471 478 rc = async_req_2_0(exch, VFS_OUT_UNMOUNT, 472 mp_node-> devmap_handle, mp_node->index);479 mp_node->service_id, mp_node->index); 473 480 vfs_exchange_release(exch); 474 481 … … 575 582 if (node->size) { 576 583 rc = vfs_truncate_internal(node->fs_handle, 577 node-> devmap_handle, node->index, 0);584 node->service_id, node->index, 0); 578 585 if (rc) { 579 586 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 618 625 } 619 626 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 index623 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_t665 * 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 the680 * file is being opened and that a file structure is pointing to it.681 * It is necessary so that the file will not disappear when682 * vfs_node_put() is called. The reference will be dropped by the683 * 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 693 627 void vfs_sync(ipc_callid_t rid, ipc_call_t *request) 694 628 { … … 712 646 aid_t msg; 713 647 ipc_call_t answer; 714 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node-> devmap_handle,648 msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->service_id, 715 649 file->node->index, &answer); 716 650 … … 797 731 if (read) { 798 732 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ, 799 file->node-> devmap_handle, file->node->index,733 file->node->service_id, file->node->index, 800 734 LOWER32(file->pos), UPPER32(file->pos), &answer); 801 735 } else { … … 804 738 805 739 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE, 806 file->node-> devmap_handle, file->node->index,740 file->node->service_id, file->node->index, 807 741 LOWER32(file->pos), UPPER32(file->pos), &answer); 808 742 } … … 935 869 } 936 870 937 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle,871 int vfs_truncate_internal(fs_handle_t fs_handle, service_id_t service_id, 938 872 fs_index_t index, aoff64_t size) 939 873 { 940 874 async_exch_t *exch = vfs_exchange_grab(fs_handle); 941 875 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 942 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size),876 (sysarg_t) service_id, (sysarg_t) index, LOWER32(size), 943 877 UPPER32(size)); 944 878 vfs_exchange_release(exch); … … 963 897 fibril_rwlock_write_lock(&file->node->contents_rwlock); 964 898 rc = vfs_truncate_internal(file->node->fs_handle, 965 file->node-> devmap_handle, file->node->index, size);899 file->node->service_id, file->node->index, size); 966 900 if (rc == EOK) 967 901 file->node->size = size; … … 997 931 998 932 aid_t msg; 999 msg = async_send_3(exch, VFS_OUT_STAT, file->node-> devmap_handle,933 msg = async_send_3(exch, VFS_OUT_STAT, file->node->service_id, 1000 934 file->node->index, true, NULL); 1001 935 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1050 984 1051 985 aid_t msg; 1052 msg = async_send_3(exch, VFS_OUT_STAT, node-> devmap_handle,986 msg = async_send_3(exch, VFS_OUT_STAT, node->service_id, 1053 987 node->index, false, NULL); 1054 988 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1227 1161 /* Check whether linking to the same file system instance. */ 1228 1162 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1229 (old_node-> devmap_handle != new_par_lr.triplet.devmap_handle)) {1163 (old_node->service_id != new_par_lr.triplet.service_id)) { 1230 1164 fibril_rwlock_write_unlock(&namespace_rwlock); 1231 1165 vfs_node_put(old_node); … … 1349 1283 } 1350 1284 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 1351 1291 /** 1352 1292 * @}
Note:
See TracChangeset
for help on using the changeset viewer.