patch-2.1.15 linux/net/core/datagram.c

Next file: linux/net/core/dev.c
Previous file: linux/net/core/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.14/linux/net/core/datagram.c linux/net/core/datagram.c
@@ -132,7 +132,7 @@
 		cli();
 		skb=skb_peek(&sk->receive_queue);
 		if(skb!=NULL)
-			skb->users++;
+			atomic_inc(&skb->users);
 		restore_flags(flags);
 		if(skb==NULL)		/* shouldn't happen but .. */
 			goto restart;
@@ -141,7 +141,6 @@
 	skb = skb_dequeue(&sk->receive_queue);
 	if (!skb)	/* Avoid race if someone beats us to the data */
 		goto restart;
-	skb->users++;
 	return skb;
 
 no_packet:
@@ -152,18 +151,7 @@
 
 void skb_free_datagram(struct sock * sk, struct sk_buff *skb)
 {
-	unsigned long flags;
-
-	save_flags(flags);
-	cli();
-	skb->users--;
-	if(skb->users <= 0) {
-		/* See if it needs destroying */
-		/* Been dequeued by someone - ie it's read */
-		if(!skb->next && !skb->prev)
-			kfree_skb(skb,FREE_READ);
-	}
-	restore_flags(flags);
+	kfree_skb(skb, FREE_READ);
 	release_sock(sk);
 }
 
@@ -204,8 +192,10 @@
  *	Now does seqpacket.
  */
 
-int datagram_select(struct sock *sk, int sel_type, select_table *wait)
+int datagram_select(struct socket *sock, int sel_type, select_table *wait)
 {
+	struct sock *sk = sock->sk;
+
 	if (sk->err)
 		return 1;
 	switch(sel_type)

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov