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

Next file: linux/net/core/dst.c
Previous file: linux/mm/vmscan.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.90/linux/net/core/datagram.c linux/net/core/datagram.c
@@ -132,15 +132,13 @@
 		unsigned long flags;
 		save_flags(flags);
 		cli();
-		skb=skb_peek(&sk->receive_queue);
+		skb = skb_peek(&sk->receive_queue);
 		if(skb!=NULL)
 			atomic_inc(&skb->users);
 		restore_flags(flags);
-		if(skb==NULL)		/* shouldn't happen but .. */
-			goto restart;
-		return skb;
-	}
-	skb = skb_dequeue(&sk->receive_queue);
+	} else
+		skb = skb_dequeue(&sk->receive_queue);
+
 	if (!skb)	/* Avoid race if someone beats us to the data */
 		goto restart;
 	return skb;
@@ -163,30 +161,23 @@
 
 int skb_copy_datagram(struct sk_buff *skb, int offset, char *to, int size)
 {
-	int err;
-	err = copy_to_user(to, skb->h.raw+offset, size);
-	if (err)
-	{
-		err = -EFAULT;
-	}
+	int err = -EFAULT;
+
+	if (!copy_to_user(to, skb->h.raw + offset, size))
+		err = 0;
 	return err;
 }
 
 
 /*
  *	Copy a datagram to an iovec.
+ *	Note: the iovec is modified during the copy.
  */
  
 int skb_copy_datagram_iovec(struct sk_buff *skb, int offset, struct iovec *to,
 			    int size)
 {
-	int err;
-	err = memcpy_toiovec(to, skb->h.raw+offset, size);
-	if (err)
-	{
-		err = -EFAULT;
-	}
-	return err;
+	return memcpy_toiovec(to, skb->h.raw + offset, size);
 }
 
 /*

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