/* Copy of sock_queue_rcv_skb (from sock.h) without bh_lock_sock() (its already held when this is called) which also allows data and other data to be queued to a socket.  */
static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig, struct sk_buff_head *queue)
/* Copy of sock_queue_rcv_skb (from sock.h) without bh_lock_sock() (its already held when this is called) which also allows data and other data to be queued to a socket.  */
static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig, struct sk_buff_head *queue)
{
	int err;
	int skb_len;
	if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
	    (unsigned)sk->sk_rcvbuf) {
		err = -ENOMEM;
		goto out;
	}
	err = sk_filter(sk, skb);
	if (err)
		goto out;
	skb_len = skb->len;
	skb_set_owner_r(skb, sk);
	skb_queue_tail(queue, skb);
	if (!sock_flag(sk, SOCK_DEAD))
		sk->sk_data_ready(sk, skb_len);
out:
	return err;
}