diff options
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r-- | net/tipc/node.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 2d106ef4fa4c..27b4bb0cca6c 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -112,6 +112,7 @@ struct tipc_node *tipc_node_create(u32 addr) | |||
112 | break; | 112 | break; |
113 | } | 113 | } |
114 | list_add_tail(&n_ptr->list, &temp_node->list); | 114 | list_add_tail(&n_ptr->list, &temp_node->list); |
115 | n_ptr->block_setup = WAIT_PEER_DOWN; | ||
115 | 116 | ||
116 | tipc_num_nodes++; | 117 | tipc_num_nodes++; |
117 | 118 | ||
@@ -312,7 +313,7 @@ static void node_established_contact(struct tipc_node *n_ptr) | |||
312 | } | 313 | } |
313 | } | 314 | } |
314 | 315 | ||
315 | static void node_cleanup_finished(unsigned long node_addr) | 316 | static void node_name_purge_complete(unsigned long node_addr) |
316 | { | 317 | { |
317 | struct tipc_node *n_ptr; | 318 | struct tipc_node *n_ptr; |
318 | 319 | ||
@@ -320,7 +321,7 @@ static void node_cleanup_finished(unsigned long node_addr) | |||
320 | n_ptr = tipc_node_find(node_addr); | 321 | n_ptr = tipc_node_find(node_addr); |
321 | if (n_ptr) { | 322 | if (n_ptr) { |
322 | tipc_node_lock(n_ptr); | 323 | tipc_node_lock(n_ptr); |
323 | n_ptr->cleanup_required = 0; | 324 | n_ptr->block_setup &= ~WAIT_NAMES_GONE; |
324 | tipc_node_unlock(n_ptr); | 325 | tipc_node_unlock(n_ptr); |
325 | } | 326 | } |
326 | read_unlock_bh(&tipc_net_lock); | 327 | read_unlock_bh(&tipc_net_lock); |
@@ -331,28 +332,32 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
331 | char addr_string[16]; | 332 | char addr_string[16]; |
332 | u32 i; | 333 | u32 i; |
333 | 334 | ||
334 | /* Clean up broadcast reception remains */ | 335 | info("Lost contact with %s\n", |
335 | n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0; | 336 | tipc_addr_string_fill(addr_string, n_ptr->addr)); |
336 | while (n_ptr->bclink.deferred_head) { | 337 | |
337 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | 338 | /* Flush broadcast link info associated with lost node */ |
338 | n_ptr->bclink.deferred_head = buf->next; | ||
339 | buf_discard(buf); | ||
340 | } | ||
341 | if (n_ptr->bclink.defragm) { | ||
342 | buf_discard(n_ptr->bclink.defragm); | ||
343 | n_ptr->bclink.defragm = NULL; | ||
344 | } | ||
345 | 339 | ||
346 | if (n_ptr->bclink.supported) { | 340 | if (n_ptr->bclink.supported) { |
341 | n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0; | ||
342 | while (n_ptr->bclink.deferred_head) { | ||
343 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | ||
344 | n_ptr->bclink.deferred_head = buf->next; | ||
345 | buf_discard(buf); | ||
346 | } | ||
347 | |||
348 | if (n_ptr->bclink.defragm) { | ||
349 | buf_discard(n_ptr->bclink.defragm); | ||
350 | n_ptr->bclink.defragm = NULL; | ||
351 | } | ||
352 | |||
353 | tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr); | ||
347 | tipc_bclink_acknowledge(n_ptr, | 354 | tipc_bclink_acknowledge(n_ptr, |
348 | mod(n_ptr->bclink.acked + 10000)); | 355 | mod(n_ptr->bclink.acked + 10000)); |
349 | tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr); | ||
350 | if (n_ptr->addr < tipc_own_addr) | 356 | if (n_ptr->addr < tipc_own_addr) |
351 | tipc_own_tag--; | 357 | tipc_own_tag--; |
352 | } | ||
353 | 358 | ||
354 | info("Lost contact with %s\n", | 359 | n_ptr->bclink.supported = 0; |
355 | tipc_addr_string_fill(addr_string, n_ptr->addr)); | 360 | } |
356 | 361 | ||
357 | /* Abort link changeover */ | 362 | /* Abort link changeover */ |
358 | for (i = 0; i < MAX_BEARERS; i++) { | 363 | for (i = 0; i < MAX_BEARERS; i++) { |
@@ -367,10 +372,10 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
367 | /* Notify subscribers */ | 372 | /* Notify subscribers */ |
368 | tipc_nodesub_notify(n_ptr); | 373 | tipc_nodesub_notify(n_ptr); |
369 | 374 | ||
370 | /* Prevent re-contact with node until all cleanup is done */ | 375 | /* Prevent re-contact with node until cleanup is done */ |
371 | 376 | ||
372 | n_ptr->cleanup_required = 1; | 377 | n_ptr->block_setup = WAIT_PEER_DOWN | WAIT_NAMES_GONE; |
373 | tipc_k_signal((Handler)node_cleanup_finished, n_ptr->addr); | 378 | tipc_k_signal((Handler)node_name_purge_complete, n_ptr->addr); |
374 | } | 379 | } |
375 | 380 | ||
376 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) | 381 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) |