Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/tmpfs/tmpfs_ops.c

    r1715b6af red903174  
    2929/** @addtogroup fs
    3030 * @{
    31  */ 
     31 */
    3232
    3333/**
     
    4040#include "../../vfs/vfs.h"
    4141#include <ipc/ipc.h>
     42#include <macros.h>
     43#include <limits.h>
    4244#include <async.h>
    4345#include <errno.h>
     
    9395}
    9496
    95 static size_t tmpfs_size_get(fs_node_t *fn)
     97static aoff64_t tmpfs_size_get(fs_node_t *fn)
    9698{
    9799        return TMPFS_NODE(fn)->size;
     
    168170                    (nodep->index == key[NODES_KEY_INDEX]));
    169171        default:
    170                 abort();
    171         }
     172                assert((keys == 1) || (keys == 2));
     173        }
     174
     175        return 0;
    172176}
    173177
     
    439443{
    440444        dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     445        fs_node_t *rootfn;
    441446        int rc;
    442 
    443         /* accept the mount options */
    444         ipc_callid_t callid;
    445         size_t size;
    446         if (!async_data_write_receive(&callid, &size)) {
    447                 ipc_answer_0(callid, EINVAL);
    448                 ipc_answer_0(rid, EINVAL);
    449                 return;
    450         }
    451         char *opts = malloc(size + 1);
    452         if (!opts) {
    453                 ipc_answer_0(callid, ENOMEM);
    454                 ipc_answer_0(rid, ENOMEM);
    455                 return;
    456         }
    457         ipcarg_t retval = async_data_write_finalize(callid, opts, size);
    458         if (retval != EOK) {
    459                 ipc_answer_0(rid, retval);
     447       
     448        /* Accept the mount options. */
     449        char *opts;
     450        rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL);
     451        if (rc != EOK) {
     452                ipc_answer_0(rid, rc);
     453                return;
     454        }
     455
     456        /* Check if this device is not already mounted. */
     457        rc = tmpfs_root_get(&rootfn, dev_handle);
     458        if ((rc == EOK) && (rootfn)) {
     459                (void) tmpfs_node_put(rootfn);
    460460                free(opts);
    461                 return;
    462         }
    463         opts[size] = '\0';
     461                ipc_answer_0(rid, EEXIST);
     462                return;
     463        }
    464464
    465465        /* Initialize TMPFS instance. */
     
    470470        }
    471471
    472         fs_node_t *rootfn;
    473472        rc = tmpfs_root_get(&rootfn, dev_handle);
    474473        assert(rc == EOK);
     
    512511void tmpfs_read(ipc_callid_t rid, ipc_call_t *request)
    513512{
    514         dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
    515         fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
    516         off_t pos = (off_t)IPC_GET_ARG3(*request);
    517 
     513        dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     514        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     515        aoff64_t pos =
     516            (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request));
     517       
    518518        /*
    519519         * Lookup the respective TMPFS node.
     
    531531        tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t,
    532532            nh_link);
    533 
     533       
    534534        /*
    535535         * Receive the read request.
     
    538538        size_t size;
    539539        if (!async_data_read_receive(&callid, &size)) {
    540                 ipc_answer_0(callid, EINVAL);   
     540                ipc_answer_0(callid, EINVAL);
    541541                ipc_answer_0(rid, EINVAL);
    542542                return;
     
    545545        size_t bytes;
    546546        if (nodep->type == TMPFS_FILE) {
    547                 bytes = max(0, min(nodep->size - pos, size));
     547                bytes = min(nodep->size - pos, size);
    548548                (void) async_data_read_finalize(callid, nodep->data + pos,
    549549                    bytes);
     
    551551                tmpfs_dentry_t *dentryp;
    552552                link_t *lnk;
    553                 int i;
     553                aoff64_t i;
    554554               
    555555                assert(nodep->type == TMPFS_DIRECTORY);
     
    561561                 */
    562562                for (i = 0, lnk = nodep->cs_head.next;
    563                     i < pos && lnk != &nodep->cs_head;
     563                    (i < pos) && (lnk != &nodep->cs_head);
    564564                    i++, lnk = lnk->next)
    565565                        ;
     
    586586void tmpfs_write(ipc_callid_t rid, ipc_call_t *request)
    587587{
    588         dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
    589         fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
    590         off_t pos = (off_t)IPC_GET_ARG3(*request);
    591 
     588        dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     589        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     590        aoff64_t pos =
     591            (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request));
     592       
    592593        /*
    593594         * Lookup the respective TMPFS node.
     
    650651void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request)
    651652{
     653        dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     654        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     655        aoff64_t size =
     656            (aoff64_t) MERGE_LOUP32(IPC_GET_ARG3(*request), IPC_GET_ARG4(*request));
     657       
     658        /*
     659         * Lookup the respective TMPFS node.
     660         */
     661        unsigned long key[] = {
     662                [NODES_KEY_DEV] = dev_handle,
     663                [NODES_KEY_INDEX] = index
     664        };
     665        link_t *hlp = hash_table_find(&nodes, key);
     666        if (!hlp) {
     667                ipc_answer_0(rid, ENOENT);
     668                return;
     669        }
     670        tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t,
     671            nh_link);
     672       
     673        if (size == nodep->size) {
     674                ipc_answer_0(rid, EOK);
     675                return;
     676        }
     677       
     678        if (size > SIZE_MAX) {
     679                ipc_answer_0(rid, ENOMEM);
     680                return;
     681        }
     682       
     683        void *newdata = realloc(nodep->data, size);
     684        if (!newdata) {
     685                ipc_answer_0(rid, ENOMEM);
     686                return;
     687        }
     688       
     689        if (size > nodep->size) {
     690                size_t delta = size - nodep->size;
     691                memset(newdata + nodep->size, 0, delta);
     692        }
     693       
     694        nodep->size = size;
     695        nodep->data = newdata;
     696        ipc_answer_0(rid, EOK);
     697}
     698
     699void tmpfs_close(ipc_callid_t rid, ipc_call_t *request)
     700{
     701        ipc_answer_0(rid, EOK);
     702}
     703
     704void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request)
     705{
    652706        dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
    653707        fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
    654         size_t size = (off_t)IPC_GET_ARG3(*request);
    655 
    656         /*
    657          * Lookup the respective TMPFS node.
    658          */
     708        int rc;
     709
    659710        link_t *hlp;
    660711        unsigned long key[] = {
     
    669720        tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t,
    670721            nh_link);
    671 
    672         if (size == nodep->size) {
    673                 ipc_answer_0(rid, EOK);
    674                 return;
    675         }
    676 
    677         void *newdata = realloc(nodep->data, size);
    678         if (!newdata) {
    679                 ipc_answer_0(rid, ENOMEM);
    680                 return;
    681         }
    682         if (size > nodep->size) {
    683                 size_t delta = size - nodep->size;
    684                 memset(newdata + nodep->size, 0, delta);
    685         }
    686         nodep->size = size;
    687         nodep->data = newdata;
    688         ipc_answer_0(rid, EOK);
    689 }
    690 
    691 void tmpfs_close(ipc_callid_t rid, ipc_call_t *request)
    692 {
    693         ipc_answer_0(rid, EOK);
    694 }
    695 
    696 void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request)
    697 {
    698         dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request);
    699         fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request);
    700         int rc;
    701 
    702         link_t *hlp;
    703         unsigned long key[] = {
    704                 [NODES_KEY_DEV] = dev_handle,
    705                 [NODES_KEY_INDEX] = index
    706         };
    707         hlp = hash_table_find(&nodes, key);
    708         if (!hlp) {
    709                 ipc_answer_0(rid, ENOENT);
    710                 return;
    711         }
    712         tmpfs_node_t *nodep = hash_table_get_instance(hlp, tmpfs_node_t,
    713             nh_link);
    714722        rc = tmpfs_destroy_node(FS_NODE(nodep));
    715723        ipc_answer_0(rid, rc);
Note: See TracChangeset for help on using the changeset viewer.