Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_file.c

    r6ad454f rfcab7ef  
    192192}
    193193
    194 static int _vfs_fd_alloc(vfs_client_data_t *vfs_data, vfs_file_t **file, bool desc, int *out_fd)
     194static int _vfs_fd_alloc(vfs_client_data_t *vfs_data, vfs_file_t **file, bool desc)
    195195{
    196196        if (!vfs_files_init(vfs_data))
     
    223223                       
    224224                        fibril_mutex_unlock(&vfs_data->lock);
    225                         *out_fd = (int) i;
    226                         return EOK;
     225                        return (int) i;
    227226                }
    228227               
     
    250249 *             in a descending order.
    251250 *
    252  * @param[out] out_fd  First available file descriptor
    253  *
    254  * @return Error code.
    255  */
    256 int vfs_fd_alloc(vfs_file_t **file, bool desc, int *out_fd)
    257 {
    258         return _vfs_fd_alloc(VFS_DATA, file, desc, out_fd);
    259 }
    260 
    261 static int _vfs_fd_free_locked(vfs_client_data_t *vfs_data, int fd)
    262 {
    263         if ((fd < 0) || (fd >= MAX_OPEN_FILES) || !vfs_data->files[fd]) {
    264                 return EBADF;
    265         }
    266 
    267         int rc = vfs_file_delref(vfs_data, vfs_data->files[fd]);
    268         vfs_data->files[fd] = NULL;
    269         return rc;
     251 * @return First available file descriptor or a negative error
     252 *         code.
     253 */
     254int vfs_fd_alloc(vfs_file_t **file, bool desc)
     255{
     256        return _vfs_fd_alloc(VFS_DATA, file, desc);
    270257}
    271258
     
    278265
    279266        fibril_mutex_lock(&vfs_data->lock);     
    280         rc = _vfs_fd_free_locked(vfs_data, fd);
     267        if ((fd < 0) || (fd >= MAX_OPEN_FILES) || !vfs_data->files[fd]) {
     268                fibril_mutex_unlock(&vfs_data->lock);
     269                return EBADF;
     270        }
     271       
     272        rc = vfs_file_delref(vfs_data, vfs_data->files[fd]);
     273        vfs_data->files[fd] = NULL;
    281274        fibril_mutex_unlock(&vfs_data->lock);
    282275       
     
    315308                return EBADF;
    316309        }
    317 
    318         /* Make sure fd is closed. */
    319         (void) _vfs_fd_free_locked(VFS_DATA, fd);
    320         assert(FILES[fd] == NULL);
     310        if (FILES[fd] != NULL) {
     311                fibril_mutex_unlock(&VFS_DATA->lock);
     312                return EEXIST;
     313        }
    321314       
    322315        FILES[fd] = file;
     
    429422}
    430423
    431 int vfs_wait_handle_internal(bool high_fd, int *out_fd)
     424int vfs_wait_handle_internal(bool high_fd)
    432425{
    433426        vfs_client_data_t *vfs_data = VFS_DATA;
     
    443436
    444437        vfs_file_t *file;
    445         int rc = _vfs_fd_alloc(vfs_data, &file, high_fd, out_fd);
    446         if (rc != EOK) {
     438        int fd = _vfs_fd_alloc(vfs_data, &file, high_fd);
     439        if (fd < 0) {
    447440                vfs_node_delref(bh->node);
    448441                free(bh);
    449                 return rc;
     442                return fd;
    450443        }
    451444       
     
    454447        vfs_file_put(file);
    455448        free(bh);
    456         return EOK;
     449        return fd;
    457450}
    458451
Note: See TracChangeset for help on using the changeset viewer.