Changes in uspace/srv/vfs/vfs_ops.c [27b76ca:286286c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r27b76ca r286286c 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); … … 639 646 aid_t msg; 640 647 ipc_call_t answer; 641 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, 642 649 file->node->index, &answer); 643 650 … … 724 731 if (read) { 725 732 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ, 726 file->node-> devmap_handle, file->node->index,733 file->node->service_id, file->node->index, 727 734 LOWER32(file->pos), UPPER32(file->pos), &answer); 728 735 } else { … … 731 738 732 739 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE, 733 file->node-> devmap_handle, file->node->index,740 file->node->service_id, file->node->index, 734 741 LOWER32(file->pos), UPPER32(file->pos), &answer); 735 742 } … … 862 869 } 863 870 864 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, 865 872 fs_index_t index, aoff64_t size) 866 873 { 867 874 async_exch_t *exch = vfs_exchange_grab(fs_handle); 868 875 sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE, 869 (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size),876 (sysarg_t) service_id, (sysarg_t) index, LOWER32(size), 870 877 UPPER32(size)); 871 878 vfs_exchange_release(exch); … … 890 897 fibril_rwlock_write_lock(&file->node->contents_rwlock); 891 898 rc = vfs_truncate_internal(file->node->fs_handle, 892 file->node-> devmap_handle, file->node->index, size);899 file->node->service_id, file->node->index, size); 893 900 if (rc == EOK) 894 901 file->node->size = size; … … 924 931 925 932 aid_t msg; 926 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, 927 934 file->node->index, true, NULL); 928 935 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 977 984 978 985 aid_t msg; 979 msg = async_send_3(exch, VFS_OUT_STAT, node-> devmap_handle,986 msg = async_send_3(exch, VFS_OUT_STAT, node->service_id, 980 987 node->index, false, NULL); 981 988 async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1154 1161 /* Check whether linking to the same file system instance. */ 1155 1162 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1156 (old_node-> devmap_handle != new_par_lr.triplet.devmap_handle)) {1163 (old_node->service_id != new_par_lr.triplet.service_id)) { 1157 1164 fibril_rwlock_write_unlock(&namespace_rwlock); 1158 1165 vfs_node_put(old_node);
Note:
See TracChangeset
for help on using the changeset viewer.