|
@@ -2416,16 +2416,10 @@ adjudge_to_death:
|
|
sock_hold(sk);
|
|
sock_hold(sk);
|
|
sock_orphan(sk);
|
|
sock_orphan(sk);
|
|
|
|
|
|
- /* It is the last release_sock in its life. It will remove backlog. */
|
|
|
|
- release_sock(sk);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /* Now socket is owned by kernel and we acquire BH lock
|
|
|
|
- * to finish close. No need to check for user refs.
|
|
|
|
- */
|
|
|
|
local_bh_disable();
|
|
local_bh_disable();
|
|
bh_lock_sock(sk);
|
|
bh_lock_sock(sk);
|
|
- WARN_ON(sock_owned_by_user(sk));
|
|
|
|
|
|
+ /* remove backlog if any, without releasing ownership. */
|
|
|
|
+ __release_sock(sk);
|
|
|
|
|
|
percpu_counter_inc(sk->sk_prot->orphan_count);
|
|
percpu_counter_inc(sk->sk_prot->orphan_count);
|
|
|
|
|
|
@@ -2494,6 +2488,7 @@ adjudge_to_death:
|
|
out:
|
|
out:
|
|
bh_unlock_sock(sk);
|
|
bh_unlock_sock(sk);
|
|
local_bh_enable();
|
|
local_bh_enable();
|
|
|
|
+ release_sock(sk);
|
|
sock_put(sk);
|
|
sock_put(sk);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(tcp_close);
|
|
EXPORT_SYMBOL(tcp_close);
|