diff options
Diffstat (limited to 'net/ipv4/inet_hashtables.c')
| -rw-r--r-- | net/ipv4/inet_hashtables.c | 17 | 
1 files changed, 2 insertions, 15 deletions
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index e7391bf310a7..0819d6001b9a 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c @@ -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;  |