spin_lock_irq(&sk->sk_receive_queue.lock); 
spin_lock_bh(&sk->sk_receive_queue.lock); 
static int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, 		  struct msghdr *msg, size_t len,		  int noblock, int flags, int *addr_len){	struct ipv6_pinfo *np = inet6_sk(sk);	struct inet_sock *inet = inet_sk(sk);  	struct sk_buff *skb;	size_t copied;  	int err;  	if (addr_len)  		*addr_len=sizeof(struct sockaddr_in6);  	if (flags & MSG_ERRQUEUE)		return ipv6_recv_error(sk, msg, len);try_again:	skb = skb_recv_datagram(sk, flags, noblock, &err);	if (!skb)		goto out; 	copied = skb->len - sizeof(struct udphdr);  	if (copied > len) {  		copied = len;  		msg->msg_flags |= MSG_TRUNC;  	}	if (skb->ip_summed==CHECKSUM_UNNECESSARY) {		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,					      copied);	} else if (msg->msg_flags&MSG_TRUNC) {		if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum)))			goto csum_copy_err;		err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,					      copied);	} else {		err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov);		if (err == -EINVAL)			goto csum_copy_err;	}	if (err)		goto out_free;	sock_recv_timestamp(msg, sk, skb);	/* Copy the address. */	if (msg->msg_name) {		struct sockaddr_in6 *sin6;	  		sin6 = (struct sockaddr_in6 *) msg->msg_name;		sin6->sin6_family = AF_INET6;		sin6->sin6_port = skb->h.uh->source;		sin6->sin6_flowinfo = 0;		sin6->sin6_scope_id = 0;		if (skb->protocol == htons(ETH_P_IP))			ipv6_addr_set(&sin6->sin6_addr, 0, 0,				      htonl(0xffff), skb->nh.iph->saddr);		else {			ipv6_addr_copy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr);			if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)				sin6->sin6_scope_id = IP6CB(skb)->iif;		}	}	if (skb->protocol == htons(ETH_P_IP)) {		if (inet->cmsg_flags)			ip_cmsg_recv(msg, skb);	} else {		if (np->rxopt.all)			datagram_recv_ctl(sk, msg, skb);  	}	err = copied;	if (flags & MSG_TRUNC)		err = skb->len - sizeof(struct udphdr);out_free:	skb_free_datagram(sk, skb);out:	return err;csum_copy_err:	/* Clear queue. */	if (flags&MSG_PEEK) {		int clear = 0;		spin_lock_irq(&sk->sk_receive_queue.lock);		if (skb == skb_peek(&sk->sk_receive_queue)) {			__skb_unlink(skb, &sk->sk_receive_queue);			clear = 1;		}		spin_unlock_irq(&sk->sk_receive_queue.lock);		if (clear)			kfree_skb(skb);	}	skb_free_datagram(sk, skb);	if (flags & MSG_DONTWAIT) {		UDP6_INC_STATS_USER(UDP_MIB_INERRORS);		return -EAGAIN;	}	goto try_again;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/e0f9f8586a0b21fb3c7a4ead3804008d57dfdef7/udp.c/clean/net/ipv6/udp.c