Rev 2687 | Rev 2731 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2687 | Rev 2691 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * Copyright (c) 2007 Jakub Jermar |
2 | * Copyright (c) 2008 Jakub Jermar |
3 | * All rights reserved. |
3 | * All rights reserved. |
4 | * |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
7 | * are met: |
Line 119... | Line 119... | ||
119 | * table. In case the triplet is not found there, a new VFS node is created. |
119 | * table. In case the triplet is not found there, a new VFS node is created. |
120 | * In any case, the VFS node will have its reference count incremented. Every |
120 | * In any case, the VFS node will have its reference count incremented. Every |
121 | * node returned by this call should be eventually put back by calling |
121 | * node returned by this call should be eventually put back by calling |
122 | * vfs_node_put() on it. |
122 | * vfs_node_put() on it. |
123 | * |
123 | * |
124 | * @param triplet Triplet encoding the identity of the VFS node. |
124 | * @param result Populated lookup result structure. |
125 | * @param size Size of the node as filled by vfs_lookup_internal(). |
- | |
126 | * |
125 | * |
127 | * @return VFS node corresponding to the given triplet. |
126 | * @return VFS node corresponding to the given triplet. |
128 | */ |
127 | */ |
129 | vfs_node_t *vfs_node_get(vfs_triplet_t *triplet, size_t size) |
128 | vfs_node_t *vfs_node_get(vfs_lookup_res_t *result) |
130 | { |
129 | { |
131 | unsigned long key[] = { |
130 | unsigned long key[] = { |
132 | [KEY_FS_HANDLE] = triplet->fs_handle, |
131 | [KEY_FS_HANDLE] = result->triplet.fs_handle, |
133 | [KEY_DEV_HANDLE] = triplet->dev_handle, |
132 | [KEY_DEV_HANDLE] = result->triplet.dev_handle, |
134 | [KEY_INDEX] = triplet->index |
133 | [KEY_INDEX] = result->triplet.index |
135 | }; |
134 | }; |
136 | link_t *tmp; |
135 | link_t *tmp; |
137 | vfs_node_t *node; |
136 | vfs_node_t *node; |
138 | 137 | ||
139 | futex_down(&nodes_futex); |
138 | futex_down(&nodes_futex); |
Line 143... | Line 142... | ||
143 | if (!node) { |
142 | if (!node) { |
144 | futex_up(&nodes_futex); |
143 | futex_up(&nodes_futex); |
145 | return NULL; |
144 | return NULL; |
146 | } |
145 | } |
147 | memset(node, 0, sizeof(vfs_node_t)); |
146 | memset(node, 0, sizeof(vfs_node_t)); |
148 | node->fs_handle = triplet->fs_handle; |
147 | node->fs_handle = result->triplet.fs_handle; |
149 | node->dev_handle = triplet->fs_handle; |
148 | node->dev_handle = result->triplet.fs_handle; |
150 | node->index = triplet->index; |
149 | node->index = result->triplet.index; |
151 | node->size = size; |
150 | node->size = result->size; |
152 | link_initialize(&node->nh_link); |
151 | link_initialize(&node->nh_link); |
153 | rwlock_initialize(&node->contents_rwlock); |
152 | rwlock_initialize(&node->contents_rwlock); |
154 | hash_table_insert(&nodes, key, &node->nh_link); |
153 | hash_table_insert(&nodes, key, &node->nh_link); |
155 | } else { |
154 | } else { |
156 | node = hash_table_get_instance(tmp, vfs_node_t, nh_link); |
155 | node = hash_table_get_instance(tmp, vfs_node_t, nh_link); |
157 | } |
156 | } |
158 | 157 | ||
159 | assert(node->size == size); |
158 | assert(node->size == result->size); |
160 | 159 | ||
161 | _vfs_node_addref(node); |
160 | _vfs_node_addref(node); |
162 | futex_up(&nodes_futex); |
161 | futex_up(&nodes_futex); |
163 | 162 | ||
164 | return node; |
163 | return node; |