Changeset b6035ba in mainline for uspace/srv/fs/tmpfs/tmpfs_ops.c


Ignore:
Timestamp:
2009-05-05T22:09:13Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
770d281
Parents:
c852f4be
Message:

Introduce the concept of FS nodes. A FS node is a typed abstraction of
file-system-specific node type. It replaces the void * in libfs interfaces
and is suitable for holding various information such as mount point data.

File:
1 edited

Legend:

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

    rc852f4be rb6035ba  
    6969
    7070/* Forward declarations of static functions. */
    71 static void *tmpfs_match(void *, const char *);
    72 static void *tmpfs_node_get(dev_handle_t, fs_index_t);
    73 static void tmpfs_node_put(void *);
    74 static void *tmpfs_create_node(dev_handle_t, int);
    75 static int tmpfs_link_node(void *, void *, const char *);
    76 static int tmpfs_unlink_node(void *, void *);
    77 static int tmpfs_destroy_node(void *);
     71static fs_node_t *tmpfs_match(fs_node_t *, const char *);
     72static fs_node_t *tmpfs_node_get(dev_handle_t, fs_index_t);
     73static void tmpfs_node_put(fs_node_t *);
     74static fs_node_t *tmpfs_create_node(dev_handle_t, int);
     75static int tmpfs_link_node(fs_node_t *, fs_node_t *, const char *);
     76static int tmpfs_unlink_node(fs_node_t *, fs_node_t *);
     77static int tmpfs_destroy_node(fs_node_t *);
    7878
    7979/* Implementation of helper functions. */
    80 static fs_index_t tmpfs_index_get(void *nodep)
    81 {
    82         return ((tmpfs_dentry_t *) nodep)->index;
    83 }
    84 
    85 static size_t tmpfs_size_get(void *nodep)
    86 {
    87         return ((tmpfs_dentry_t *) nodep)->size;
    88 }
    89 
    90 static unsigned tmpfs_lnkcnt_get(void *nodep)
    91 {
    92         return ((tmpfs_dentry_t *) nodep)->lnkcnt;
    93 }
    94 
    95 static bool tmpfs_has_children(void *nodep)
    96 {
    97         return ((tmpfs_dentry_t *) nodep)->child != NULL;
    98 }
    99 
    100 static void *tmpfs_root_get(dev_handle_t dev_handle)
     80static fs_index_t tmpfs_index_get(fs_node_t *fn)
     81{
     82        return TMPFS_NODE(fn)->index;
     83}
     84
     85static size_t tmpfs_size_get(fs_node_t *fn)
     86{
     87        return TMPFS_NODE(fn)->size;
     88}
     89
     90static unsigned tmpfs_lnkcnt_get(fs_node_t *fn)
     91{
     92        return TMPFS_NODE(fn)->lnkcnt;
     93}
     94
     95static bool tmpfs_has_children(fs_node_t *fn)
     96{
     97        return TMPFS_NODE(fn)->child != NULL;
     98}
     99
     100static fs_node_t *tmpfs_root_get(dev_handle_t dev_handle)
    101101{
    102102        return tmpfs_node_get(dev_handle, TMPFS_SOME_ROOT);
     
    108108}
    109109
    110 static bool tmpfs_is_directory(void *nodep)
    111 {
    112         return ((tmpfs_dentry_t *) nodep)->type == TMPFS_DIRECTORY;
    113 }
    114 
    115 static bool tmpfs_is_file(void *nodep)
    116 {
    117         return ((tmpfs_dentry_t *) nodep)->type == TMPFS_FILE;
     110static bool tmpfs_is_directory(fs_node_t *fn)
     111{
     112        return TMPFS_NODE(fn)->type == TMPFS_DIRECTORY;
     113}
     114
     115static bool tmpfs_is_file(fs_node_t *fn)
     116{
     117        return TMPFS_NODE(fn)->type == TMPFS_FILE;
    118118}
    119119
     
    214214static bool tmpfs_dentry_initialize(tmpfs_dentry_t *dentry)
    215215{
     216        dentry->bp = NULL;
    216217        dentry->index = 0;
    217218        dentry->dev_handle = 0;
     
    237238static bool tmpfs_instance_init(dev_handle_t dev_handle)
    238239{
    239         tmpfs_dentry_t *root;
     240        fs_node_t *rfn;
    240241       
    241         root = (tmpfs_dentry_t *) tmpfs_create_node(dev_handle, L_DIRECTORY);
    242         if (!root)
     242        rfn = tmpfs_create_node(dev_handle, L_DIRECTORY);
     243        if (!rfn)
    243244                return false;
    244         root->lnkcnt = 0;       /* FS root is not linked */
     245        TMPFS_NODE(rfn)->lnkcnt = 0;    /* FS root is not linked */
    245246        return true;
    246247}
     
    265266}
    266267
    267 void *tmpfs_match(void *prnt, const char *component)
    268 {
    269         tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
     268fs_node_t *tmpfs_match(fs_node_t *pfn, const char *component)
     269{
     270        tmpfs_dentry_t *parentp = TMPFS_NODE(pfn);
    270271        tmpfs_dentry_t *childp = parentp->child;
    271272
     
    273274                childp = childp->sibling;
    274275
    275         return (void *) childp;
    276 }
    277 
    278 void *
    279 tmpfs_node_get(dev_handle_t dev_handle, fs_index_t index)
     276        return FS_NODE(childp);
     277}
     278
     279fs_node_t *tmpfs_node_get(dev_handle_t dev_handle, fs_index_t index)
    280280{
    281281        unsigned long key[] = {
     
    286286        if (!lnk)
    287287                return NULL;
    288         return hash_table_get_instance(lnk, tmpfs_dentry_t, dh_link);
    289 }
    290 
    291 void tmpfs_node_put(void *node)
     288        return FS_NODE(hash_table_get_instance(lnk, tmpfs_dentry_t, dh_link));
     289}
     290
     291void tmpfs_node_put(fs_node_t *fn)
    292292{
    293293        /* nothing to do */
    294294}
    295295
    296 void *tmpfs_create_node(dev_handle_t dev_handle, int lflag)
     296fs_node_t *tmpfs_create_node(dev_handle_t dev_handle, int lflag)
    297297{
    298298        assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY));
    299299
     300        fs_node_t *fn = malloc(sizeof(fs_node_t));
     301        if (!fn)
     302                return NULL;
     303       
    300304        tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t));
    301         if (!node)
     305        if (!node) {
     306                free(fn);
    302307                return NULL;
    303 
     308        }
    304309        if (!tmpfs_dentry_initialize(node)) {
     310                free(fn);
    305311                free(node);
    306312                return NULL;
    307313        }
     314        fn->data = node;
     315        node->bp = fn;  /* establish the back pointer */
    308316        if (!tmpfs_root_get(dev_handle))
    309317                node->index = TMPFS_SOME_ROOT;
     
    322330        };
    323331        hash_table_insert(&dentries, key, &node->dh_link);
    324         return (void *) node;
    325 }
    326 
    327 int tmpfs_link_node(void *prnt, void *chld, const char *nm)
    328 {
    329         tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt;
    330         tmpfs_dentry_t *childp = (tmpfs_dentry_t *) chld;
     332        return fn;
     333}
     334
     335int tmpfs_link_node(fs_node_t *pfn, fs_node_t *cfn, const char *nm)
     336{
     337        tmpfs_dentry_t *parentp = TMPFS_NODE(pfn);
     338        tmpfs_dentry_t *childp = TMPFS_NODE(cfn);
    331339
    332340        assert(parentp->type == TMPFS_DIRECTORY);
     
    363371}
    364372
    365 int tmpfs_unlink_node(void *prnt, void *chld)
    366 {
    367         tmpfs_dentry_t *parentp = (tmpfs_dentry_t *)prnt;
    368         tmpfs_dentry_t *childp = (tmpfs_dentry_t *)chld;
     373int tmpfs_unlink_node(fs_node_t *pfn, fs_node_t *cfn)
     374{
     375        tmpfs_dentry_t *parentp = TMPFS_NODE(pfn);
     376        tmpfs_dentry_t *childp = TMPFS_NODE(cfn);
    369377
    370378        if (!parentp)
     
    393401}
    394402
    395 int tmpfs_destroy_node(void *nodep)
    396 {
    397         tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep;
     403int tmpfs_destroy_node(fs_node_t *fn)
     404{
     405        tmpfs_dentry_t *dentry = TMPFS_NODE(fn);
    398406       
    399407        assert(!dentry->lnkcnt);
     
    411419        if (dentry->type == TMPFS_FILE)
    412420                free(dentry->data);
     421        free(dentry->bp);
    413422        free(dentry);
    414423        return EOK;
     
    447456        }
    448457
    449         tmpfs_dentry_t *root = tmpfs_root_get(dev_handle);
     458        tmpfs_dentry_t *root = TMPFS_NODE(tmpfs_root_get(dev_handle));
    450459        if (str_cmp(opts, "restore") == 0) {
    451460                if (tmpfs_restore(dev_handle))
     
    673682        tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t,
    674683            dh_link);
    675         rc = tmpfs_destroy_node(dentry);
     684        rc = tmpfs_destroy_node(FS_NODE(dentry));
    676685        ipc_answer_0(rid, rc);
    677686}
Note: See TracChangeset for help on using the changeset viewer.