242
243 entry->object = NULL;
244 entry->ref = (ref & ~index_mask) + (index_mask + 1);
245
246
247
248 if (tipc_ref_table.first_free == 0)
249 tipc_ref_table.first_free = index;
250 else
251 tipc_ref_table.entries[tipc_ref_table.last_free].ref |= index;
252 tipc_ref_table.last_free = index;
253
254exit:
255 write_unlock_bh(&ref_table_lock);
256}
257
258
259
260
261
262void *tipc_ref_lock(u32 ref)
263{
264 if (likely(tipc_ref_table.entries)) {
265 struct reference *entry;
266
267 entry = &tipc_ref_table.entries[ref &
268 tipc_ref_table.index_mask];
269 if (likely(entry->ref != 0)) {
270 spin_lock_bh(&entry->lock);
271 if (likely((entry->ref == ref) && (entry->object)))
272 return entry->object;
273 spin_unlock_bh(&entry->lock);
274 }
275 }
276 return NULL;
277}
278
279
280
281
282