mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 04:47:05 +00:00
tcp: Rearrange tests in inet_csk_bind_conflict().
The following patch adds code in the !inet_use_bhash2_on_bind(sk) case in inet_csk_bind_conflict(). To avoid adding nest and make the change cleaner, this patch rearranges tests in inet_csk_bind_conflict(). Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
822fb91fc7
commit
58655bc0ad
1 changed files with 21 additions and 23 deletions
|
@ -242,9 +242,10 @@ static int inet_csk_bind_conflict(const struct sock *sk,
|
|||
const struct inet_bind2_bucket *tb2, /* may be null */
|
||||
bool relax, bool reuseport_ok)
|
||||
{
|
||||
bool reuseport_cb_ok;
|
||||
struct sock_reuseport *reuseport_cb;
|
||||
kuid_t uid = sock_i_uid((struct sock *)sk);
|
||||
struct sock_reuseport *reuseport_cb;
|
||||
bool reuseport_cb_ok;
|
||||
struct sock *sk2;
|
||||
|
||||
rcu_read_lock();
|
||||
reuseport_cb = rcu_dereference(sk->sk_reuseport_cb);
|
||||
|
@ -252,32 +253,29 @@ static int inet_csk_bind_conflict(const struct sock *sk,
|
|||
reuseport_cb_ok = !reuseport_cb || READ_ONCE(reuseport_cb->num_closed_socks);
|
||||
rcu_read_unlock();
|
||||
|
||||
/*
|
||||
* Unlike other sk lookup places we do not check
|
||||
* for sk_net here, since _all_ the socks listed
|
||||
* in tb->owners and tb2->owners list belong
|
||||
* to the same net - the one this bucket belongs to.
|
||||
*/
|
||||
|
||||
if (!inet_use_bhash2_on_bind(sk)) {
|
||||
struct sock *sk2;
|
||||
|
||||
sk_for_each_bound(sk2, &tb->owners)
|
||||
if (inet_bind_conflict(sk, sk2, uid, relax,
|
||||
reuseport_cb_ok, reuseport_ok) &&
|
||||
inet_rcv_saddr_equal(sk, sk2, true))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Conflicts with an existing IPV6_ADDR_ANY (if ipv6) or INADDR_ANY (if
|
||||
* ipv4) should have been checked already. We need to do these two
|
||||
* checks separately because their spinlocks have to be acquired/released
|
||||
* independently of each other, to prevent possible deadlocks
|
||||
*/
|
||||
return tb2 && inet_bhash2_conflict(sk, tb2, uid, relax, reuseport_cb_ok,
|
||||
reuseport_ok);
|
||||
if (inet_use_bhash2_on_bind(sk))
|
||||
return tb2 && inet_bhash2_conflict(sk, tb2, uid, relax,
|
||||
reuseport_cb_ok, reuseport_ok);
|
||||
|
||||
/* Unlike other sk lookup places we do not check
|
||||
* for sk_net here, since _all_ the socks listed
|
||||
* in tb->owners and tb2->owners list belong
|
||||
* to the same net - the one this bucket belongs to.
|
||||
*/
|
||||
sk_for_each_bound(sk2, &tb->owners) {
|
||||
if (!inet_bind_conflict(sk, sk2, uid, relax, reuseport_cb_ok, reuseport_ok))
|
||||
continue;
|
||||
|
||||
if (inet_rcv_saddr_equal(sk, sk2, true))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Determine if there is a bind conflict with an existing IPV6_ADDR_ANY (if ipv6) or
|
||||
|
|
Loading…
Reference in a new issue