Changeset e8d5f9f in mainline
- Timestamp:
- 2011-05-31T23:11:28Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5d1b3aa
- Parents:
- 4ce90544 (diff), 25bef0ff (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. - Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/Makefile.common
r4ce90544 re8d5f9f 114 114 rootvirt \ 115 115 test1 \ 116 test2 116 test2 \ 117 test3 117 118 118 119 RD_DRV_CFG = -
uspace/Makefile
r4ce90544 re8d5f9f 90 90 drv/rootvirt \ 91 91 drv/test1 \ 92 drv/test2 92 drv/test2 \ 93 drv/test3 93 94 94 95 ## Networking -
uspace/app/tester/Makefile
r4ce90544 re8d5f9f 53 53 mm/malloc3.c \ 54 54 devs/devman1.c \ 55 devs/devman2.c \ 55 56 hw/misc/virtchar1.c \ 56 57 hw/serial/serial1.c -
uspace/app/tester/tester.c
r4ce90544 re8d5f9f 67 67 #include "hw/misc/virtchar1.def" 68 68 #include "devs/devman1.def" 69 #include "devs/devman2.def" 69 70 {NULL, NULL, NULL, false} 70 71 }; -
uspace/app/tester/tester.h
r4ce90544 re8d5f9f 100 100 extern const char *test_virtchar1(void); 101 101 extern const char *test_devman1(void); 102 extern const char *test_devman2(void); 102 103 103 104 extern test_t tests[]; -
uspace/drv/rootvirt/devices.def
r4ce90544 re8d5f9f 21 21 .match_id = "virtual&test1" 22 22 }, 23 { 24 .name = "test3", 25 .match_id = "virtual&test3" 26 }, 23 27 #endif -
uspace/srv/vfs/vfs.h
r4ce90544 re8d5f9f 176 176 vfs_pair_t *, ...); 177 177 extern int vfs_open_node_internal(vfs_lookup_res_t *); 178 extern int vfs_close_internal(vfs_file_t *);179 178 180 179 extern bool vfs_nodes_init(void); -
uspace/srv/vfs/vfs_file.c
r4ce90544 re8d5f9f 79 79 for (i = 0; i < MAX_OPEN_FILES; i++) { 80 80 if (FILES[i]) { 81 (void) vfs_close_internal(FILES[i]);82 81 (void) vfs_fd_free(i); 83 82 } … … 108 107 } 109 108 109 /** Close the file in the endpoint FS server. */ 110 static int vfs_file_close_remote(vfs_file_t *file) 111 { 112 ipc_call_t answer; 113 aid_t msg; 114 sysarg_t rc; 115 int phone; 116 117 assert(!file->refcnt); 118 119 phone = vfs_grab_phone(file->node->fs_handle); 120 msg = async_send_2(phone, VFS_OUT_CLOSE, file->node->devmap_handle, 121 file->node->index, &answer); 122 async_wait_for(msg, &rc); 123 vfs_release_phone(file->node->fs_handle, phone); 124 125 return IPC_GET_ARG1(answer); 126 } 127 128 110 129 /** Increment reference count of VFS file structure. 111 130 * … … 125 144 * decremented. 126 145 */ 127 static void vfs_file_delref(vfs_file_t *file) 128 { 146 static int vfs_file_delref(vfs_file_t *file) 147 { 148 int rc = EOK; 149 129 150 assert(fibril_mutex_is_locked(&VFS_DATA->lock)); 130 151 131 152 if (file->refcnt-- == 1) { 132 153 /* 133 * Lost the last reference to a file, need to drop our reference134 * to the underlying VFS node.154 * Lost the last reference to a file, need to close it in the 155 * endpoint FS and drop our reference to the underlying VFS node. 135 156 */ 157 rc = vfs_file_close_remote(file); 136 158 vfs_node_delref(file->node); 137 159 free(file); 138 160 } 161 162 return rc; 139 163 } 140 164 … … 201 225 int vfs_fd_free(int fd) 202 226 { 227 int rc; 228 203 229 if (!vfs_files_init()) 204 230 return ENOMEM; … … 210 236 } 211 237 212 vfs_file_delref(FILES[fd]);238 rc = vfs_file_delref(FILES[fd]); 213 239 FILES[fd] = NULL; 214 240 fibril_mutex_unlock(&VFS_DATA->lock); 215 241 216 return EOK;242 return rc; 217 243 } 218 244 -
uspace/srv/vfs/vfs_ops.c
r4ce90544 re8d5f9f 717 717 } 718 718 719 int vfs_close_internal(vfs_file_t *file)720 {721 /*722 * Lock the open file structure so that no other thread can manipulate723 * the same open file at a time.724 */725 fibril_mutex_lock(&file->lock);726 727 if (file->refcnt <= 1) {728 /* Only close the file on the destination FS server729 if there are no more file descriptors (except the730 present one) pointing to this file. */731 732 int fs_phone = vfs_grab_phone(file->node->fs_handle);733 734 /* Make a VFS_OUT_CLOSE request at the destination FS server. */735 aid_t msg;736 ipc_call_t answer;737 msg = async_send_2(fs_phone, VFS_OUT_CLOSE,738 file->node->devmap_handle, file->node->index, &answer);739 740 /* Wait for reply from the FS server. */741 sysarg_t rc;742 async_wait_for(msg, &rc);743 744 vfs_release_phone(file->node->fs_handle, fs_phone);745 fibril_mutex_unlock(&file->lock);746 747 return IPC_GET_ARG1(answer);748 }749 750 fibril_mutex_unlock(&file->lock);751 return EOK;752 }753 754 719 void vfs_close(ipc_callid_t rid, ipc_call_t *request) 755 720 { 756 721 int fd = IPC_GET_ARG1(*request); 757 758 /* Lookup the file structure corresponding to the file descriptor. */ 759 vfs_file_t *file = vfs_file_get(fd); 760 if (!file) { 761 async_answer_0(rid, ENOENT); 762 return; 763 } 764 765 int ret = vfs_close_internal(file); 766 if (ret != EOK) 767 async_answer_0(rid, ret); 768 769 vfs_file_put(file); 722 int ret; 723 770 724 ret = vfs_fd_free(fd); 771 725 async_answer_0(rid, ret); … … 1369 1323 fibril_mutex_lock(&oldfile->lock); 1370 1324 1371 /* Lookup an open file structure possibly corresponding to newfd. */ 1372 vfs_file_t *newfile = vfs_file_get(newfd); 1373 if (newfile) { 1374 /* Close the originally opened file. */ 1375 int ret = vfs_close_internal(newfile); 1376 if (ret != EOK) { 1377 fibril_mutex_unlock(&oldfile->lock); 1378 vfs_file_put(oldfile); 1379 vfs_file_put(newfile); 1380 async_answer_0(rid, ret); 1381 return; 1382 } 1383 1384 ret = vfs_fd_free(newfd); 1385 if (ret != EOK) { 1386 fibril_mutex_unlock(&oldfile->lock); 1387 vfs_file_put(oldfile); 1388 vfs_file_put(newfile); 1389 async_answer_0(rid, ret); 1390 return; 1391 } 1392 vfs_file_put(newfile); 1393 } 1325 /* Make sure newfd is closed. */ 1326 (void) vfs_fd_free(newfd); 1394 1327 1395 1328 /* Assign the old file to newfd. */
Note:
See TracChangeset
for help on using the changeset viewer.