Commit f131072c authored by Allan Stephens's avatar Allan Stephens Committed by David S. Miller

[TIPC]: First phase of assert() cleanup

This also contains enhancements to simplify comparisons in name table
publication removal algorithm and to simplify name table sanity checking
when shutting down TIPC.
Signed-off-by: default avatarAllan Stephens <allan.stephens@windriver.com>
Signed-off-by: default avatarPer Liden <per.liden@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e100ae92
...@@ -574,7 +574,6 @@ void tipc_link_wakeup_ports(struct link *l_ptr, int all) ...@@ -574,7 +574,6 @@ void tipc_link_wakeup_ports(struct link *l_ptr, int all)
break; break;
list_del_init(&p_ptr->wait_list); list_del_init(&p_ptr->wait_list);
p_ptr->congested_link = NULL; p_ptr->congested_link = NULL;
assert(p_ptr->wakeup);
spin_lock_bh(p_ptr->publ.lock); spin_lock_bh(p_ptr->publ.lock);
p_ptr->publ.congested = 0; p_ptr->publ.congested = 0;
p_ptr->wakeup(&p_ptr->publ); p_ptr->wakeup(&p_ptr->publ);
...@@ -1246,8 +1245,6 @@ int tipc_link_send_sections_fast(struct port *sender, ...@@ -1246,8 +1245,6 @@ int tipc_link_send_sections_fast(struct port *sender,
int res; int res;
u32 selector = msg_origport(hdr) & 1; u32 selector = msg_origport(hdr) & 1;
assert(destaddr != tipc_own_addr);
again: again:
/* /*
* Try building message using port's max_pkt hint. * Try building message using port's max_pkt hint.
...@@ -2310,7 +2307,6 @@ void tipc_link_tunnel(struct link *l_ptr, ...@@ -2310,7 +2307,6 @@ void tipc_link_tunnel(struct link *l_ptr,
memcpy(buf->data + INT_H_SIZE, (unchar *)msg, length); memcpy(buf->data + INT_H_SIZE, (unchar *)msg, length);
dbg("%c->%c:", l_ptr->b_ptr->net_plane, tunnel->b_ptr->net_plane); dbg("%c->%c:", l_ptr->b_ptr->net_plane, tunnel->b_ptr->net_plane);
msg_dbg(buf_msg(buf), ">SEND>"); msg_dbg(buf_msg(buf), ">SEND>");
assert(tunnel);
tipc_link_send_buf(tunnel, buf); tipc_link_send_buf(tunnel, buf);
} }
...@@ -2339,10 +2335,10 @@ void tipc_link_changeover(struct link *l_ptr) ...@@ -2339,10 +2335,10 @@ void tipc_link_changeover(struct link *l_ptr)
ORIGINAL_MSG, TIPC_OK, INT_H_SIZE, l_ptr->addr); ORIGINAL_MSG, TIPC_OK, INT_H_SIZE, l_ptr->addr);
msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id);
msg_set_msgcnt(&tunnel_hdr, msgcount); msg_set_msgcnt(&tunnel_hdr, msgcount);
if (!l_ptr->first_out) { if (!l_ptr->first_out) {
struct sk_buff *buf; struct sk_buff *buf;
assert(!msgcount);
buf = buf_acquire(INT_H_SIZE); buf = buf_acquire(INT_H_SIZE);
if (buf) { if (buf) {
memcpy(buf->data, (unchar *)&tunnel_hdr, INT_H_SIZE); memcpy(buf->data, (unchar *)&tunnel_hdr, INT_H_SIZE);
...@@ -2356,6 +2352,7 @@ void tipc_link_changeover(struct link *l_ptr) ...@@ -2356,6 +2352,7 @@ void tipc_link_changeover(struct link *l_ptr)
} }
return; return;
} }
while (crs) { while (crs) {
struct tipc_msg *msg = buf_msg(crs); struct tipc_msg *msg = buf_msg(crs);
...@@ -2455,11 +2452,15 @@ static int link_recv_changeover_msg(struct link **l_ptr, ...@@ -2455,11 +2452,15 @@ static int link_recv_changeover_msg(struct link **l_ptr,
u32 msg_count = msg_msgcnt(tunnel_msg); u32 msg_count = msg_msgcnt(tunnel_msg);
dest_link = (*l_ptr)->owner->links[msg_bearer_id(tunnel_msg)]; dest_link = (*l_ptr)->owner->links[msg_bearer_id(tunnel_msg)];
assert(dest_link != *l_ptr);
if (!dest_link) { if (!dest_link) {
msg_dbg(tunnel_msg, "NOLINK/<REC<"); msg_dbg(tunnel_msg, "NOLINK/<REC<");
goto exit; goto exit;
} }
if (dest_link == *l_ptr) {
err("Unexpected changeover message on link <%s>\n",
(*l_ptr)->name);
goto exit;
}
dbg("%c<-%c:", dest_link->b_ptr->net_plane, dbg("%c<-%c:", dest_link->b_ptr->net_plane,
(*l_ptr)->b_ptr->net_plane); (*l_ptr)->b_ptr->net_plane);
*l_ptr = dest_link; *l_ptr = dest_link;
......
...@@ -174,7 +174,6 @@ void tipc_named_node_up(unsigned long node) ...@@ -174,7 +174,6 @@ void tipc_named_node_up(unsigned long node)
u32 rest; u32 rest;
u32 max_item_buf; u32 max_item_buf;
assert(in_own_cluster(node));
read_lock_bh(&tipc_nametbl_lock); read_lock_bh(&tipc_nametbl_lock);
max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE; max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE;
max_item_buf *= ITEM_SIZE; max_item_buf *= ITEM_SIZE;
...@@ -221,15 +220,24 @@ void tipc_named_node_up(unsigned long node) ...@@ -221,15 +220,24 @@ void tipc_named_node_up(unsigned long node)
static void node_is_down(struct publication *publ) static void node_is_down(struct publication *publ)
{ {
struct publication *p; struct publication *p;
write_lock_bh(&tipc_nametbl_lock); write_lock_bh(&tipc_nametbl_lock);
dbg("node_is_down: withdrawing %u, %u, %u\n", dbg("node_is_down: withdrawing %u, %u, %u\n",
publ->type, publ->lower, publ->upper); publ->type, publ->lower, publ->upper);
publ->key += 1222345; publ->key += 1222345;
p = tipc_nametbl_remove_publ(publ->type, publ->lower, p = tipc_nametbl_remove_publ(publ->type, publ->lower,
publ->node, publ->ref, publ->key); publ->node, publ->ref, publ->key);
assert(p == publ);
write_unlock_bh(&tipc_nametbl_lock); write_unlock_bh(&tipc_nametbl_lock);
kfree(publ);
if (p != publ) {
err("Unable to remove publication from failed node\n"
"(type=%u, lower=%u, node=0x%x, ref=%u, key=%u)\n",
publ->type, publ->lower, publ->node, publ->ref, publ->key);
}
if (p) {
kfree(p);
}
} }
/** /**
...@@ -275,6 +283,12 @@ void tipc_named_recv(struct sk_buff *buf) ...@@ -275,6 +283,12 @@ void tipc_named_recv(struct sk_buff *buf)
if (publ) { if (publ) {
tipc_nodesub_unsubscribe(&publ->subscr); tipc_nodesub_unsubscribe(&publ->subscr);
kfree(publ); kfree(publ);
} else {
err("Unable to remove publication by node 0x%x\n"
"(type=%u, lower=%u, ref=%u, key=%u)\n",
msg_orignode(msg),
ntohl(item->type), ntohl(item->lower),
ntohl(item->ref), ntohl(item->key));
} }
} else { } else {
warn("tipc_named_recv: unknown msg\n"); warn("tipc_named_recv: unknown msg\n");
......
This diff is collapsed.
...@@ -234,7 +234,6 @@ struct node *tipc_node_attach_link(struct link *l_ptr) ...@@ -234,7 +234,6 @@ struct node *tipc_node_attach_link(struct link *l_ptr)
u32 bearer_id = l_ptr->b_ptr->identity; u32 bearer_id = l_ptr->b_ptr->identity;
char addr_string[16]; char addr_string[16];
assert(bearer_id < MAX_BEARERS);
if (n_ptr->link_cnt >= 2) { if (n_ptr->link_cnt >= 2) {
char addr_string[16]; char addr_string[16];
...@@ -314,7 +313,7 @@ static void node_established_contact(struct node *n_ptr) ...@@ -314,7 +313,7 @@ static void node_established_contact(struct node *n_ptr)
struct cluster *c_ptr; struct cluster *c_ptr;
dbg("node_established_contact:-> %x\n", n_ptr->addr); dbg("node_established_contact:-> %x\n", n_ptr->addr);
if (!tipc_node_has_active_routes(n_ptr)) { if (!tipc_node_has_active_routes(n_ptr) && in_own_cluster(n_ptr->addr)) {
tipc_k_signal((Handler)tipc_named_node_up, n_ptr->addr); tipc_k_signal((Handler)tipc_named_node_up, n_ptr->addr);
} }
......
...@@ -47,18 +47,19 @@ ...@@ -47,18 +47,19 @@
void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr,
void *usr_handle, net_ev_handler handle_down) void *usr_handle, net_ev_handler handle_down)
{ {
if (addr == tipc_own_addr) {
node_sub->node = NULL; node_sub->node = NULL;
if (addr == tipc_own_addr)
return;
if (!tipc_addr_node_valid(addr)) {
warn("node_subscr with illegal %x\n", addr);
return; return;
} }
node_sub->node = tipc_node_find(addr);
if (!node_sub->node) {
warn("Node subscription rejected, unknown node 0x%x\n", addr);
return;
}
node_sub->handle_node_down = handle_down; node_sub->handle_node_down = handle_down;
node_sub->usr_handle = usr_handle; node_sub->usr_handle = usr_handle;
node_sub->node = tipc_node_find(addr);
assert(node_sub->node);
tipc_node_lock(node_sub->node); tipc_node_lock(node_sub->node);
list_add_tail(&node_sub->nodesub_list, &node_sub->node->nsub); list_add_tail(&node_sub->nodesub_list, &node_sub->node->nsub);
tipc_node_unlock(node_sub->node); tipc_node_unlock(node_sub->node);
......
...@@ -168,7 +168,6 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) ...@@ -168,7 +168,6 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp)
struct port_list *item = dp; struct port_list *item = dp;
int cnt = 0; int cnt = 0;
assert(buf);
msg = buf_msg(buf); msg = buf_msg(buf);
/* Create destination port list, if one wasn't supplied */ /* Create destination port list, if one wasn't supplied */
......
...@@ -127,7 +127,14 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) ...@@ -127,7 +127,14 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock)
u32 next_plus_upper; u32 next_plus_upper;
u32 reference = 0; u32 reference = 0;
assert(tipc_ref_table.entries && object); 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;
}
write_lock_bh(&ref_table_lock); write_lock_bh(&ref_table_lock);
if (tipc_ref_table.first_free) { if (tipc_ref_table.first_free) {
...@@ -162,15 +169,28 @@ void tipc_ref_discard(u32 ref) ...@@ -162,15 +169,28 @@ void tipc_ref_discard(u32 ref)
u32 index; u32 index;
u32 index_mask; u32 index_mask;
assert(tipc_ref_table.entries); if (!ref) {
assert(ref != 0); err("Attempt to discard reference 0\n");
return;
}
if (!tipc_ref_table.entries) {
err("Reference table not found during discard attempt\n");
return;
}
write_lock_bh(&ref_table_lock); write_lock_bh(&ref_table_lock);
index_mask = tipc_ref_table.index_mask; index_mask = tipc_ref_table.index_mask;
index = ref & index_mask; index = ref & index_mask;
entry = &(tipc_ref_table.entries[index]); entry = &(tipc_ref_table.entries[index]);
assert(entry->object != 0);
assert(entry->data.reference == ref); 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;
}
/* mark entry as unused */ /* mark entry as unused */
entry->object = NULL; entry->object = NULL;
...@@ -184,6 +204,7 @@ void tipc_ref_discard(u32 ref) ...@@ -184,6 +204,7 @@ void tipc_ref_discard(u32 ref)
/* increment upper bits of entry to invalidate subsequent references */ /* increment upper bits of entry to invalidate subsequent references */
entry->data.next_plus_upper = (ref & ~index_mask) + (index_mask + 1); entry->data.next_plus_upper = (ref & ~index_mask) + (index_mask + 1);
exit:
write_unlock_bh(&ref_table_lock); write_unlock_bh(&ref_table_lock);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment