Ignore:
File:
1 edited

Legend:

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

    r8b58fc1 r96b02eb9  
    3838#include "vfs.h"
    3939#include <stdlib.h>
    40 #include <string.h>
    41 #include <fibril_sync.h>
     40#include <str.h>
     41#include <fibril_synch.h>
    4242#include <adt/hash_table.h>
    4343#include <assert.h>
     
    113113                unsigned long key[] = {
    114114                        [KEY_FS_HANDLE] = node->fs_handle,
    115                         [KEY_DEV_HANDLE] = node->dev_handle,
     115                        [KEY_DEV_HANDLE] = node->devmap_handle,
    116116                        [KEY_INDEX] = node->index
    117117                };
     
    129129                 */
    130130                int phone = vfs_grab_phone(node->fs_handle);
    131                 ipcarg_t rc;
     131                sysarg_t rc;
    132132                rc = async_req_2_0(phone, VFS_OUT_DESTROY,
    133                     (ipcarg_t)node->dev_handle, (ipcarg_t)node->index);
     133                    (sysarg_t)node->devmap_handle, (sysarg_t)node->index);
    134134                assert(rc == EOK);
    135                 vfs_release_phone(phone);
     135                vfs_release_phone(node->fs_handle, phone);
    136136        }
    137137        if (free_vfs_node)
    138138                free(node);
     139}
     140
     141/** Forget node.
     142 *
     143 * This function will remove the node from the node hash table and deallocate
     144 * its memory, regardless of the node's reference count.
     145 *
     146 * @param node  Node to be forgotten.
     147 */
     148void vfs_node_forget(vfs_node_t *node)
     149{
     150        fibril_mutex_lock(&nodes_mutex);
     151        unsigned long key[] = {
     152                [KEY_FS_HANDLE] = node->fs_handle,
     153                [KEY_DEV_HANDLE] = node->devmap_handle,
     154                [KEY_INDEX] = node->index
     155        };
     156        hash_table_remove(&nodes, key, 3);
     157        fibril_mutex_unlock(&nodes_mutex);
     158        free(node);
    139159}
    140160
     
    155175        unsigned long key[] = {
    156176                [KEY_FS_HANDLE] = result->triplet.fs_handle,
    157                 [KEY_DEV_HANDLE] = result->triplet.dev_handle,
     177                [KEY_DEV_HANDLE] = result->triplet.devmap_handle,
    158178                [KEY_INDEX] = result->triplet.index
    159179        };
     
    171191                memset(node, 0, sizeof(vfs_node_t));
    172192                node->fs_handle = result->triplet.fs_handle;
    173                 node->dev_handle = result->triplet.dev_handle;
     193                node->devmap_handle = result->triplet.devmap_handle;
    174194                node->index = result->triplet.index;
    175195                node->size = result->size;
     
    222242{
    223243        vfs_node_t *node = hash_table_get_instance(item, vfs_node_t, nh_link);
    224         return (node->fs_handle == key[KEY_FS_HANDLE]) &&
    225             (node->dev_handle == key[KEY_DEV_HANDLE]) &&
     244        return (node->fs_handle == (fs_handle_t) key[KEY_FS_HANDLE]) &&
     245            (node->devmap_handle == key[KEY_DEV_HANDLE]) &&
    226246            (node->index == key[KEY_INDEX]);
    227247}
     
    229249void nodes_remove_callback(link_t *item)
    230250{
     251}
     252
     253struct refcnt_data {
     254        /** Sum of all reference counts for this file system instance. */
     255        unsigned refcnt;
     256        fs_handle_t fs_handle;
     257        devmap_handle_t devmap_handle;
     258};
     259
     260static void refcnt_visitor(link_t *item, void *arg)
     261{
     262        vfs_node_t *node = hash_table_get_instance(item, vfs_node_t, nh_link);
     263        struct refcnt_data *rd = (void *) arg;
     264
     265        if ((node->fs_handle == rd->fs_handle) &&
     266            (node->devmap_handle == rd->devmap_handle))
     267                rd->refcnt += node->refcnt;
     268}
     269
     270unsigned
     271vfs_nodes_refcount_sum_get(fs_handle_t fs_handle, devmap_handle_t devmap_handle)
     272{
     273        struct refcnt_data rd = {
     274                .refcnt = 0,
     275                .fs_handle = fs_handle,
     276                .devmap_handle = devmap_handle
     277        };
     278
     279        fibril_mutex_lock(&nodes_mutex);
     280        hash_table_apply(&nodes, refcnt_visitor, &rd);
     281        fibril_mutex_unlock(&nodes_mutex);
     282
     283        return rd.refcnt;
    231284}
    232285
Note: See TracChangeset for help on using the changeset viewer.