Commit 40999f11 authored by Jon Maloy's avatar Jon Maloy Committed by David S. Miller

tipc: make link capability update thread safe

The commit referred to below introduced an update of the link
capabilities field that is not safe. Given the recently added
feature to remove idle node and link items after 5 minutes, there
is a small risk that the update will happen at the very moment the
targeted link is being removed. To avoid this we have to perform
the update inside the node item's write lock protection.

Fixes: 9012de50 ("tipc: add sequence number check for link STATE messages")
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f91a0eff
...@@ -370,13 +370,17 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr, ...@@ -370,13 +370,17 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,
spin_lock_bh(&tn->node_list_lock); spin_lock_bh(&tn->node_list_lock);
n = tipc_node_find(net, addr); n = tipc_node_find(net, addr);
if (n) { if (n) {
if (n->capabilities == capabilities)
goto exit;
/* Same node may come back with new capabilities */ /* Same node may come back with new capabilities */
write_lock_bh(&n->lock);
n->capabilities = capabilities; n->capabilities = capabilities;
for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) {
l = n->links[bearer_id].link; l = n->links[bearer_id].link;
if (l) if (l)
tipc_link_update_caps(l, capabilities); tipc_link_update_caps(l, capabilities);
} }
write_unlock_bh(&n->lock);
goto exit; goto exit;
} }
n = kzalloc(sizeof(*n), GFP_ATOMIC); n = kzalloc(sizeof(*n), GFP_ATOMIC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment