Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 293378 | Differences between
and this patch

Collapse All | Expand All

(-)a/include/linux/skbuff.h (+2 lines)
Lines 1757-1762 extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, Link Here
1757
						     int to_offset,
1757
						     int to_offset,
1758
						     int size);
1758
						     int size);
1759
extern void	       skb_free_datagram(struct sock *sk, struct sk_buff *skb);
1759
extern void	       skb_free_datagram(struct sock *sk, struct sk_buff *skb);
1760
extern void	       skb_free_datagram_locked(struct sock *sk,
1761
						struct sk_buff *skb);
1760
extern int	       skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
1762
extern int	       skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
1761
					 unsigned int flags);
1763
					 unsigned int flags);
1762
extern __wsum	       skb_checksum(const struct sk_buff *skb, int offset,
1764
extern __wsum	       skb_checksum(const struct sk_buff *skb, int offset,
(-)a/net/core/datagram.c (-1 / +9 lines)
Lines 224-229 void skb_free_datagram(struct sock *sk, struct sk_buff *skb) Link Here
224
	consume_skb(skb);
224
	consume_skb(skb);
225
	sk_mem_reclaim_partial(sk);
225
	sk_mem_reclaim_partial(sk);
226
}
226
}
227
EXPORT_SYMBOL(skb_free_datagram);
228
229
void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
230
{
231
	lock_sock(sk);
232
	skb_free_datagram(sk, skb);
233
	release_sock(sk);
234
}
235
EXPORT_SYMBOL(skb_free_datagram_locked);
227
236
228
/**
237
/**
229
 *	skb_kill_datagram - Free a datagram skbuff forcibly
238
 *	skb_kill_datagram - Free a datagram skbuff forcibly
Lines 752-756 unsigned int datagram_poll(struct file *file, struct socket *sock, Link Here
752
EXPORT_SYMBOL(datagram_poll);
761
EXPORT_SYMBOL(datagram_poll);
753
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
762
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
754
EXPORT_SYMBOL(skb_copy_datagram_iovec);
763
EXPORT_SYMBOL(skb_copy_datagram_iovec);
755
EXPORT_SYMBOL(skb_free_datagram);
756
EXPORT_SYMBOL(skb_recv_datagram);
764
EXPORT_SYMBOL(skb_recv_datagram);
(-)a/net/ipv4/udp.c (-3 / +1 lines)
Lines 999-1007 try_again: Link Here
999
		err = ulen;
999
		err = ulen;
1000
1000
1001
out_free:
1001
out_free:
1002
	lock_sock(sk);
1002
	skb_free_datagram_locked(sk, skb);
1003
	skb_free_datagram(sk, skb);
1004
	release_sock(sk);
1005
out:
1003
out:
1006
	return err;
1004
	return err;
1007
1005
(-)a/net/ipv6/udp.c (-3 / +1 lines)
Lines 288-296 try_again: Link Here
288
		err = ulen;
288
		err = ulen;
289
289
290
out_free:
290
out_free:
291
	lock_sock(sk);
291
	skb_free_datagram_locked(sk, skb);
292
	skb_free_datagram(sk, skb);
293
	release_sock(sk);
294
out:
292
out:
295
	return err;
293
	return err;
296
294
(-)a/net/sunrpc/svcsock.c (-5 / +5 lines)
Lines 110-116 static void svc_release_skb(struct svc_r Link Here
110
		rqstp->rq_xprt_ctxt = NULL;
110
		rqstp->rq_xprt_ctxt = NULL;
111
111
112
		dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
112
		dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
113
		skb_free_datagram(svsk->sk_sk, skb);
113
		skb_free_datagram_locked(svsk->sk_sk, skb);
114
	}
114
	}
115
}
115
}
116
116
Lines 537-543 static int svc_udp_recvfrom(struct svc_r Link Here
537
			printk("rpcsvc: received unknown control message:"
537
			printk("rpcsvc: received unknown control message:"
538
			       "%d/%d\n",
538
			       "%d/%d\n",
539
			       cmh->cmsg_level, cmh->cmsg_type);
539
			       cmh->cmsg_level, cmh->cmsg_type);
540
		skb_free_datagram(svsk->sk_sk, skb);
540
		skb_free_datagram_locked(svsk->sk_sk, skb);
541
		return 0;
541
		return 0;
542
	}
542
	}
543
	svc_udp_get_dest_address(rqstp, cmh);
543
	svc_udp_get_dest_address(rqstp, cmh);
Lines 548-565 static int svc_udp_recvfrom(struct svc_r Link Here
548
		if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
548
		if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
549
			local_bh_enable();
549
			local_bh_enable();
550
			/* checksum error */
550
			/* checksum error */
551
			skb_free_datagram(svsk->sk_sk, skb);
551
			skb_free_datagram_locked(svsk->sk_sk, skb);
552
			return 0;
552
			return 0;
553
		}
553
		}
554
		local_bh_enable();
554
		local_bh_enable();
555
		skb_free_datagram(svsk->sk_sk, skb);
555
		skb_free_datagram_locked(svsk->sk_sk, skb);
556
	} else {
556
	} else {
557
		/* we can use it in-place */
557
		/* we can use it in-place */
558
		rqstp->rq_arg.head[0].iov_base = skb->data +
558
		rqstp->rq_arg.head[0].iov_base = skb->data +
559
			sizeof(struct udphdr);
559
			sizeof(struct udphdr);
560
		rqstp->rq_arg.head[0].iov_len = len;
560
		rqstp->rq_arg.head[0].iov_len = len;
561
		if (skb_checksum_complete(skb)) {
561
		if (skb_checksum_complete(skb)) {
562
			skb_free_datagram(svsk->sk_sk, skb);
562
			skb_free_datagram_locked(svsk->sk_sk, skb);
563
			return 0;
563
			return 0;
564
		}
564
		}
565
		rqstp->rq_xprt_ctxt = skb;
565
		rqstp->rq_xprt_ctxt = skb;

Return to bug 293378