Changeset a35b458 in mainline for uspace/srv/vfs/vfs_file.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_file.c
r3061bc1 ra35b458 94 94 (void) _vfs_fd_free(vfs_data, i); 95 95 } 96 96 97 97 free(vfs_data->files); 98 98 … … 100 100 link_t *lnk; 101 101 vfs_boxed_handle_t *bh; 102 102 103 103 lnk = list_first(&vfs_data->passed_handles); 104 104 list_remove(lnk); … … 120 120 vfs_data->files = NULL; 121 121 } 122 122 123 123 return vfs_data; 124 124 } … … 136 136 { 137 137 assert(!file->refcnt); 138 138 139 139 async_exch_t *exch = vfs_exchange_grab(file->node->fs_handle); 140 140 141 141 ipc_call_t answer; 142 142 aid_t msg = async_send_2(exch, VFS_OUT_CLOSE, file->node->service_id, 143 143 file->node->index, &answer); 144 144 145 145 vfs_exchange_release(exch); 146 146 147 147 errno_t rc; 148 148 async_wait_for(msg, &rc); 149 149 150 150 return IPC_GET_RETVAL(answer); 151 151 } … … 179 179 * endpoint FS and drop our reference to the underlying VFS node. 180 180 */ 181 181 182 182 if (file->node != NULL) { 183 183 if (file->open_read || file->open_write) { … … 196 196 if (!vfs_files_init(vfs_data)) 197 197 return ENOMEM; 198 198 199 199 unsigned int i; 200 200 if (desc) … … 202 202 else 203 203 i = 0; 204 204 205 205 fibril_mutex_lock(&vfs_data->lock); 206 206 while (true) { … … 211 211 return ENOMEM; 212 212 } 213 214 213 214 215 215 memset(vfs_data->files[i], 0, sizeof(vfs_file_t)); 216 216 217 217 fibril_mutex_initialize(&vfs_data->files[i]->_lock); 218 218 fibril_mutex_lock(&vfs_data->files[i]->_lock); 219 219 vfs_file_addref(vfs_data, vfs_data->files[i]); 220 220 221 221 *file = vfs_data->files[i]; 222 222 vfs_file_addref(vfs_data, *file); 223 223 224 224 fibril_mutex_unlock(&vfs_data->lock); 225 225 *out_fd = (int) i; 226 226 return EOK; 227 227 } 228 228 229 229 if (desc) { 230 230 if (i == 0) 231 231 break; 232 232 233 233 i--; 234 234 } else { 235 235 if (i == MAX_OPEN_FILES - 1) 236 236 break; 237 237 238 238 i++; 239 239 } 240 240 } 241 241 fibril_mutex_unlock(&vfs_data->lock); 242 242 243 243 return EMFILE; 244 244 } … … 280 280 rc = _vfs_fd_free_locked(vfs_data, fd); 281 281 fibril_mutex_unlock(&vfs_data->lock); 282 282 283 283 return rc; 284 284 } … … 319 319 (void) _vfs_fd_free_locked(VFS_DATA, fd); 320 320 assert(FILES[fd] == NULL); 321 321 322 322 FILES[fd] = file; 323 323 vfs_file_addref(VFS_DATA, FILES[fd]); 324 324 fibril_mutex_unlock(&VFS_DATA->lock); 325 325 326 326 return EOK; 327 327 } … … 330 330 { 331 331 fibril_mutex_unlock(&file->_lock); 332 332 333 333 fibril_mutex_lock(&vfs_data->lock); 334 334 vfs_file_delref(vfs_data, file); … … 340 340 if (!vfs_files_init(vfs_data)) 341 341 return NULL; 342 342 343 343 fibril_mutex_lock(&vfs_data->lock); 344 344 if ((fd >= 0) && (fd < MAX_OPEN_FILES)) { … … 347 347 vfs_file_addref(vfs_data, file); 348 348 fibril_mutex_unlock(&vfs_data->lock); 349 349 350 350 fibril_mutex_lock(&file->_lock); 351 351 if (file->node == NULL) { … … 359 359 } 360 360 fibril_mutex_unlock(&vfs_data->lock); 361 361 362 362 return NULL; 363 363 } … … 432 432 { 433 433 vfs_client_data_t *vfs_data = VFS_DATA; 434 434 435 435 fibril_mutex_lock(&vfs_data->lock); 436 436 while (list_empty(&vfs_data->passed_handles)) … … 449 449 return rc; 450 450 } 451 451 452 452 file->node = bh->node; 453 453 file->permissions = bh->permissions;
Note:
See TracChangeset
for help on using the changeset viewer.