Changes in uspace/srv/vfs/vfs_node.c [8b58fc1:96b02eb9] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_node.c
r8b58fc1 r96b02eb9 38 38 #include "vfs.h" 39 39 #include <stdlib.h> 40 #include <str ing.h>41 #include <fibril_sync .h>40 #include <str.h> 41 #include <fibril_synch.h> 42 42 #include <adt/hash_table.h> 43 43 #include <assert.h> … … 113 113 unsigned long key[] = { 114 114 [KEY_FS_HANDLE] = node->fs_handle, 115 [KEY_DEV_HANDLE] = node->dev _handle,115 [KEY_DEV_HANDLE] = node->devmap_handle, 116 116 [KEY_INDEX] = node->index 117 117 }; … … 129 129 */ 130 130 int phone = vfs_grab_phone(node->fs_handle); 131 ipcarg_t rc;131 sysarg_t rc; 132 132 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); 134 134 assert(rc == EOK); 135 vfs_release_phone( phone);135 vfs_release_phone(node->fs_handle, phone); 136 136 } 137 137 if (free_vfs_node) 138 138 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 */ 148 void 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); 139 159 } 140 160 … … 155 175 unsigned long key[] = { 156 176 [KEY_FS_HANDLE] = result->triplet.fs_handle, 157 [KEY_DEV_HANDLE] = result->triplet.dev _handle,177 [KEY_DEV_HANDLE] = result->triplet.devmap_handle, 158 178 [KEY_INDEX] = result->triplet.index 159 179 }; … … 171 191 memset(node, 0, sizeof(vfs_node_t)); 172 192 node->fs_handle = result->triplet.fs_handle; 173 node->dev _handle = result->triplet.dev_handle;193 node->devmap_handle = result->triplet.devmap_handle; 174 194 node->index = result->triplet.index; 175 195 node->size = result->size; … … 222 242 { 223 243 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]) && 226 246 (node->index == key[KEY_INDEX]); 227 247 } … … 229 249 void nodes_remove_callback(link_t *item) 230 250 { 251 } 252 253 struct 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 260 static 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 270 unsigned 271 vfs_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; 231 284 } 232 285
Note:
See TracChangeset
for help on using the changeset viewer.