tipc: eliminate race during node creation
authorJon Paul Maloy <jon.maloy@ericsson.com>
Tue, 3 Feb 2015 13:59:19 +0000 (08:59 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Feb 2015 00:09:31 +0000 (16:09 -0800)
commitb45db71b525d75e520d7ef46c796f49c5d26c07c
treee19c1c7f6bc27d63e28a1315b7b19ce1d099e02d
parent7d24dcdb3f3132e0ec36f19c49bd004bc874b8aa
tipc: eliminate race during node creation

Instances of struct node are created in the function tipc_disc_rcv()
under the assumption that there is no race between received discovery
messages arriving from the same node. This assumption is wrong.
When we use more than one bearer, it is possible that discovery
messages from the same node arrive at the same moment, resulting in
creation of two instances of struct tipc_node. This may later cause
confusion during link establishment, and may result in one of the links
never becoming activated.

We fix this by making lookup and potential creation of nodes atomic.
Instead of first looking up the node, and in case of failure, create it,
we now start with looking up the node inside node_link_create(), and
return a reference to that one if found. Otherwise, we go ahead and
create the node as we did before.

Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/discover.c
net/tipc/node.c