diff options
author | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-15 08:17:27 -0400 |
commit | aa2eaa8c272a3211dec07ce9c6c863a7e355c10e (patch) | |
tree | 8454a23d36b2ff36133c276ee0ba80eabc00850e /net/rds/bind.c | |
parent | a3d3c74da49c65fc63a937fa559186b0e16adca3 (diff) | |
parent | 1609d7604b847a9820e63393d1a3b6cac7286d40 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Minor overlapping changes in the btusb and ixgbe drivers.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds/bind.c')
-rw-r--r-- | net/rds/bind.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/net/rds/bind.c b/net/rds/bind.c index 6dbb763bc1fd..20c156a73e73 100644 --- a/net/rds/bind.c +++ b/net/rds/bind.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. | 2 | * Copyright (c) 2006, 2019 Oracle and/or its affiliates. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
@@ -239,34 +239,30 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
239 | goto out; | 239 | goto out; |
240 | } | 240 | } |
241 | 241 | ||
242 | sock_set_flag(sk, SOCK_RCU_FREE); | 242 | /* The transport can be set using SO_RDS_TRANSPORT option before the |
243 | ret = rds_add_bound(rs, binding_addr, &port, scope_id); | 243 | * socket is bound. |
244 | if (ret) | 244 | */ |
245 | goto out; | 245 | if (rs->rs_transport) { |
246 | |||
247 | if (rs->rs_transport) { /* previously bound */ | ||
248 | trans = rs->rs_transport; | 246 | trans = rs->rs_transport; |
249 | if (trans->laddr_check(sock_net(sock->sk), | 247 | if (trans->laddr_check(sock_net(sock->sk), |
250 | binding_addr, scope_id) != 0) { | 248 | binding_addr, scope_id) != 0) { |
251 | ret = -ENOPROTOOPT; | 249 | ret = -ENOPROTOOPT; |
252 | rds_remove_bound(rs); | 250 | goto out; |
253 | } else { | ||
254 | ret = 0; | ||
255 | } | 251 | } |
256 | goto out; | 252 | } else { |
257 | } | 253 | trans = rds_trans_get_preferred(sock_net(sock->sk), |
258 | trans = rds_trans_get_preferred(sock_net(sock->sk), binding_addr, | 254 | binding_addr, scope_id); |
259 | scope_id); | 255 | if (!trans) { |
260 | if (!trans) { | 256 | ret = -EADDRNOTAVAIL; |
261 | ret = -EADDRNOTAVAIL; | 257 | pr_info_ratelimited("RDS: %s could not find a transport for %pI6c, load rds_tcp or rds_rdma?\n", |
262 | rds_remove_bound(rs); | 258 | __func__, binding_addr); |
263 | pr_info_ratelimited("RDS: %s could not find a transport for %pI6c, load rds_tcp or rds_rdma?\n", | 259 | goto out; |
264 | __func__, binding_addr); | 260 | } |
265 | goto out; | 261 | rs->rs_transport = trans; |
266 | } | 262 | } |
267 | 263 | ||
268 | rs->rs_transport = trans; | 264 | sock_set_flag(sk, SOCK_RCU_FREE); |
269 | ret = 0; | 265 | ret = rds_add_bound(rs, binding_addr, &port, scope_id); |
270 | 266 | ||
271 | out: | 267 | out: |
272 | release_sock(sk); | 268 | release_sock(sk); |