-void inet_sock_release(struct sock *sk)
-{
- if (sk->sk_prot->destroy)
- sk->sk_prot->destroy(sk);
-
- /* Observation: when inet_sock_release is called, processes have
- * no access to socket. But net still has.
- * Step one, detach it from networking:
- *
- * A. Remove from hash tables.
- */
-
- sk->sk_prot->unhash(sk);
-
- /* In this point socket cannot receive new packets,
- * but it is possible that some packets are in flight
- * because some CPU runs receiver and did hash table lookup
- * before we unhashed socket. They will achieve receive queue
- * and will be purged by socket destructor.
- *
- * Also we still have packets pending on receive
- * queue and probably, our own packets waiting in device queues.
- * sock_destroy will drain receive queue, but transmitted
- * packets will delay socket destruction until the last reference
- * will be released.
- */
-
- sock_orphan(sk);
-
- xfrm_sk_free_policy(sk);
-
-#ifdef INET_REFCNT_DEBUG
- if (atomic_read(&sk->sk_refcnt) != 1)
- printk(KERN_DEBUG "Destruction inet %p delayed, c=%d\n",
- sk, atomic_read(&sk->sk_refcnt));
-#endif
- sock_put(sk);
-}
-
-