diff options
Diffstat (limited to 'net/rds/bind.c')
-rw-r--r-- | net/rds/bind.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/rds/bind.c b/net/rds/bind.c index 3ab55784b637..762d2c6788a3 100644 --- a/net/rds/bind.c +++ b/net/rds/bind.c | |||
@@ -76,11 +76,13 @@ struct rds_sock *rds_find_bound(const struct in6_addr *addr, __be16 port, | |||
76 | struct rds_sock *rs; | 76 | struct rds_sock *rs; |
77 | 77 | ||
78 | __rds_create_bind_key(key, addr, port, scope_id); | 78 | __rds_create_bind_key(key, addr, port, scope_id); |
79 | rs = rhashtable_lookup_fast(&bind_hash_table, key, ht_parms); | 79 | rcu_read_lock(); |
80 | rs = rhashtable_lookup(&bind_hash_table, key, ht_parms); | ||
80 | if (rs && !sock_flag(rds_rs_to_sk(rs), SOCK_DEAD)) | 81 | if (rs && !sock_flag(rds_rs_to_sk(rs), SOCK_DEAD)) |
81 | rds_sock_addref(rs); | 82 | rds_sock_addref(rs); |
82 | else | 83 | else |
83 | rs = NULL; | 84 | rs = NULL; |
85 | rcu_read_unlock(); | ||
84 | 86 | ||
85 | rdsdebug("returning rs %p for %pI6c:%u\n", rs, addr, | 87 | rdsdebug("returning rs %p for %pI6c:%u\n", rs, addr, |
86 | ntohs(port)); | 88 | ntohs(port)); |
@@ -235,6 +237,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
235 | goto out; | 237 | goto out; |
236 | } | 238 | } |
237 | 239 | ||
240 | sock_set_flag(sk, SOCK_RCU_FREE); | ||
238 | ret = rds_add_bound(rs, binding_addr, &port, scope_id); | 241 | ret = rds_add_bound(rs, binding_addr, &port, scope_id); |
239 | if (ret) | 242 | if (ret) |
240 | goto out; | 243 | goto out; |