Changes in uspace/srv/vfs/vfs_ops.c [4cac2d69:3a4b3ba] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r4cac2d69 r3a4b3ba 38 38 #include "vfs.h" 39 39 #include <ipc/ipc.h> 40 #include <macros.h> 41 #include <stdint.h> 40 42 #include <async.h> 41 43 #include <errno.h> 42 44 #include <stdio.h> 43 45 #include <stdlib.h> 44 #include <str ing.h>46 #include <str.h> 45 47 #include <bool.h> 46 48 #include <fibril_synch.h> … … 53 55 54 56 /* Forward declarations of static functions. */ 55 static int vfs_truncate_internal(fs_handle_t, dev_handle_t, fs_index_t, size_t); 57 static int vfs_truncate_internal(fs_handle_t, devmap_handle_t, fs_index_t, 58 aoff64_t); 56 59 57 60 /** … … 63 66 vfs_pair_t rootfs = { 64 67 .fs_handle = 0, 65 .dev _handle = 068 .devmap_handle = 0 66 69 }; 67 70 68 static void vfs_mount_internal(ipc_callid_t rid, dev _handle_t dev_handle,71 static void vfs_mount_internal(ipc_callid_t rid, devmap_handle_t devmap_handle, 69 72 fs_handle_t fs_handle, char *mp, char *opts) 70 73 { … … 123 126 phone = vfs_grab_phone(fs_handle); 124 127 msg = async_send_1(phone, VFS_OUT_MOUNTED, 125 (ipcarg_t) dev _handle, &answer);128 (ipcarg_t) devmap_handle, &answer); 126 129 /* send the mount options */ 127 130 rc = async_data_write_start(phone, (void *)opts, … … 129 132 if (rc != EOK) { 130 133 async_wait_for(msg, NULL); 131 vfs_release_phone( phone);134 vfs_release_phone(fs_handle, phone); 132 135 fibril_rwlock_write_unlock(&namespace_rwlock); 133 136 ipc_answer_0(rid, rc); … … 135 138 } 136 139 async_wait_for(msg, &rc); 137 vfs_release_phone( phone);140 vfs_release_phone(fs_handle, phone); 138 141 139 142 if (rc != EOK) { … … 148 151 149 152 mr_res.triplet.fs_handle = fs_handle; 150 mr_res.triplet.dev _handle = dev_handle;153 mr_res.triplet.devmap_handle = devmap_handle; 151 154 mr_res.triplet.index = rindex; 152 155 mr_res.size = rsize; … … 155 158 156 159 rootfs.fs_handle = fs_handle; 157 rootfs.dev _handle = dev_handle;160 rootfs.devmap_handle = devmap_handle; 158 161 159 162 /* Add reference to the mounted root. */ … … 185 188 phone = vfs_grab_phone(mp_res.triplet.fs_handle); 186 189 msg = async_send_4(phone, VFS_OUT_MOUNT, 187 (ipcarg_t) mp_res.triplet.dev _handle,190 (ipcarg_t) mp_res.triplet.devmap_handle, 188 191 (ipcarg_t) mp_res.triplet.index, 189 192 (ipcarg_t) fs_handle, 190 (ipcarg_t) dev _handle, &answer);193 (ipcarg_t) devmap_handle, &answer); 191 194 192 195 /* send connection */ … … 194 197 if (rc != EOK) { 195 198 async_wait_for(msg, NULL); 196 vfs_release_phone( mountee_phone);197 vfs_release_phone( phone);199 vfs_release_phone(fs_handle, mountee_phone); 200 vfs_release_phone(mp_res.triplet.fs_handle, phone); 198 201 /* Mount failed, drop reference to mp_node. */ 199 202 if (mp_node) … … 204 207 } 205 208 206 vfs_release_phone( mountee_phone);209 vfs_release_phone(fs_handle, mountee_phone); 207 210 208 211 /* send the mount options */ … … 210 213 if (rc != EOK) { 211 214 async_wait_for(msg, NULL); 212 vfs_release_phone( phone);215 vfs_release_phone(mp_res.triplet.fs_handle, phone); 213 216 /* Mount failed, drop reference to mp_node. */ 214 217 if (mp_node) … … 219 222 } 220 223 async_wait_for(msg, &rc); 221 vfs_release_phone( phone);224 vfs_release_phone(mp_res.triplet.fs_handle, phone); 222 225 223 226 if (rc == EOK) { … … 227 230 228 231 mr_res.triplet.fs_handle = fs_handle; 229 mr_res.triplet.dev _handle = dev_handle;232 mr_res.triplet.devmap_handle = devmap_handle; 230 233 mr_res.triplet.index = rindex; 231 234 mr_res.size = rsize; … … 248 251 void vfs_mount(ipc_callid_t rid, ipc_call_t *request) 249 252 { 253 devmap_handle_t devmap_handle; 254 250 255 /* 251 256 * We expect the library to do the device-name to device-handle … … 253 258 * in the request. 254 259 */ 255 dev _handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);260 devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request); 256 261 257 262 /* … … 289 294 */ 290 295 char *fs_name; 291 rc = async_data_write_accept((void **) &fs_name, true, 0, FS_NAME_MAXLEN,292 0, NULL);296 rc = async_data_write_accept((void **) &fs_name, true, 0, 297 FS_NAME_MAXLEN, 0, NULL); 293 298 if (rc != EOK) { 294 299 free(mp); … … 341 346 342 347 /* Do the mount */ 343 vfs_mount_internal(rid, dev _handle, fs_handle, mp, opts);348 vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts); 344 349 free(mp); 345 350 free(fs_name); … … 353 358 vfs_lookup_res_t mp_res; 354 359 vfs_lookup_res_t mr_res; 355 vfs_node_t *mp_node;356 360 vfs_node_t *mr_node; 357 361 int phone; … … 401 405 */ 402 406 if (vfs_nodes_refcount_sum_get(mr_node->fs_handle, 403 mr_node->dev _handle) != 2) {407 mr_node->devmap_handle) != 2) { 404 408 fibril_rwlock_write_unlock(&namespace_rwlock); 405 409 vfs_node_put(mr_node); … … 421 425 phone = vfs_grab_phone(mr_node->fs_handle); 422 426 rc = async_req_1_0(phone, VFS_OUT_UNMOUNTED, 423 mr_node->dev _handle);424 vfs_release_phone( phone);427 mr_node->devmap_handle); 428 vfs_release_phone(mr_node->fs_handle, phone); 425 429 if (rc != EOK) { 426 430 fibril_rwlock_write_unlock(&namespace_rwlock); … … 430 434 } 431 435 rootfs.fs_handle = 0; 432 rootfs.dev _handle = 0;436 rootfs.devmap_handle = 0; 433 437 } else { 434 438 … … 457 461 458 462 phone = vfs_grab_phone(mp_node->fs_handle); 459 rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, mp_node->dev_handle,460 mp_node-> index);461 vfs_release_phone( phone);463 rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, 464 mp_node->devmap_handle, mp_node->index); 465 vfs_release_phone(mp_node->fs_handle, phone); 462 466 if (rc != EOK) { 463 467 fibril_rwlock_write_unlock(&namespace_rwlock); … … 503 507 int oflag = IPC_GET_ARG2(*request); 504 508 int mode = IPC_GET_ARG3(*request); 505 size_t len;506 509 507 510 /* Ignore mode for now. */ … … 569 572 if (node->size) { 570 573 rc = vfs_truncate_internal(node->fs_handle, 571 node->dev _handle, node->index, 0);574 node->devmap_handle, node->index, 0); 572 575 if (rc) { 573 576 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 592 595 } 593 596 vfs_file_t *file = vfs_file_get(fd); 597 assert(file); 594 598 file->node = node; 595 599 if (oflag & O_APPEND) … … 625 629 626 630 lr.triplet.fs_handle = IPC_GET_ARG1(*request); 627 lr.triplet.dev _handle = IPC_GET_ARG2(*request);631 lr.triplet.devmap_handle = IPC_GET_ARG2(*request); 628 632 lr.triplet.index = IPC_GET_ARG3(*request); 629 633 int oflag = IPC_GET_ARG4(*request); … … 646 650 if (node->size) { 647 651 rc = vfs_truncate_internal(node->fs_handle, 648 node->dev _handle, node->index, 0);652 node->devmap_handle, node->index, 0); 649 653 if (rc) { 650 654 fibril_rwlock_write_unlock(&node->contents_rwlock); … … 708 712 aid_t msg; 709 713 ipc_call_t answer; 710 msg = async_send_2(fs_phone, VFS_OUT_SYNC, file->node->dev _handle,714 msg = async_send_2(fs_phone, VFS_OUT_SYNC, file->node->devmap_handle, 711 715 file->node->index, &answer); 712 716 … … 715 719 async_wait_for(msg, &rc); 716 720 717 vfs_release_phone(f s_phone);721 vfs_release_phone(file->node->fs_handle, fs_phone); 718 722 fibril_mutex_unlock(&file->lock); 719 723 … … 739 743 aid_t msg; 740 744 ipc_call_t answer; 741 msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle,742 file->node-> index, &answer);745 msg = async_send_2(fs_phone, VFS_OUT_CLOSE, 746 file->node->devmap_handle, file->node->index, &answer); 743 747 744 748 /* Wait for reply from the FS server. */ … … 746 750 async_wait_for(msg, &rc); 747 751 748 vfs_release_phone(f s_phone);752 vfs_release_phone(file->node->fs_handle, fs_phone); 749 753 fibril_mutex_unlock(&file->lock); 750 754 … … 833 837 ipc_call_t answer; 834 838 if (read) { 839 rc = async_data_read_forward_3_1(fs_phone, VFS_OUT_READ, 840 file->node->devmap_handle, file->node->index, file->pos, 841 &answer); 842 } else { 835 843 if (file->append) 836 844 file->pos = file->node->size; 837 845 838 rc = async_data_ read_forward_3_1(fs_phone, VFS_OUT_READ,839 file->node->dev _handle, file->node->index, file->pos,846 rc = async_data_write_forward_3_1(fs_phone, VFS_OUT_WRITE, 847 file->node->devmap_handle, file->node->index, file->pos, 840 848 &answer); 841 } else { 842 rc = async_data_write_forward_3_1(fs_phone, VFS_OUT_WRITE, 843 file->node->dev_handle, file->node->index, file->pos, 844 &answer); 845 } 846 847 vfs_release_phone(fs_phone); 849 } 850 851 vfs_release_phone(file->node->fs_handle, fs_phone); 848 852 849 853 size_t bytes = IPC_GET_ARG1(answer); … … 887 891 { 888 892 int fd = (int) IPC_GET_ARG1(*request); 889 off _t off = (off_t) IPC_GET_ARG2(*request);890 int whence = (int) IPC_GET_ARG3(*request);891 892 893 off64_t off = (off64_t) MERGE_LOUP32(IPC_GET_ARG2(*request), 894 IPC_GET_ARG3(*request)); 895 int whence = (int) IPC_GET_ARG4(*request); 896 893 897 /* Lookup the file structure corresponding to the file descriptor. */ 894 898 vfs_file_t *file = vfs_file_get(fd); … … 897 901 return; 898 902 } 899 900 off_t newpos; 903 901 904 fibril_mutex_lock(&file->lock); 902 if (whence == SEEK_SET) { 903 file->pos = off; 904 fibril_mutex_unlock(&file->lock); 905 ipc_answer_1(rid, EOK, off); 906 return; 907 } 908 if (whence == SEEK_CUR) { 909 if (file->pos + off < file->pos) { 905 906 off64_t newoff; 907 switch (whence) { 908 case SEEK_SET: 909 if (off >= 0) { 910 file->pos = (aoff64_t) off; 911 fibril_mutex_unlock(&file->lock); 912 ipc_answer_1(rid, EOK, off); 913 return; 914 } 915 break; 916 case SEEK_CUR: 917 if ((off >= 0) && (file->pos + off < file->pos)) { 910 918 fibril_mutex_unlock(&file->lock); 911 919 ipc_answer_0(rid, EOVERFLOW); 912 920 return; 913 921 } 914 file->pos += off; 915 newpos = file->pos; 916 fibril_mutex_unlock(&file->lock); 917 ipc_answer_1(rid, EOK, newpos); 918 return; 919 } 920 if (whence == SEEK_END) { 921 fibril_rwlock_read_lock(&file->node->contents_rwlock); 922 size_t size = file->node->size; 923 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 924 if (size + off < size) { 922 923 if ((off < 0) && (file->pos < (aoff64_t) -off)) { 925 924 fibril_mutex_unlock(&file->lock); 926 925 ipc_answer_0(rid, EOVERFLOW); 927 926 return; 928 927 } 929 newpos = size + off; 930 file->pos = newpos; 928 929 file->pos += off; 930 newoff = (file->pos > OFF64_MAX) ? OFF64_MAX : file->pos; 931 931 932 fibril_mutex_unlock(&file->lock); 932 ipc_answer_1(rid, EOK, newpos); 933 return; 934 } 933 ipc_answer_2(rid, EOK, LOWER32(newoff), 934 UPPER32(newoff)); 935 return; 936 case SEEK_END: 937 fibril_rwlock_read_lock(&file->node->contents_rwlock); 938 aoff64_t size = file->node->size; 939 940 if ((off >= 0) && (size + off < size)) { 941 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 942 fibril_mutex_unlock(&file->lock); 943 ipc_answer_0(rid, EOVERFLOW); 944 return; 945 } 946 947 if ((off < 0) && (size < (aoff64_t) -off)) { 948 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 949 fibril_mutex_unlock(&file->lock); 950 ipc_answer_0(rid, EOVERFLOW); 951 return; 952 } 953 954 file->pos = size + off; 955 newoff = (file->pos > OFF64_MAX) ? OFF64_MAX : file->pos; 956 957 fibril_rwlock_read_unlock(&file->node->contents_rwlock); 958 fibril_mutex_unlock(&file->lock); 959 ipc_answer_2(rid, EOK, LOWER32(newoff), UPPER32(newoff)); 960 return; 961 } 962 935 963 fibril_mutex_unlock(&file->lock); 936 964 ipc_answer_0(rid, EINVAL); 937 965 } 938 966 939 int 940 vfs_truncate_internal(fs_handle_t fs_handle, dev_handle_t dev_handle, 941 fs_index_t index, size_t size) 967 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle, 968 fs_index_t index, aoff64_t size) 942 969 { 943 970 ipcarg_t rc; … … 945 972 946 973 fs_phone = vfs_grab_phone(fs_handle); 947 rc = async_req_ 3_0(fs_phone, VFS_OUT_TRUNCATE, (ipcarg_t)dev_handle,948 (ipcarg_t) index, (ipcarg_t)size);949 vfs_release_phone(fs_ phone);974 rc = async_req_4_0(fs_phone, VFS_OUT_TRUNCATE, (ipcarg_t) devmap_handle, 975 (ipcarg_t) index, LOWER32(size), UPPER32(size)); 976 vfs_release_phone(fs_handle, fs_phone); 950 977 return (int)rc; 951 978 } … … 954 981 { 955 982 int fd = IPC_GET_ARG1(*request); 956 size_t size = IPC_GET_ARG2(*request); 983 aoff64_t size = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(*request), 984 IPC_GET_ARG3(*request)); 957 985 int rc; 958 986 … … 966 994 fibril_rwlock_write_lock(&file->node->contents_rwlock); 967 995 rc = vfs_truncate_internal(file->node->fs_handle, 968 file->node->dev _handle, file->node->index, size);996 file->node->devmap_handle, file->node->index, size); 969 997 if (rc == EOK) 970 998 file->node->size = size; … … 998 1026 999 1027 aid_t msg; 1000 msg = async_send_3(fs_phone, VFS_OUT_STAT, file->node->dev _handle,1028 msg = async_send_3(fs_phone, VFS_OUT_STAT, file->node->devmap_handle, 1001 1029 file->node->index, true, NULL); 1002 1030 ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); 1003 1031 async_wait_for(msg, &rc); 1004 vfs_release_phone(f s_phone);1032 vfs_release_phone(file->node->fs_handle, fs_phone); 1005 1033 1006 1034 fibril_mutex_unlock(&file->lock); … … 1047 1075 int fs_phone = vfs_grab_phone(node->fs_handle); 1048 1076 aid_t msg; 1049 msg = async_send_3(fs_phone, VFS_OUT_STAT, node->dev _handle,1077 msg = async_send_3(fs_phone, VFS_OUT_STAT, node->devmap_handle, 1050 1078 node->index, false, NULL); 1051 1079 ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); … … 1053 1081 ipcarg_t rv; 1054 1082 async_wait_for(msg, &rv); 1055 vfs_release_phone( fs_phone);1083 vfs_release_phone(node->fs_handle, fs_phone); 1056 1084 1057 1085 ipc_answer_0(rid, rv); … … 1221 1249 /* Check whether linking to the same file system instance. */ 1222 1250 if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || 1223 (old_node->dev _handle != new_par_lr.triplet.dev_handle)) {1251 (old_node->devmap_handle != new_par_lr.triplet.devmap_handle)) { 1224 1252 fibril_rwlock_write_unlock(&namespace_rwlock); 1225 1253 ipc_answer_0(rid, EXDEV); /* different file systems */ … … 1331 1359 int ret = vfs_close_internal(newfile); 1332 1360 if (ret != EOK) { 1361 fibril_mutex_unlock(&oldfile->lock); 1333 1362 ipc_answer_0(rid, ret); 1334 1363 return; … … 1337 1366 ret = vfs_fd_free(newfd); 1338 1367 if (ret != EOK) { 1368 fibril_mutex_unlock(&oldfile->lock); 1339 1369 ipc_answer_0(rid, ret); 1340 1370 return;
Note:
See TracChangeset
for help on using the changeset viewer.