Ignore:
File:
1 edited

Legend:

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

    r27b76ca r79ae36dd  
    7676        vfs_node_t *mr_node;
    7777        fs_index_t rindex;
    78         aoff64_t rsize;
     78        size_t rsize;
    7979        unsigned rlnkcnt;
    8080        async_exch_t *exch;
     
    146146
    147147                        rindex = (fs_index_t) IPC_GET_ARG1(answer);
    148                         rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
    149                         rlnkcnt = (unsigned) IPC_GET_ARG4(answer);
     148                        rsize = (size_t) IPC_GET_ARG2(answer);
     149                        rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
    150150                       
    151151                        mr_res.triplet.fs_handle = fs_handle;
     
    229229        if (rc == EOK) {
    230230                rindex = (fs_index_t) IPC_GET_ARG1(answer);
    231                 rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer),
    232                     IPC_GET_ARG3(answer));
    233                 rlnkcnt = (unsigned) IPC_GET_ARG4(answer);
     231                rsize = (size_t) IPC_GET_ARG2(answer);
     232                rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
    234233               
    235234                mr_res.triplet.fs_handle = fs_handle;
     
    326325         * This will also give us its file system handle.
    327326         */
    328         fibril_mutex_lock(&fs_list_lock);
     327        fibril_mutex_lock(&fs_head_lock);
    329328        fs_handle_t fs_handle;
    330329recheck:
     
    332331        if (!fs_handle) {
    333332                if (flags & IPC_FLAG_BLOCKING) {
    334                         fibril_condvar_wait(&fs_list_cv, &fs_list_lock);
     333                        fibril_condvar_wait(&fs_head_cv, &fs_head_lock);
    335334                        goto recheck;
    336335                }
    337336               
    338                 fibril_mutex_unlock(&fs_list_lock);
     337                fibril_mutex_unlock(&fs_head_lock);
    339338                async_answer_0(callid, ENOENT);
    340339                async_answer_0(rid, ENOENT);
     
    344343                return;
    345344        }
    346         fibril_mutex_unlock(&fs_list_lock);
     345        fibril_mutex_unlock(&fs_head_lock);
    347346       
    348347        /* Acknowledge that we know fs_name. */
     
    618617}
    619618
     619void vfs_open_node(ipc_callid_t rid, ipc_call_t *request)
     620{
     621        // FIXME: check for sanity of the supplied fs, dev and index
     622       
     623        /*
     624         * The interface is open_node(fs, dev, index, oflag).
     625         */
     626        vfs_lookup_res_t lr;
     627       
     628        lr.triplet.fs_handle = IPC_GET_ARG1(*request);
     629        lr.triplet.devmap_handle = IPC_GET_ARG2(*request);
     630        lr.triplet.index = IPC_GET_ARG3(*request);
     631        int oflag = IPC_GET_ARG4(*request);
     632       
     633        fibril_rwlock_read_lock(&namespace_rwlock);
     634       
     635        int rc = vfs_open_node_internal(&lr);
     636        if (rc != EOK) {
     637                fibril_rwlock_read_unlock(&namespace_rwlock);
     638                async_answer_0(rid, rc);
     639                return;
     640        }
     641       
     642        vfs_node_t *node = vfs_node_get(&lr);
     643        fibril_rwlock_read_unlock(&namespace_rwlock);
     644       
     645        /* Truncate the file if requested and if necessary. */
     646        if (oflag & O_TRUNC) {
     647                fibril_rwlock_write_lock(&node->contents_rwlock);
     648                if (node->size) {
     649                        rc = vfs_truncate_internal(node->fs_handle,
     650                            node->devmap_handle, node->index, 0);
     651                        if (rc) {
     652                                fibril_rwlock_write_unlock(&node->contents_rwlock);
     653                                vfs_node_put(node);
     654                                async_answer_0(rid, rc);
     655                                return;
     656                        }
     657                        node->size = 0;
     658                }
     659                fibril_rwlock_write_unlock(&node->contents_rwlock);
     660        }
     661       
     662        /*
     663         * Get ourselves a file descriptor and the corresponding vfs_file_t
     664         * structure.
     665         */
     666        int fd = vfs_fd_alloc((oflag & O_DESC) != 0);
     667        if (fd < 0) {
     668                vfs_node_put(node);
     669                async_answer_0(rid, fd);
     670                return;
     671        }
     672        vfs_file_t *file = vfs_file_get(fd);
     673        file->node = node;
     674        if (oflag & O_APPEND)
     675                file->append = true;
     676       
     677        /*
     678         * The following increase in reference count is for the fact that the
     679         * file is being opened and that a file structure is pointing to it.
     680         * It is necessary so that the file will not disappear when
     681         * vfs_node_put() is called. The reference will be dropped by the
     682         * respective VFS_IN_CLOSE.
     683         */
     684        vfs_node_addref(node);
     685        vfs_node_put(node);
     686        vfs_file_put(file);
     687       
     688        /* Success! Return the new file descriptor to the client. */
     689        async_answer_1(rid, EOK, fd);
     690}
     691
    620692void vfs_sync(ipc_callid_t rid, ipc_call_t *request)
    621693{
     
    723795        ipc_call_t answer;
    724796        if (read) {
    725                 rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ,
    726                     file->node->devmap_handle, file->node->index,
    727                     LOWER32(file->pos), UPPER32(file->pos), &answer);
     797                rc = async_data_read_forward_3_1(fs_exch, VFS_OUT_READ,
     798                    file->node->devmap_handle, file->node->index, file->pos,
     799                    &answer);
    728800        } else {
    729801                if (file->append)
    730802                        file->pos = file->node->size;
    731803               
    732                 rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE,
    733                     file->node->devmap_handle, file->node->index,
    734                     LOWER32(file->pos), UPPER32(file->pos), &answer);
     804                rc = async_data_write_forward_3_1(fs_exch, VFS_OUT_WRITE,
     805                    file->node->devmap_handle, file->node->index, file->pos,
     806                    &answer);
    735807        }
    736808       
     
    749821                /* Update the cached version of node's size. */
    750822                if (rc == EOK)
    751                         file->node->size = MERGE_LOUP32(IPC_GET_ARG2(answer),
    752                             IPC_GET_ARG3(answer));
     823                        file->node->size = IPC_GET_ARG2(answer);
    753824                fibril_rwlock_write_unlock(&file->node->contents_rwlock);
    754825        }
     
    12761347}
    12771348
    1278 void vfs_wait_handle(ipc_callid_t rid, ipc_call_t *request)
    1279 {
    1280         int fd = vfs_wait_handle_internal();
    1281         async_answer_1(rid, EOK, fd);
    1282 }
    1283 
    12841349/**
    12851350 * @}
Note: See TracChangeset for help on using the changeset viewer.