tipc: use bc_lock to protect node map in bearer structure
The node map variable - 'nodes' in bearer structure is only used by bclink. When bclink accesses it, bc_lock is held. But when change it, for instance, in tipc_bearer_add_dest() or tipc_bearer_remove_dest() the bc_lock is not taken at all. To avoid any inconsistent data, we should always grab bc_lock while accessing node map variable. Signed-off-by: Ying Xue <ying.xue@windriver.com> Reviewed-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Tested-by: Erik Hugne <erik.hugne@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
4ae88c94d3
commit
28dd94187a
@@ -220,8 +220,7 @@ void tipc_bearer_add_dest(u32 bearer_id, u32 dest)
|
||||
rcu_read_lock();
|
||||
b_ptr = rcu_dereference_rtnl(bearer_list[bearer_id]);
|
||||
if (b_ptr) {
|
||||
tipc_nmap_add(&b_ptr->nodes, dest);
|
||||
tipc_bcbearer_sort();
|
||||
tipc_bcbearer_sort(&b_ptr->nodes, dest, true);
|
||||
tipc_disc_add_dest(b_ptr->link_req);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
@@ -234,8 +233,7 @@ void tipc_bearer_remove_dest(u32 bearer_id, u32 dest)
|
||||
rcu_read_lock();
|
||||
b_ptr = rcu_dereference_rtnl(bearer_list[bearer_id]);
|
||||
if (b_ptr) {
|
||||
tipc_nmap_remove(&b_ptr->nodes, dest);
|
||||
tipc_bcbearer_sort();
|
||||
tipc_bcbearer_sort(&b_ptr->nodes, dest, false);
|
||||
tipc_disc_remove_dest(b_ptr->link_req);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
Reference in New Issue
Block a user