tipc: fix a link reset issue due to retransmission failures
authorYing Xue <[email protected]>
Wed, 25 Mar 2015 10:09:40 +0000 (18:09 +0800)
committerDavid S. Miller <[email protected]>
Wed, 25 Mar 2015 15:43:32 +0000 (11:43 -0400)
When a node joins a cluster while we are transmitting a fragment
stream over the broadcast link, it's missing the preceding fragments
needed to build a meaningful message. As a result, the node has to
drop it. However, as the fragment message is not acknowledged to
its sender before it's dropped, it accidentally causes link reset
of retransmission failure on the node.

Reported-by: Erik Hugne <[email protected]>
Signed-off-by: Ying Xue <[email protected]>
Reviewed-by: Erik Hugne <[email protected]>
Tested-by: Erik Hugne <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
net/tipc/bcast.c

index 5aff0844d4d361efc45fb017ca501b7072caa464..52307397e0b1ebcc2be3ebb883c3d9f760f55daf 100644 (file)
@@ -523,11 +523,13 @@ receive:
                        tipc_bclink_unlock(net);
                        tipc_node_unlock(node);
                } else if (msg_user(msg) == MSG_FRAGMENTER) {
-                       tipc_buf_append(&node->bclink.reasm_buf, &buf);
-                       if (unlikely(!buf && !node->bclink.reasm_buf))
-                               goto unlock;
                        tipc_bclink_lock(net);
                        bclink_accept_pkt(node, seqno);
+                       tipc_buf_append(&node->bclink.reasm_buf, &buf);
+                       if (unlikely(!buf && !node->bclink.reasm_buf)) {
+                               tipc_bclink_unlock(net);
+                               goto unlock;
+                       }
                        bcl->stats.recv_fragments++;
                        if (buf) {
                                bcl->stats.recv_fragmented++;