Changes in uspace/srv/vfs/vfs_ops.c [08232ee:dd2cfa7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r08232ee rdd2cfa7 44 44 #include <string.h> 45 45 #include <bool.h> 46 #include <fibril_sync h.h>46 #include <fibril_sync.h> 47 47 #include <adt/list.h> 48 48 #include <unistd.h> … … 125 125 (ipcarg_t) dev_handle, &answer); 126 126 /* send the mount options */ 127 rc = async_data_write_start(phone, (void *)opts,127 rc = ipc_data_write_start(phone, (void *)opts, 128 128 str_size(opts)); 129 129 if (rc != EOK) { … … 207 207 208 208 /* send the mount options */ 209 rc = async_data_write_start(phone, (void *)opts, str_size(opts));209 rc = ipc_data_write_start(phone, (void *)opts, str_size(opts)); 210 210 if (rc != EOK) { 211 211 async_wait_for(msg, NULL); … … 268 268 ipc_callid_t callid; 269 269 size_t size; 270 if (! async_data_write_receive(&callid, &size)) {270 if (!ipc_data_write_receive(&callid, &size)) { 271 271 ipc_answer_0(callid, EINVAL); 272 272 ipc_answer_0(rid, EINVAL); … … 290 290 291 291 /* Deliver the mount point. */ 292 ipcarg_t retval = async_data_write_finalize(callid, mp, size);292 ipcarg_t retval = ipc_data_write_finalize(callid, mp, size); 293 293 if (retval != EOK) { 294 294 ipc_answer_0(rid, retval); … … 299 299 300 300 /* Now we expect to receive the mount options. */ 301 if (! async_data_write_receive(&callid, &size)) {301 if (!ipc_data_write_receive(&callid, &size)) { 302 302 ipc_answer_0(callid, EINVAL); 303 303 ipc_answer_0(rid, EINVAL); … … 324 324 325 325 /* Deliver the mount options. */ 326 retval = async_data_write_finalize(callid, opts, size);326 retval = ipc_data_write_finalize(callid, opts, size); 327 327 if (retval != EOK) { 328 328 ipc_answer_0(rid, retval); … … 337 337 * system. 338 338 */ 339 if (! async_data_write_receive(&callid, &size)) {339 if (!ipc_data_write_receive(&callid, &size)) { 340 340 ipc_answer_0(callid, EINVAL); 341 341 ipc_answer_0(rid, EINVAL); … … 370 370 371 371 /* Deliver the file system name. */ 372 retval = async_data_write_finalize(callid, fs_name, size);372 retval = ipc_data_write_finalize(callid, fs_name, size); 373 373 if (retval != EOK) { 374 374 ipc_answer_0(rid, retval); … … 469 469 470 470 ipc_callid_t callid; 471 if (! async_data_write_receive(&callid, &len)) {471 if (!ipc_data_write_receive(&callid, &len)) { 472 472 ipc_answer_0(callid, EINVAL); 473 473 ipc_answer_0(rid, EINVAL); … … 483 483 484 484 int rc; 485 if ((rc = async_data_write_finalize(callid, path, len))) {485 if ((rc = ipc_data_write_finalize(callid, path, len))) { 486 486 ipc_answer_0(rid, rc); 487 487 free(path); … … 543 543 * structure. 544 544 */ 545 int fd = vfs_fd_alloc( (oflag & O_DESC) != 0);545 int fd = vfs_fd_alloc(); 546 546 if (fd < 0) { 547 547 vfs_node_put(node); … … 620 620 * structure. 621 621 */ 622 int fd = vfs_fd_alloc( (oflag & O_DESC) != 0);622 int fd = vfs_fd_alloc(); 623 623 if (fd < 0) { 624 624 vfs_node_put(node); … … 679 679 } 680 680 681 static int vfs_close_internal(vfs_file_t *file)682 {683 /*684 * Lock the open file structure so that no other thread can manipulate685 * the same open file at a time.686 */687 fibril_mutex_lock(&file->lock);688 689 if (file->refcnt <= 1) {690 /* Only close the file on the destination FS server691 if there are no more file descriptors (except the692 present one) pointing to this file. */693 694 int fs_phone = vfs_grab_phone(file->node->fs_handle);695 696 /* Make a VFS_OUT_CLOSE request at the destination FS server. */697 aid_t msg;698 ipc_call_t answer;699 msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle,700 file->node->index, &answer);701 702 /* Wait for reply from the FS server. */703 ipcarg_t rc;704 async_wait_for(msg, &rc);705 706 vfs_release_phone(fs_phone);707 fibril_mutex_unlock(&file->lock);708 709 return IPC_GET_ARG1(answer);710 }711 712 fibril_mutex_unlock(&file->lock);713 return EOK;714 }715 716 681 void vfs_close(ipc_callid_t rid, ipc_call_t *request) 717 682 { … … 725 690 } 726 691 727 int ret = vfs_close_internal(file); 728 if (ret != EOK) 729 ipc_answer_0(rid, ret); 730 731 ret = vfs_fd_free(fd); 732 ipc_answer_0(rid, ret); 692 /* 693 * Lock the open file structure so that no other thread can manipulate 694 * the same open file at a time. 695 */ 696 fibril_mutex_lock(&file->lock); 697 int fs_phone = vfs_grab_phone(file->node->fs_handle); 698 699 /* Make a VFS_OUT_CLOSE request at the destination FS server. */ 700 aid_t msg; 701 ipc_call_t answer; 702 msg = async_send_2(fs_phone, VFS_OUT_CLOSE, file->node->dev_handle, 703 file->node->index, &answer); 704 705 /* Wait for reply from the FS server. */ 706 ipcarg_t rc; 707 async_wait_for(msg, &rc); 708 709 vfs_release_phone(fs_phone); 710 fibril_mutex_unlock(&file->lock); 711 712 int retval = IPC_GET_ARG1(answer); 713 if (retval != EOK) 714 ipc_answer_0(rid, retval); 715 716 retval = vfs_fd_free(fd); 717 ipc_answer_0(rid, retval); 733 718 } 734 719 … … 762 747 int res; 763 748 if (read) 764 res = async_data_read_receive(&callid, NULL);749 res = ipc_data_read_receive(&callid, NULL); 765 750 else 766 res = async_data_write_receive(&callid, NULL);751 res = ipc_data_write_receive(&callid, NULL); 767 752 if (!res) { 768 753 ipc_answer_0(callid, EINVAL); … … 900 885 } 901 886 newpos = size + off; 902 file->pos = newpos;903 887 fibril_mutex_unlock(&file->lock); 904 888 ipc_answer_1(rid, EOK, newpos); … … 950 934 { 951 935 int fd = IPC_GET_ARG1(*request); 936 size_t size = IPC_GET_ARG2(*request); 952 937 ipcarg_t rc; 953 938 … … 959 944 960 945 ipc_callid_t callid; 961 if (! async_data_read_receive(&callid, NULL)) {946 if (!ipc_data_read_receive(&callid, NULL)) { 962 947 ipc_answer_0(callid, EINVAL); 963 948 ipc_answer_0(rid, EINVAL); … … 985 970 ipc_callid_t callid; 986 971 987 if (! async_data_write_receive(&callid, &len)) {972 if (!ipc_data_write_receive(&callid, &len)) { 988 973 ipc_answer_0(callid, EINVAL); 989 974 ipc_answer_0(rid, EINVAL); … … 997 982 } 998 983 int rc; 999 if ((rc = async_data_write_finalize(callid, path, len))) {984 if ((rc = ipc_data_write_finalize(callid, path, len))) { 1000 985 ipc_answer_0(rid, rc); 1001 986 free(path); … … 1004 989 path[len] = '\0'; 1005 990 1006 if (! async_data_read_receive(&callid, NULL)) {991 if (!ipc_data_read_receive(&callid, NULL)) { 1007 992 free(path); 1008 993 ipc_answer_0(callid, EINVAL); … … 1053 1038 ipc_callid_t callid; 1054 1039 1055 if (! async_data_write_receive(&callid, &len)) {1040 if (!ipc_data_write_receive(&callid, &len)) { 1056 1041 ipc_answer_0(callid, EINVAL); 1057 1042 ipc_answer_0(rid, EINVAL); … … 1065 1050 } 1066 1051 int rc; 1067 if ((rc = async_data_write_finalize(callid, path, len))) {1052 if ((rc = ipc_data_write_finalize(callid, path, len))) { 1068 1053 ipc_answer_0(rid, rc); 1069 1054 free(path); … … 1090 1075 ipc_callid_t callid; 1091 1076 1092 if (! async_data_write_receive(&callid, &len)) {1077 if (!ipc_data_write_receive(&callid, &len)) { 1093 1078 ipc_answer_0(callid, EINVAL); 1094 1079 ipc_answer_0(rid, EINVAL); … … 1102 1087 } 1103 1088 int rc; 1104 if ((rc = async_data_write_finalize(callid, path, len))) {1089 if ((rc = ipc_data_write_finalize(callid, path, len))) { 1105 1090 ipc_answer_0(rid, rc); 1106 1091 free(path); … … 1141 1126 1142 1127 /* Retrieve the old path. */ 1143 if (! async_data_write_receive(&callid, &olen)) {1128 if (!ipc_data_write_receive(&callid, &olen)) { 1144 1129 ipc_answer_0(callid, EINVAL); 1145 1130 ipc_answer_0(rid, EINVAL); … … 1152 1137 return; 1153 1138 } 1154 if ((rc = async_data_write_finalize(callid, old, olen))) {1139 if ((rc = ipc_data_write_finalize(callid, old, olen))) { 1155 1140 ipc_answer_0(rid, rc); 1156 1141 free(old); … … 1160 1145 1161 1146 /* Retrieve the new path. */ 1162 if (! async_data_write_receive(&callid, &nlen)) {1147 if (!ipc_data_write_receive(&callid, &nlen)) { 1163 1148 ipc_answer_0(callid, EINVAL); 1164 1149 ipc_answer_0(rid, EINVAL); … … 1173 1158 return; 1174 1159 } 1175 if ((rc = async_data_write_finalize(callid, new, nlen))) {1160 if ((rc = ipc_data_write_finalize(callid, new, nlen))) { 1176 1161 ipc_answer_0(rid, rc); 1177 1162 free(old); … … 1326 1311 } 1327 1312 1328 void vfs_dup(ipc_callid_t rid, ipc_call_t *request)1329 {1330 int oldfd = IPC_GET_ARG1(*request);1331 int newfd = IPC_GET_ARG2(*request);1332 1333 /* Lookup the file structure corresponding to oldfd. */1334 vfs_file_t *oldfile = vfs_file_get(oldfd);1335 if (!oldfile) {1336 ipc_answer_0(rid, EBADF);1337 return;1338 }1339 1340 /* If the file descriptors are the same, do nothing. */1341 if (oldfd == newfd) {1342 ipc_answer_1(rid, EOK, newfd);1343 return;1344 }1345 1346 /*1347 * Lock the open file structure so that no other thread can manipulate1348 * the same open file at a time.1349 */1350 fibril_mutex_lock(&oldfile->lock);1351 1352 /* Lookup an open file structure possibly corresponding to newfd. */1353 vfs_file_t *newfile = vfs_file_get(newfd);1354 if (newfile) {1355 /* Close the originally opened file. */1356 int ret = vfs_close_internal(newfile);1357 if (ret != EOK) {1358 ipc_answer_0(rid, ret);1359 return;1360 }1361 1362 ret = vfs_fd_free(newfd);1363 if (ret != EOK) {1364 ipc_answer_0(rid, ret);1365 return;1366 }1367 }1368 1369 /* Assign the old file to newfd. */1370 int ret = vfs_fd_assign(oldfile, newfd);1371 fibril_mutex_unlock(&oldfile->lock);1372 1373 if (ret != EOK)1374 ipc_answer_0(rid, ret);1375 else1376 ipc_answer_1(rid, EOK, newfd);1377 }1378 1379 1313 /** 1380 1314 * @}
Note:
See TracChangeset
for help on using the changeset viewer.