|
@@ -76,11 +76,13 @@ struct rds_sock *rds_find_bound(const struct in6_addr *addr, __be16 port,
|
|
|
struct rds_sock *rs;
|
|
|
|
|
|
__rds_create_bind_key(key, addr, port, scope_id);
|
|
|
- rs = rhashtable_lookup_fast(&bind_hash_table, key, ht_parms);
|
|
|
+ rcu_read_lock();
|
|
|
+ rs = rhashtable_lookup(&bind_hash_table, key, ht_parms);
|
|
|
if (rs && !sock_flag(rds_rs_to_sk(rs), SOCK_DEAD))
|
|
|
rds_sock_addref(rs);
|
|
|
else
|
|
|
rs = NULL;
|
|
|
+ rcu_read_unlock();
|
|
|
|
|
|
rdsdebug("returning rs %p for %pI6c:%u\n", rs, addr,
|
|
|
ntohs(port));
|
|
@@ -235,6 +237,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ sock_set_flag(sk, SOCK_RCU_FREE);
|
|
|
ret = rds_add_bound(rs, binding_addr, &port, scope_id);
|
|
|
if (ret)
|
|
|
goto out;
|