Rev 2680 | Rev 2691 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2680 | Rev 2687 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | #include <string.h> |
40 | #include <string.h> |
41 | #include <atomic.h> |
41 | #include <atomic.h> |
42 | #include <futex.h> |
42 | #include <futex.h> |
43 | #include <rwlock.h> |
43 | #include <rwlock.h> |
44 | #include <libadt/hash_table.h> |
44 | #include <libadt/hash_table.h> |
- | 45 | #include <assert.h> |
|
45 | 46 | ||
46 | /** Futex protecting the VFS node hash table. */ |
47 | /** Futex protecting the VFS node hash table. */ |
47 | atomic_t nodes_futex = FUTEX_INITIALIZER; |
48 | atomic_t nodes_futex = FUTEX_INITIALIZER; |
48 | 49 | ||
49 | #define NODES_BUCKETS_LOG 8 |
50 | #define NODES_BUCKETS_LOG 8 |
Line 119... | Line 120... | ||
119 | * 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 |
120 | * 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 |
121 | * vfs_node_put() on it. |
122 | * vfs_node_put() on it. |
122 | * |
123 | * |
123 | * @param triplet Triplet encoding the identity of the VFS node. |
124 | * @param triplet Triplet encoding the identity of the VFS node. |
- | 125 | * @param size Size of the node as filled by vfs_lookup_internal(). |
|
124 | * |
126 | * |
125 | * @return VFS node corresponding to the given triplet. |
127 | * @return VFS node corresponding to the given triplet. |
126 | */ |
128 | */ |
127 | vfs_node_t *vfs_node_get(vfs_triplet_t *triplet) |
129 | vfs_node_t *vfs_node_get(vfs_triplet_t *triplet, size_t size) |
128 | { |
130 | { |
129 | unsigned long key[] = { |
131 | unsigned long key[] = { |
130 | [KEY_FS_HANDLE] = triplet->fs_handle, |
132 | [KEY_FS_HANDLE] = triplet->fs_handle, |
131 | [KEY_DEV_HANDLE] = triplet->dev_handle, |
133 | [KEY_DEV_HANDLE] = triplet->dev_handle, |
132 | [KEY_INDEX] = triplet->index |
134 | [KEY_INDEX] = triplet->index |
Line 144... | Line 146... | ||
144 | } |
146 | } |
145 | memset(node, 0, sizeof(vfs_node_t)); |
147 | memset(node, 0, sizeof(vfs_node_t)); |
146 | node->fs_handle = triplet->fs_handle; |
148 | node->fs_handle = triplet->fs_handle; |
147 | node->dev_handle = triplet->fs_handle; |
149 | node->dev_handle = triplet->fs_handle; |
148 | node->index = triplet->index; |
150 | node->index = triplet->index; |
- | 151 | node->size = size; |
|
149 | link_initialize(&node->nh_link); |
152 | link_initialize(&node->nh_link); |
150 | rwlock_initialize(&node->contents_rwlock); |
153 | rwlock_initialize(&node->contents_rwlock); |
151 | hash_table_insert(&nodes, key, &node->nh_link); |
154 | hash_table_insert(&nodes, key, &node->nh_link); |
152 | } else { |
155 | } else { |
153 | node = hash_table_get_instance(tmp, vfs_node_t, nh_link); |
156 | node = hash_table_get_instance(tmp, vfs_node_t, nh_link); |
154 | } |
157 | } |
- | 158 | ||
- | 159 | assert(node->size == size); |
|
- | 160 | ||
155 | _vfs_node_addref(node); |
161 | _vfs_node_addref(node); |
156 | futex_up(&nodes_futex); |
162 | futex_up(&nodes_futex); |
157 | 163 | ||
158 | return node; |
164 | return node; |
159 | } |
165 | } |