Ignore:
File:
1 edited

Legend:

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

    r79ae36dd r27b76ca  
    7676        vfs_node_t *mr_node;
    7777        fs_index_t rindex;
    78         size_t rsize;
     78        aoff64_t rsize;
    7979        unsigned rlnkcnt;
    8080        async_exch_t *exch;
     
    146146
    147147                        rindex = (fs_index_t) IPC_GET_ARG1(answer);
    148                         rsize = (size_t) IPC_GET_ARG2(answer);
    149                         rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
     148                        rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
     149                        rlnkcnt = (unsigned) IPC_GET_ARG4(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 = (size_t) IPC_GET_ARG2(answer);
    232                 rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
     231                rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer),
     232                    IPC_GET_ARG3(answer));
     233                rlnkcnt = (unsigned) IPC_GET_ARG4(answer);
    233234               
    234235                mr_res.triplet.fs_handle = fs_handle;
     
    325326         * This will also give us its file system handle.
    326327         */
    327         fibril_mutex_lock(&fs_head_lock);
     328        fibril_mutex_lock(&fs_list_lock);
    328329        fs_handle_t fs_handle;
    329330recheck:
     
    331332        if (!fs_handle) {
    332333                if (flags & IPC_FLAG_BLOCKING) {
    333                         fibril_condvar_wait(&fs_head_cv, &fs_head_lock);
     334                        fibril_condvar_wait(&fs_list_cv, &fs_list_lock);
    334335                        goto recheck;
    335336                }
    336337               
    337                 fibril_mutex_unlock(&fs_head_lock);
     338                fibril_mutex_unlock(&fs_list_lock);
    338339                async_answer_0(callid, ENOENT);
    339340                async_answer_0(rid, ENOENT);
     
    343344                return;
    344345        }
    345         fibril_mutex_unlock(&fs_head_lock);
     346        fibril_mutex_unlock(&fs_list_lock);
    346347       
    347348        /* Acknowledge that we know fs_name. */
     
    617618}
    618619
    619 void 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 
    692620void vfs_sync(ipc_callid_t rid, ipc_call_t *request)
    693621{
     
    795723        ipc_call_t answer;
    796724        if (read) {
    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);
     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);
    800728        } else {
    801729                if (file->append)
    802730                        file->pos = file->node->size;
    803731               
    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);
     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);
    807735        }
    808736       
     
    821749                /* Update the cached version of node's size. */
    822750                if (rc == EOK)
    823                         file->node->size = IPC_GET_ARG2(answer);
     751                        file->node->size = MERGE_LOUP32(IPC_GET_ARG2(answer),
     752                            IPC_GET_ARG3(answer));
    824753                fibril_rwlock_write_unlock(&file->node->contents_rwlock);
    825754        }
     
    13471276}
    13481277
     1278void 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
    13491284/**
    13501285 * @}
Note: See TracChangeset for help on using the changeset viewer.