Changeset b0f00a9 in mainline for uspace/srv/vfs/vfs_node.c
- Timestamp:
- 2011-11-06T22:21:05Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 898e847
- Parents:
- 2bdf8313 (diff), 7b5f4c9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
uspace/srv/vfs/vfs_node.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/vfs/vfs_node.c
r2bdf8313 rb0f00a9 104 104 bool free_vfs_node = false; 105 105 bool free_fs_node = false; 106 107 fibril_mutex_lock(&nodes_mutex); 106 107 fibril_mutex_lock(&nodes_mutex); 108 108 109 if (node->refcnt-- == 1) { 110 109 111 /* 110 112 * We are dropping the last reference to this node. 111 113 * Remove it from the VFS node hash table. 112 114 */ 115 113 116 unsigned long key[] = { 114 117 [KEY_FS_HANDLE] = node->fs_handle, 115 [KEY_DEV_HANDLE] = node-> devmap_handle,118 [KEY_DEV_HANDLE] = node->service_id, 116 119 [KEY_INDEX] = node->index 117 120 }; 121 118 122 hash_table_remove(&nodes, key, 3); 119 123 free_vfs_node = true; 124 120 125 if (!node->lnkcnt) 121 126 free_fs_node = true; 122 127 } 123 fibril_mutex_unlock(&nodes_mutex); 124 128 129 fibril_mutex_unlock(&nodes_mutex); 130 125 131 if (free_fs_node) { 126 /* 132 133 /* 127 134 * The node is not visible in the file system namespace. 128 135 * Free up its resources. 129 136 */ 130 int phone = vfs_grab_phone(node->fs_handle); 131 sysarg_t rc; 132 rc = async_req_2_0(phone, VFS_OUT_DESTROY, 133 (sysarg_t)node->devmap_handle, (sysarg_t)node->index); 137 138 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 139 sysarg_t rc = async_req_2_0(exch, VFS_OUT_DESTROY, 140 (sysarg_t) node->service_id, (sysarg_t)node->index); 141 134 142 assert(rc == EOK); 135 vfs_ release_phone(node->fs_handle, phone);143 vfs_exchange_release(exch); 136 144 } 145 137 146 if (free_vfs_node) 138 147 free(node); … … 151 160 unsigned long key[] = { 152 161 [KEY_FS_HANDLE] = node->fs_handle, 153 [KEY_DEV_HANDLE] = node-> devmap_handle,162 [KEY_DEV_HANDLE] = node->service_id, 154 163 [KEY_INDEX] = node->index 155 164 }; … … 175 184 unsigned long key[] = { 176 185 [KEY_FS_HANDLE] = result->triplet.fs_handle, 177 [KEY_DEV_HANDLE] = result->triplet. devmap_handle,186 [KEY_DEV_HANDLE] = result->triplet.service_id, 178 187 [KEY_INDEX] = result->triplet.index 179 188 }; … … 191 200 memset(node, 0, sizeof(vfs_node_t)); 192 201 node->fs_handle = result->triplet.fs_handle; 193 node-> devmap_handle = result->triplet.devmap_handle;202 node->service_id = result->triplet.service_id; 194 203 node->index = result->triplet.index; 195 204 node->size = result->size; … … 243 252 vfs_node_t *node = hash_table_get_instance(item, vfs_node_t, nh_link); 244 253 return (node->fs_handle == (fs_handle_t) key[KEY_FS_HANDLE]) && 245 (node-> devmap_handle== key[KEY_DEV_HANDLE]) &&254 (node->service_id == key[KEY_DEV_HANDLE]) && 246 255 (node->index == key[KEY_INDEX]); 247 256 } … … 255 264 unsigned refcnt; 256 265 fs_handle_t fs_handle; 257 devmap_handle_t devmap_handle;266 service_id_t service_id; 258 267 }; 259 268 … … 264 273 265 274 if ((node->fs_handle == rd->fs_handle) && 266 (node-> devmap_handle == rd->devmap_handle))275 (node->service_id == rd->service_id)) 267 276 rd->refcnt += node->refcnt; 268 277 } 269 278 270 279 unsigned 271 vfs_nodes_refcount_sum_get(fs_handle_t fs_handle, devmap_handle_t devmap_handle)280 vfs_nodes_refcount_sum_get(fs_handle_t fs_handle, service_id_t service_id) 272 281 { 273 282 struct refcnt_data rd = { 274 283 .refcnt = 0, 275 284 .fs_handle = fs_handle, 276 . devmap_handle = devmap_handle285 .service_id = service_id 277 286 }; 278 287 … … 282 291 283 292 return rd.refcnt; 293 } 294 295 296 /** Perform a remote node open operation. 297 * 298 * @return EOK on success or an error code from errno.h. 299 * 300 */ 301 int vfs_open_node_remote(vfs_node_t *node) 302 { 303 async_exch_t *exch = vfs_exchange_grab(node->fs_handle); 304 305 ipc_call_t answer; 306 aid_t req = async_send_2(exch, VFS_OUT_OPEN_NODE, 307 (sysarg_t) node->service_id, (sysarg_t) node->index, &answer); 308 309 vfs_exchange_release(exch); 310 311 sysarg_t rc; 312 async_wait_for(req, &rc); 313 314 return rc; 284 315 } 285 316
Note:
See TracChangeset
for help on using the changeset viewer.
