diff -ur alinux-2.6.31-gentoo-r6/net/core/datagram.c linux-2.6.31-gentoo-r6/net/core/datagram.c --- alinux-2.6.31-gentoo-r6/net/core/datagram.c 2009-09-10 00:13:59.000000000 +0200 +++ linux-2.6.31-gentoo-r6/net/core/datagram.c 2009-11-18 10:21:32.481524424 +0100 @@ -223,6 +223,15 @@ consume_skb(skb); sk_mem_reclaim_partial(sk); } +EXPORT_SYMBOL(skb_free_datagram); + +void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) +{ + lock_sock(sk); + skb_free_datagram(sk, skb); + release_sock(sk); +} +EXPORT_SYMBOL(skb_free_datagram_locked); /** * skb_kill_datagram - Free a datagram skbuff forcibly @@ -749,5 +758,4 @@ EXPORT_SYMBOL(datagram_poll); EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); EXPORT_SYMBOL(skb_copy_datagram_iovec); -EXPORT_SYMBOL(skb_free_datagram); EXPORT_SYMBOL(skb_recv_datagram); Tylko w linux-2.6.31-gentoo-r6/net/core: datagram.c.orig diff -ur alinux-2.6.31-gentoo-r6/net/ipv4/udp.c linux-2.6.31-gentoo-r6/net/ipv4/udp.c --- alinux-2.6.31-gentoo-r6/net/ipv4/udp.c 2009-09-10 00:13:59.000000000 +0200 +++ linux-2.6.31-gentoo-r6/net/ipv4/udp.c 2009-11-18 10:21:32.485524802 +0100 @@ -956,9 +956,7 @@ err = ulen; out_free: - lock_sock(sk); - skb_free_datagram(sk, skb); - release_sock(sk); + skb_free_datagram_locked(sk, skb); out: return err; Tylko w linux-2.6.31-gentoo-r6/net/ipv4: udp.c.orig diff -ur alinux-2.6.31-gentoo-r6/net/ipv6/udp.c linux-2.6.31-gentoo-r6/net/ipv6/udp.c --- alinux-2.6.31-gentoo-r6/net/ipv6/udp.c 2009-09-10 00:13:59.000000000 +0200 +++ linux-2.6.31-gentoo-r6/net/ipv6/udp.c 2009-11-18 10:21:32.485524802 +0100 @@ -288,9 +288,7 @@ err = ulen; out_free: - lock_sock(sk); - skb_free_datagram(sk, skb); - release_sock(sk); + skb_free_datagram_locked(sk, skb); out: return err; diff -ur alinux-2.6.31-gentoo-r6/net/sunrpc/svcsock.c linux-2.6.31-gentoo-r6/net/sunrpc/svcsock.c --- alinux-2.6.31-gentoo-r6/net/sunrpc/svcsock.c 2009-09-10 00:13:59.000000000 +0200 +++ linux-2.6.31-gentoo-r6/net/sunrpc/svcsock.c 2009-11-18 10:21:32.485524802 +0100 @@ -110,7 +110,7 @@ rqstp->rq_xprt_ctxt = NULL; dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); } } @@ -537,7 +537,7 @@ printk("rpcsvc: received unknown control message:" "%d/%d\n", cmh->cmsg_level, cmh->cmsg_type); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } svc_udp_get_dest_address(rqstp, cmh); @@ -548,18 +548,18 @@ if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { local_bh_enable(); /* checksum error */ - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } local_bh_enable(); - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); } else { /* we can use it in-place */ rqstp->rq_arg.head[0].iov_base = skb->data + sizeof(struct udphdr); rqstp->rq_arg.head[0].iov_len = len; if (skb_checksum_complete(skb)) { - skb_free_datagram(svsk->sk_sk, skb); + skb_free_datagram_locked(svsk->sk_sk, skb); return 0; } rqstp->rq_xprt_ctxt = skb;