Changes in uspace/srv/vfs/vfs_ops.c [2b88074b:0da4e41] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_ops.c
r2b88074b r0da4e41 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 … … 1325 1310 } 1326 1311 1327 void vfs_dup(ipc_callid_t rid, ipc_call_t *request)1328 {1329 int oldfd = IPC_GET_ARG1(*request);1330 int newfd = IPC_GET_ARG2(*request);1331 1332 /* Lookup the file structure corresponding to oldfd. */1333 vfs_file_t *oldfile = vfs_file_get(oldfd);1334 if (!oldfile) {1335 ipc_answer_0(rid, EBADF);1336 return;1337 }1338 1339 /* If the file descriptors are the same, do nothing. */1340 if (oldfd == newfd) {1341 ipc_answer_1(rid, EOK, newfd);1342 return;1343 }1344 1345 /*1346 * Lock the open file structure so that no other thread can manipulate1347 * the same open file at a time.1348 */1349 fibril_mutex_lock(&oldfile->lock);1350 1351 /* Lookup an open file structure possibly corresponding to newfd. */1352 vfs_file_t *newfile = vfs_file_get(newfd);1353 if (newfile) {1354 /* Close the originally opened file. */1355 int ret = vfs_close_internal(newfile);1356 if (ret != EOK) {1357 ipc_answer_0(rid, ret);1358 return;1359 }1360 1361 ret = vfs_fd_free(newfd);1362 if (ret != EOK) {1363 ipc_answer_0(rid, ret);1364 return;1365 }1366 }1367 1368 /* Assign the old file to newfd. */1369 int ret = vfs_fd_assign(oldfile, newfd);1370 fibril_mutex_unlock(&oldfile->lock);1371 1372 if (ret != EOK)1373 ipc_answer_0(rid, ret);1374 else1375 ipc_answer_1(rid, EOK, newfd);1376 }1377 1378 1312 /** 1379 1313 * @}
Note:
See TracChangeset
for help on using the changeset viewer.