Ignore:
File:
1 edited

Legend:

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

    rb72efe8 rc69646f8  
    5454
    5555/* Forward declarations of static functions. */
    56 static int vfs_truncate_internal(fs_handle_t, devmap_handle_t, fs_index_t,
     56static int vfs_truncate_internal(fs_handle_t, service_id_t, fs_index_t,
    5757    aoff64_t);
    5858
     
    6565vfs_pair_t rootfs = {
    6666        .fs_handle = 0,
    67         .devmap_handle = 0
     67        .service_id = 0
    6868};
    6969
    70 static void vfs_mount_internal(ipc_callid_t rid, devmap_handle_t devmap_handle,
     70static void vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,
    7171    fs_handle_t fs_handle, char *mp, char *opts)
    7272{
     
    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;
     
    125125                        exch = vfs_exchange_grab(fs_handle);
    126126                        msg = async_send_1(exch, VFS_OUT_MOUNTED,
    127                             (sysarg_t) devmap_handle, &answer);
     127                            (sysarg_t) service_id, &answer);
    128128                        /* Send the mount options */
    129129                        rc = async_data_write_start(exch, (void *)opts,
     
    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;
    152                         mr_res.triplet.devmap_handle = devmap_handle;
     152                        mr_res.triplet.service_id = service_id;
    153153                        mr_res.triplet.index = rindex;
    154154                        mr_res.size = rsize;
     
    157157                       
    158158                        rootfs.fs_handle = fs_handle;
    159                         rootfs.devmap_handle = devmap_handle;
     159                        rootfs.service_id = service_id;
    160160                       
    161161                        /* Add reference to the mounted root. */
     
    178178       
    179179        /*
    180          * At this point, we have all necessary pieces: file system and device
    181          * handles, and we know the mount point VFS node.
     180         * At this point, we have all necessary pieces: file system handle
     181         * and service ID, and we know the mount point VFS node.
    182182         */
    183183       
     
    187187        exch = vfs_exchange_grab(mp_res.triplet.fs_handle);
    188188        msg = async_send_4(exch, VFS_OUT_MOUNT,
    189             (sysarg_t) mp_res.triplet.devmap_handle,
     189            (sysarg_t) mp_res.triplet.service_id,
    190190            (sysarg_t) mp_res.triplet.index,
    191191            (sysarg_t) fs_handle,
    192             (sysarg_t) devmap_handle, &answer);
     192            (sysarg_t) service_id, &answer);
    193193       
    194194        /* Send connection */
     
    224224        }
    225225       
     226        /*
     227         * Wait for the answer before releasing the exchange to avoid deadlock
     228         * in case the answer depends on further calls to the same file system.
     229         * Think of a case when mounting a FS on a file_bd backed by a file on
     230         * the same FS.
     231         */
     232        async_wait_for(msg, &rc);
    226233        vfs_exchange_release(exch);
    227         async_wait_for(msg, &rc);
    228234       
    229235        if (rc == EOK) {
    230236                rindex = (fs_index_t) IPC_GET_ARG1(answer);
    231                 rsize = (size_t) IPC_GET_ARG2(answer);
    232                 rlnkcnt = (unsigned) IPC_GET_ARG3(answer);
     237                rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer),
     238                    IPC_GET_ARG3(answer));
     239                rlnkcnt = (unsigned) IPC_GET_ARG4(answer);
    233240               
    234241                mr_res.triplet.fs_handle = fs_handle;
    235                 mr_res.triplet.devmap_handle = devmap_handle;
     242                mr_res.triplet.service_id = service_id;
    236243                mr_res.triplet.index = rindex;
    237244                mr_res.size = rsize;
     
    254261void vfs_mount(ipc_callid_t rid, ipc_call_t *request)
    255262{
    256         devmap_handle_t devmap_handle;
     263        service_id_t service_id;
    257264
    258265        /*
     
    261268         * in the request.
    262269         */
    263         devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);
     270        service_id = (service_id_t) IPC_GET_ARG1(*request);
    264271       
    265272        /*
     
    349356       
    350357        /* Do the mount */
    351         vfs_mount_internal(rid, devmap_handle, fs_handle, mp, opts);
     358        vfs_mount_internal(rid, service_id, fs_handle, mp, opts);
    352359        free(mp);
    353360        free(fs_name);
     
    408415         */
    409416        if (vfs_nodes_refcount_sum_get(mr_node->fs_handle,
    410             mr_node->devmap_handle) != 2) {
     417            mr_node->service_id) != 2) {
    411418                fibril_rwlock_write_unlock(&namespace_rwlock);
    412419                vfs_node_put(mr_node);
     
    429436                exch = vfs_exchange_grab(mr_node->fs_handle);
    430437                rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED,
    431                     mr_node->devmap_handle);
     438                    mr_node->service_id);
    432439                vfs_exchange_release(exch);
    433440               
     
    440447               
    441448                rootfs.fs_handle = 0;
    442                 rootfs.devmap_handle = 0;
     449                rootfs.service_id = 0;
    443450        } else {
    444451               
     
    469476                exch = vfs_exchange_grab(mp_node->fs_handle);
    470477                rc = async_req_2_0(exch, VFS_OUT_UNMOUNT,
    471                     mp_node->devmap_handle, mp_node->index);
     478                    mp_node->service_id, mp_node->index);
    472479                vfs_exchange_release(exch);
    473480               
     
    574581                if (node->size) {
    575582                        rc = vfs_truncate_internal(node->fs_handle,
    576                             node->devmap_handle, node->index, 0);
     583                            node->service_id, node->index, 0);
    577584                        if (rc) {
    578585                                fibril_rwlock_write_unlock(&node->contents_rwlock);
     
    617624}
    618625
    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 
    692626void vfs_sync(ipc_callid_t rid, ipc_call_t *request)
    693627{
     
    711645        aid_t msg;
    712646        ipc_call_t answer;
    713         msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->devmap_handle,
     647        msg = async_send_2(fs_exch, VFS_OUT_SYNC, file->node->service_id,
    714648            file->node->index, &answer);
    715649       
     
    795729        ipc_call_t answer;
    796730        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);
     731                rc = async_data_read_forward_4_1(fs_exch, VFS_OUT_READ,
     732                    file->node->service_id, file->node->index,
     733                    LOWER32(file->pos), UPPER32(file->pos), &answer);
    800734        } else {
    801735                if (file->append)
    802736                        file->pos = file->node->size;
    803737               
    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);
     738                rc = async_data_write_forward_4_1(fs_exch, VFS_OUT_WRITE,
     739                    file->node->service_id, file->node->index,
     740                    LOWER32(file->pos), UPPER32(file->pos), &answer);
    807741        }
    808742       
     
    821755                /* Update the cached version of node's size. */
    822756                if (rc == EOK)
    823                         file->node->size = IPC_GET_ARG2(answer);
     757                        file->node->size = MERGE_LOUP32(IPC_GET_ARG2(answer),
     758                            IPC_GET_ARG3(answer));
    824759                fibril_rwlock_write_unlock(&file->node->contents_rwlock);
    825760        }
     
    933868}
    934869
    935 int vfs_truncate_internal(fs_handle_t fs_handle, devmap_handle_t devmap_handle,
     870int vfs_truncate_internal(fs_handle_t fs_handle, service_id_t service_id,
    936871    fs_index_t index, aoff64_t size)
    937872{
    938873        async_exch_t *exch = vfs_exchange_grab(fs_handle);
    939874        sysarg_t rc = async_req_4_0(exch, VFS_OUT_TRUNCATE,
    940             (sysarg_t) devmap_handle, (sysarg_t) index, LOWER32(size),
     875            (sysarg_t) service_id, (sysarg_t) index, LOWER32(size),
    941876            UPPER32(size));
    942877        vfs_exchange_release(exch);
     
    961896        fibril_rwlock_write_lock(&file->node->contents_rwlock);
    962897        rc = vfs_truncate_internal(file->node->fs_handle,
    963             file->node->devmap_handle, file->node->index, size);
     898            file->node->service_id, file->node->index, size);
    964899        if (rc == EOK)
    965900                file->node->size = size;
     
    995930       
    996931        aid_t msg;
    997         msg = async_send_3(exch, VFS_OUT_STAT, file->node->devmap_handle,
     932        msg = async_send_3(exch, VFS_OUT_STAT, file->node->service_id,
    998933            file->node->index, true, NULL);
    999934        async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME);
     
    1048983       
    1049984        aid_t msg;
    1050         msg = async_send_3(exch, VFS_OUT_STAT, node->devmap_handle,
     985        msg = async_send_3(exch, VFS_OUT_STAT, node->service_id,
    1051986            node->index, false, NULL);
    1052987        async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME);
     
    12251160        /* Check whether linking to the same file system instance. */
    12261161        if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) ||
    1227             (old_node->devmap_handle != new_par_lr.triplet.devmap_handle)) {
     1162            (old_node->service_id != new_par_lr.triplet.service_id)) {
    12281163                fibril_rwlock_write_unlock(&namespace_rwlock);
    12291164                vfs_node_put(old_node);
     
    13471282}
    13481283
     1284void vfs_wait_handle(ipc_callid_t rid, ipc_call_t *request)
     1285{
     1286        int fd = vfs_wait_handle_internal();
     1287        async_answer_1(rid, EOK, fd);
     1288}
     1289
    13491290/**
    13501291 * @}
Note: See TracChangeset for help on using the changeset viewer.