Revert "tcp: avoid the lookup process failing to get sk in ehash table"
[platform/kernel/linux-rpi.git] / net / ipv4 / inet_hashtables.c
index e41fdc3..0819d60 100644 (file)
@@ -650,20 +650,8 @@ bool inet_ehash_insert(struct sock *sk, struct sock *osk, bool *found_dup_sk)
        spin_lock(lock);
        if (osk) {
                WARN_ON_ONCE(sk->sk_hash != osk->sk_hash);
-               ret = sk_hashed(osk);
-               if (ret) {
-                       /* Before deleting the node, we insert a new one to make
-                        * sure that the look-up-sk process would not miss either
-                        * of them and that at least one node would exist in ehash
-                        * table all the time. Otherwise there's a tiny chance
-                        * that lookup process could find nothing in ehash table.
-                        */
-                       __sk_nulls_add_node_tail_rcu(sk, list);
-                       sk_nulls_del_node_init_rcu(osk);
-               }
-               goto unlock;
-       }
-       if (found_dup_sk) {
+               ret = sk_nulls_del_node_init_rcu(osk);
+       } else if (found_dup_sk) {
                *found_dup_sk = inet_ehash_lookup_by_sk(sk, list);
                if (*found_dup_sk)
                        ret = false;
@@ -672,7 +660,6 @@ bool inet_ehash_insert(struct sock *sk, struct sock *osk, bool *found_dup_sk)
        if (ret)
                __sk_nulls_add_node_rcu(sk, list);
 
-unlock:
        spin_unlock(lock);
 
        return ret;
@@ -826,15 +813,19 @@ bool inet_bind2_bucket_match_addr_any(const struct inet_bind2_bucket *tb, const
                                      unsigned short port, int l3mdev, const struct sock *sk)
 {
 #if IS_ENABLED(CONFIG_IPV6)
-       struct in6_addr addr_any = {};
+       if (sk->sk_family != tb->family) {
+               if (sk->sk_family == AF_INET)
+                       return net_eq(ib2_net(tb), net) && tb->port == port &&
+                               tb->l3mdev == l3mdev &&
+                               ipv6_addr_any(&tb->v6_rcv_saddr);
 
-       if (sk->sk_family != tb->family)
                return false;
+       }
 
        if (sk->sk_family == AF_INET6)
                return net_eq(ib2_net(tb), net) && tb->port == port &&
                        tb->l3mdev == l3mdev &&
-                       ipv6_addr_equal(&tb->v6_rcv_saddr, &addr_any);
+                       ipv6_addr_any(&tb->v6_rcv_saddr);
        else
 #endif
                return net_eq(ib2_net(tb), net) && tb->port == port &&
@@ -860,11 +851,10 @@ inet_bhash2_addr_any_hashbucket(const struct sock *sk, const struct net *net, in
 {
        struct inet_hashinfo *hinfo = tcp_or_dccp_get_hashinfo(sk);
        u32 hash;
-#if IS_ENABLED(CONFIG_IPV6)
-       struct in6_addr addr_any = {};
 
+#if IS_ENABLED(CONFIG_IPV6)
        if (sk->sk_family == AF_INET6)
-               hash = ipv6_portaddr_hash(net, &addr_any, port);
+               hash = ipv6_portaddr_hash(net, &in6addr_any, port);
        else
 #endif
                hash = ipv4_portaddr_hash(net, 0, port);