|
@@ -850,17 +850,26 @@ void tipc_group_member_evt(struct tipc_group *grp,
|
|
|
*usr_wakeup = true;
|
|
|
m->usr_pending = false;
|
|
|
node_up = tipc_node_is_up(net, node);
|
|
|
-
|
|
|
- /* Hold back event if more messages might be expected */
|
|
|
- if (m->state != MBR_LEAVING && node_up) {
|
|
|
- m->event_msg = skb;
|
|
|
- tipc_group_decr_active(grp, m);
|
|
|
- m->state = MBR_LEAVING;
|
|
|
- } else {
|
|
|
- if (node_up)
|
|
|
+ m->event_msg = NULL;
|
|
|
+
|
|
|
+ if (node_up) {
|
|
|
+ /* Hold back event if a LEAVE msg should be expected */
|
|
|
+ if (m->state != MBR_LEAVING) {
|
|
|
+ m->event_msg = skb;
|
|
|
+ tipc_group_decr_active(grp, m);
|
|
|
+ m->state = MBR_LEAVING;
|
|
|
+ } else {
|
|
|
msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
|
|
|
- else
|
|
|
+ __skb_queue_tail(inputq, skb);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (m->state != MBR_LEAVING) {
|
|
|
+ tipc_group_decr_active(grp, m);
|
|
|
+ m->state = MBR_LEAVING;
|
|
|
msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt);
|
|
|
+ } else {
|
|
|
+ msg_set_grp_bc_seqno(hdr, m->bc_syncpt);
|
|
|
+ }
|
|
|
__skb_queue_tail(inputq, skb);
|
|
|
}
|
|
|
list_del_init(&m->list);
|