X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Ftipc%2Fref.c;fp=net%2Ftipc%2Fref.c;h=5a13c2defe4a2039897a2a1c9278dccb073becea;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=e6d6ae22ea495065db2e5862c8ec41b95fda8661;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/net/tipc/ref.c b/net/tipc/ref.c index e6d6ae22e..5a13c2def 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c @@ -61,9 +61,9 @@ * because entry 0's reference field has the form XXXX|1--1. */ -struct ref_table tipc_ref_table = { NULL }; +struct ref_table tipc_ref_table = { 0 }; -static DEFINE_RWLOCK(ref_table_lock); +static rwlock_t ref_table_lock = RW_LOCK_UNLOCKED; /** * tipc_ref_table_init - create reference table for objects @@ -79,15 +79,15 @@ int tipc_ref_table_init(u32 requested_size, u32 start) while (sz < requested_size) { sz <<= 1; } - table = vmalloc(sz * sizeof(*table)); + table = (struct reference *)vmalloc(sz * sizeof(struct reference)); if (table == NULL) return -ENOMEM; write_lock_bh(&ref_table_lock); index_mask = sz - 1; for (i = sz - 1; i >= 0; i--) { - table[i].object = NULL; - spin_lock_init(&table[i].lock); + table[i].object = 0; + table[i].lock = SPIN_LOCK_UNLOCKED; table[i].data.next_plus_upper = (start & ~index_mask) + i - 1; } tipc_ref_table.entries = table; @@ -108,7 +108,7 @@ void tipc_ref_table_stop(void) return; vfree(tipc_ref_table.entries); - tipc_ref_table.entries = NULL; + tipc_ref_table.entries = 0; } /** @@ -127,14 +127,7 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) u32 next_plus_upper; u32 reference = 0; - if (!object) { - err("Attempt to acquire reference to non-existent object\n"); - return 0; - } - if (!tipc_ref_table.entries) { - err("Reference table not found during acquisition attempt\n"); - return 0; - } + assert(tipc_ref_table.entries && object); write_lock_bh(&ref_table_lock); if (tipc_ref_table.first_free) { @@ -169,31 +162,18 @@ void tipc_ref_discard(u32 ref) u32 index; u32 index_mask; - if (!ref) { - err("Attempt to discard reference 0\n"); - return; - } - if (!tipc_ref_table.entries) { - err("Reference table not found during discard attempt\n"); - return; - } + assert(tipc_ref_table.entries); + assert(ref != 0); write_lock_bh(&ref_table_lock); index_mask = tipc_ref_table.index_mask; index = ref & index_mask; entry = &(tipc_ref_table.entries[index]); - - if (!entry->object) { - err("Attempt to discard reference to non-existent object\n"); - goto exit; - } - if (entry->data.reference != ref) { - err("Attempt to discard non-existent reference\n"); - goto exit; - } + assert(entry->object != 0); + assert(entry->data.reference == ref); /* mark entry as unused */ - entry->object = NULL; + entry->object = 0; if (tipc_ref_table.first_free == 0) tipc_ref_table.first_free = index; else @@ -204,7 +184,6 @@ void tipc_ref_discard(u32 ref) /* increment upper bits of entry to invalidate subsequent references */ entry->data.next_plus_upper = (ref & ~index_mask) + (index_mask + 1); -exit: write_unlock_bh(&ref_table_lock); }