diff options
Diffstat (limited to 'net/tipc/name_distr.c')
-rw-r--r-- | net/tipc/name_distr.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index 483c226c9581..c9fa6dfcf287 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * net/tipc/name_distr.c: TIPC name distribution code | 2 | * net/tipc/name_distr.c: TIPC name distribution code |
3 | * | 3 | * |
4 | * Copyright (c) 2000-2006, Ericsson AB | 4 | * Copyright (c) 2000-2006, Ericsson AB |
5 | * Copyright (c) 2005, Wind River Systems | 5 | * Copyright (c) 2005, 2010-2011, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
@@ -109,11 +109,9 @@ static void named_cluster_distribute(struct sk_buff *buf) | |||
109 | { | 109 | { |
110 | struct sk_buff *buf_copy; | 110 | struct sk_buff *buf_copy; |
111 | struct tipc_node *n_ptr; | 111 | struct tipc_node *n_ptr; |
112 | u32 n_num; | ||
113 | 112 | ||
114 | for (n_num = 1; n_num <= tipc_net.highest_node; n_num++) { | 113 | list_for_each_entry(n_ptr, &tipc_node_list, list) { |
115 | n_ptr = tipc_net.nodes[n_num]; | 114 | if (tipc_node_active_links(n_ptr)) { |
116 | if (n_ptr && tipc_node_has_active_links(n_ptr)) { | ||
117 | buf_copy = skb_copy(buf, GFP_ATOMIC); | 115 | buf_copy = skb_copy(buf, GFP_ATOMIC); |
118 | if (!buf_copy) | 116 | if (!buf_copy) |
119 | break; | 117 | break; |
@@ -214,17 +212,16 @@ exit: | |||
214 | } | 212 | } |
215 | 213 | ||
216 | /** | 214 | /** |
217 | * node_is_down - remove publication associated with a failed node | 215 | * named_purge_publ - remove publication associated with a failed node |
218 | * | 216 | * |
219 | * Invoked for each publication issued by a newly failed node. | 217 | * Invoked for each publication issued by a newly failed node. |
220 | * Removes publication structure from name table & deletes it. | 218 | * Removes publication structure from name table & deletes it. |
221 | * In rare cases the link may have come back up again when this | 219 | * In rare cases the link may have come back up again when this |
222 | * function is called, and we have two items representing the same | 220 | * function is called, and we have two items representing the same |
223 | * publication. Nudge this item's key to distinguish it from the other. | 221 | * publication. Nudge this item's key to distinguish it from the other. |
224 | * (Note: Publication's node subscription is already unsubscribed.) | ||
225 | */ | 222 | */ |
226 | 223 | ||
227 | static void node_is_down(struct publication *publ) | 224 | static void named_purge_publ(struct publication *publ) |
228 | { | 225 | { |
229 | struct publication *p; | 226 | struct publication *p; |
230 | 227 | ||
@@ -232,6 +229,8 @@ static void node_is_down(struct publication *publ) | |||
232 | publ->key += 1222345; | 229 | publ->key += 1222345; |
233 | p = tipc_nametbl_remove_publ(publ->type, publ->lower, | 230 | p = tipc_nametbl_remove_publ(publ->type, publ->lower, |
234 | publ->node, publ->ref, publ->key); | 231 | publ->node, publ->ref, publ->key); |
232 | if (p) | ||
233 | tipc_nodesub_unsubscribe(&p->subscr); | ||
235 | write_unlock_bh(&tipc_nametbl_lock); | 234 | write_unlock_bh(&tipc_nametbl_lock); |
236 | 235 | ||
237 | if (p != publ) { | 236 | if (p != publ) { |
@@ -268,7 +267,8 @@ void tipc_named_recv(struct sk_buff *buf) | |||
268 | tipc_nodesub_subscribe(&publ->subscr, | 267 | tipc_nodesub_subscribe(&publ->subscr, |
269 | msg_orignode(msg), | 268 | msg_orignode(msg), |
270 | publ, | 269 | publ, |
271 | (net_ev_handler)node_is_down); | 270 | (net_ev_handler) |
271 | named_purge_publ); | ||
272 | } | 272 | } |
273 | } else if (msg_type(msg) == WITHDRAWAL) { | 273 | } else if (msg_type(msg) == WITHDRAWAL) { |
274 | publ = tipc_nametbl_remove_publ(ntohl(item->type), | 274 | publ = tipc_nametbl_remove_publ(ntohl(item->type), |