Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/locfs/locfs_ops.c

    rb33870b r15f3c3f  
    404404}
    405405
     406static char locfs_plb_get_char(unsigned pos)
     407{
     408        return locfs_reg.plb_ro[pos % PLB_SIZE];
     409}
     410
    406411static bool locfs_is_directory(fs_node_t *fn)
    407412{
     
    418423}
    419424
    420 static service_id_t locfs_service_get(fs_node_t *fn)
     425static service_id_t locfs_device_get(fs_node_t *fn)
    421426{
    422427        locfs_node_t *node = (locfs_node_t *) fn->data;
     
    443448        .size_get = locfs_size_get,
    444449        .lnkcnt_get = locfs_lnkcnt_get,
     450        .plb_get_char = locfs_plb_get_char,
    445451        .is_directory = locfs_is_directory,
    446452        .is_file = locfs_is_file,
    447         .service_get = locfs_service_get
     453        .device_get = locfs_device_get
    448454};
    449455
     
    457463}
    458464
    459 static int locfs_mounted(service_id_t service_id, const char *opts,
    460     fs_index_t *index, aoff64_t *size, unsigned *lnkcnt)
    461 {
    462         *index = 0;
    463         *size = 0;
    464         *lnkcnt = 0;
    465         return EOK;
    466 }
    467 
    468 static int locfs_unmounted(service_id_t service_id)
    469 {
    470         return ENOTSUP;
    471 }
    472 
    473 static int
    474 locfs_read(service_id_t service_id, fs_index_t index, aoff64_t pos,
    475     size_t *rbytes)
    476 {
     465void locfs_mounted(ipc_callid_t rid, ipc_call_t *request)
     466{
     467        char *opts;
     468       
     469        /* Accept the mount options */
     470        sysarg_t retval = async_data_write_accept((void **) &opts, true, 0, 0,
     471            0, NULL);
     472        if (retval != EOK) {
     473                async_answer_0(rid, retval);
     474                return;
     475        }
     476       
     477        free(opts);
     478        async_answer_3(rid, EOK, 0, 0, 0);
     479}
     480
     481void locfs_mount(ipc_callid_t rid, ipc_call_t *request)
     482{
     483        libfs_mount(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request);
     484}
     485
     486void locfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
     487{
     488        async_answer_0(rid, ENOTSUP);
     489}
     490
     491void locfs_unmount(ipc_callid_t rid, ipc_call_t *request)
     492{
     493        libfs_unmount(&locfs_libfs_ops, rid, request);
     494}
     495
     496void locfs_lookup(ipc_callid_t rid, ipc_call_t *request)
     497{
     498        libfs_lookup(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request);
     499}
     500
     501void locfs_open_node(ipc_callid_t rid, ipc_call_t *request)
     502{
     503        libfs_open_node(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request);
     504}
     505
     506void locfs_stat(ipc_callid_t rid, ipc_call_t *request)
     507{
     508        libfs_stat(&locfs_libfs_ops, locfs_reg.fs_handle, rid, request);
     509}
     510
     511void locfs_read(ipc_callid_t rid, ipc_call_t *request)
     512{
     513        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     514        aoff64_t pos =
     515            (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request));
     516       
    477517        if (index == 0) {
    478518                ipc_callid_t callid;
     
    480520                if (!async_data_read_receive(&callid, &size)) {
    481521                        async_answer_0(callid, EINVAL);
    482                         return EINVAL;
     522                        async_answer_0(rid, EINVAL);
     523                        return;
    483524                }
    484525               
     
    500541                        async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1);
    501542                        free(desc);
    502                         *rbytes = 1;
    503                         return EOK;
     543                        async_answer_1(rid, EOK, 1);
     544                        return;
    504545                }
    505546               
     
    515556                                async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1);
    516557                                free(desc);
    517                                 *rbytes = 1;
    518                                 return EOK;
     558                                async_answer_1(rid, EOK, 1);
     559                                return;
    519560                        }
    520561                       
     
    523564               
    524565                async_answer_0(callid, ENOENT);
    525                 return ENOENT;
     566                async_answer_1(rid, ENOENT, 0);
     567                return;
    526568        }
    527569       
     
    534576                if (!async_data_read_receive(&callid, &size)) {
    535577                        async_answer_0(callid, EINVAL);
    536                         return EINVAL;
     578                        async_answer_0(rid, EINVAL);
     579                        return;
    537580                }
    538581               
     
    543586                        async_data_read_finalize(callid, desc[pos].name, str_size(desc[pos].name) + 1);
    544587                        free(desc);
    545                         *rbytes = 1;
    546                         return EOK;
     588                        async_answer_1(rid, EOK, 1);
     589                        return;
    547590                }
    548591               
    549592                free(desc);
    550593                async_answer_0(callid, ENOENT);
    551                 return ENOENT;
     594                async_answer_1(rid, ENOENT, 0);
     595                return;
    552596        }
    553597       
     
    563607                if (lnk == NULL) {
    564608                        fibril_mutex_unlock(&services_mutex);
    565                         return ENOENT;
     609                        async_answer_0(rid, ENOENT);
     610                        return;
    566611                }
    567612               
     
    573618                        fibril_mutex_unlock(&services_mutex);
    574619                        async_answer_0(callid, EINVAL);
    575                         return EINVAL;
     620                        async_answer_0(rid, EINVAL);
     621                        return;
    576622                }
    577623               
     
    580626               
    581627                ipc_call_t answer;
    582                 aid_t msg = async_send_4(exch, VFS_OUT_READ, service_id,
    583                     index, LOWER32(pos), UPPER32(pos), &answer);
     628                aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request),
     629                    IPC_GET_ARG1(*request), IPC_GET_ARG2(*request),
     630                    IPC_GET_ARG3(*request), &answer);
    584631               
    585632                /* Forward the IPC_M_DATA_READ request to the driver */
     
    593640                sysarg_t rc;
    594641                async_wait_for(msg, &rc);
    595                
    596                 *rbytes = IPC_GET_ARG1(answer);
    597                 return rc;
    598         }
    599        
    600         return ENOENT;
    601 }
    602 
    603 static int
    604 locfs_write(service_id_t service_id, fs_index_t index, aoff64_t pos,
    605     size_t *wbytes, aoff64_t *nsize)
    606 {
    607         if (index == 0)
    608                 return ENOTSUP;
     642                size_t bytes = IPC_GET_ARG1(answer);
     643               
     644                /* Driver reply is the final result of the whole operation */
     645                async_answer_1(rid, rc, bytes);
     646                return;
     647        }
     648       
     649        async_answer_0(rid, ENOENT);
     650}
     651
     652void locfs_write(ipc_callid_t rid, ipc_call_t *request)
     653{
     654        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     655        if (index == 0) {
     656                async_answer_0(rid, ENOTSUP);
     657                return;
     658        }
    609659       
    610660        loc_object_type_t type = loc_id_probe(index);
     
    612662        if (type == LOC_OBJECT_NAMESPACE) {
    613663                /* Namespace directory */
    614                 return ENOTSUP;
     664                async_answer_0(rid, ENOTSUP);
     665                return;
    615666        }
    616667       
     
    625676                if (lnk == NULL) {
    626677                        fibril_mutex_unlock(&services_mutex);
    627                         return ENOENT;
     678                        async_answer_0(rid, ENOENT);
     679                        return;
    628680                }
    629681               
     
    635687                        fibril_mutex_unlock(&services_mutex);
    636688                        async_answer_0(callid, EINVAL);
    637                         return EINVAL;
     689                        async_answer_0(rid, EINVAL);
     690                        return;
    638691                }
    639692               
     
    642695               
    643696                ipc_call_t answer;
    644                 aid_t msg = async_send_4(exch, VFS_OUT_WRITE, service_id,
    645                     index, LOWER32(pos), UPPER32(pos), &answer);
     697                aid_t msg = async_send_3(exch, IPC_GET_IMETHOD(*request),
     698                    IPC_GET_ARG1(*request), IPC_GET_ARG2(*request),
     699                    IPC_GET_ARG3(*request), &answer);
    646700               
    647701                /* Forward the IPC_M_DATA_WRITE request to the driver */
     
    655709                sysarg_t rc;
    656710                async_wait_for(msg, &rc);
    657                
    658                 *wbytes = IPC_GET_ARG1(answer);
    659                 *nsize = 0;
    660                 return rc;
    661         }
    662        
    663         return ENOENT;
    664 }
    665 
    666 static int
    667 locfs_truncate(service_id_t service_id, fs_index_t index, aoff64_t size)
    668 {
    669         return ENOTSUP;
    670 }
    671 
    672 static int locfs_close(service_id_t service_id, fs_index_t index)
    673 {
    674         if (index == 0)
    675                 return EOK;
     711                size_t bytes = IPC_GET_ARG1(answer);
     712               
     713                /* Driver reply is the final result of the whole operation */
     714                async_answer_1(rid, rc, bytes);
     715                return;
     716        }
     717       
     718        async_answer_0(rid, ENOENT);
     719}
     720
     721void locfs_truncate(ipc_callid_t rid, ipc_call_t *request)
     722{
     723        async_answer_0(rid, ENOTSUP);
     724}
     725
     726void locfs_close(ipc_callid_t rid, ipc_call_t *request)
     727{
     728        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     729       
     730        if (index == 0) {
     731                async_answer_0(rid, EOK);
     732                return;
     733        }
    676734       
    677735        loc_object_type_t type = loc_id_probe(index);
     
    679737        if (type == LOC_OBJECT_NAMESPACE) {
    680738                /* Namespace directory */
    681                 return EOK;
     739                async_answer_0(rid, EOK);
     740                return;
    682741        }
    683742       
     
    691750                if (lnk == NULL) {
    692751                        fibril_mutex_unlock(&services_mutex);
    693                         return ENOENT;
     752                        async_answer_0(rid, ENOENT);
     753                        return;
    694754                }
    695755               
     
    705765                fibril_mutex_unlock(&services_mutex);
    706766               
    707                 return EOK;
    708         }
    709        
    710         return ENOENT;
    711 }
    712 
    713 static int locfs_sync(service_id_t service_id, fs_index_t index)
    714 {
    715         if (index == 0)
    716                 return EOK;
     767                async_answer_0(rid, EOK);
     768                return;
     769        }
     770       
     771        async_answer_0(rid, ENOENT);
     772}
     773
     774void locfs_sync(ipc_callid_t rid, ipc_call_t *request)
     775{
     776        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     777       
     778        if (index == 0) {
     779                async_answer_0(rid, EOK);
     780                return;
     781        }
    717782       
    718783        loc_object_type_t type = loc_id_probe(index);
     
    720785        if (type == LOC_OBJECT_NAMESPACE) {
    721786                /* Namespace directory */
    722                 return EOK;
     787                async_answer_0(rid, EOK);
     788                return;
    723789        }
    724790       
     
    732798                if (lnk == NULL) {
    733799                        fibril_mutex_unlock(&services_mutex);
    734                         return ENOENT;
     800                        async_answer_0(rid, ENOENT);
     801                        return;
    735802                }
    736803               
     
    742809               
    743810                ipc_call_t answer;
    744                 aid_t msg = async_send_2(exch, VFS_OUT_SYNC, service_id,
    745                     index, &answer);
     811                aid_t msg = async_send_2(exch, IPC_GET_IMETHOD(*request),
     812                    IPC_GET_ARG1(*request), IPC_GET_ARG2(*request), &answer);
    746813               
    747814                async_exchange_end(exch);
     
    753820                async_wait_for(msg, &rc);
    754821               
    755                 return rc;
    756         }
    757        
    758         return  ENOENT;
    759 }
    760 
    761 static int locfs_destroy(service_id_t service_id, fs_index_t index)
    762 {
    763         return ENOTSUP;
    764 }
    765 
    766 vfs_out_ops_t locfs_ops = {
    767         .mounted = locfs_mounted,
    768         .unmounted = locfs_unmounted,
    769         .read = locfs_read,
    770         .write = locfs_write,
    771         .truncate = locfs_truncate,
    772         .close = locfs_close,
    773         .destroy = locfs_destroy,
    774         .sync = locfs_sync,
    775 };
     822                /* Driver reply is the final result of the whole operation */
     823                async_answer_0(rid, rc);
     824                return;
     825        }
     826       
     827        async_answer_0(rid, ENOENT);
     828}
     829
     830void locfs_destroy(ipc_callid_t rid, ipc_call_t *request)
     831{
     832        async_answer_0(rid, ENOTSUP);
     833}
    776834
    777835/**
Note: See TracChangeset for help on using the changeset viewer.