From 4c67d3b106e7ac16c002e2875a58994337b19489 Mon Sep 17 00:00:00 2001 From: "smh22@tempest.cl.cam.ac.uk" Date: Mon, 30 May 2005 23:42:11 +0000 Subject: bitkeeper revision 1.1159.258.156 (429ba4d3T2WmSlhY2aTmV6KN88hZHw) Solve badness problem when udp_poll() receives fragmented skbuff w/ CONFIG_HIGHMEM Upstream patch (now in -net tree) from Herbert Xu. Signed-off-by: Herbert Xu Signed-off-by: Steven Hand --- patches/linux-2.6.11/udp-frag.patch | 55 +++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 patches/linux-2.6.11/udp-frag.patch (limited to 'patches') diff --git a/patches/linux-2.6.11/udp-frag.patch b/patches/linux-2.6.11/udp-frag.patch new file mode 100644 index 0000000000..9e8a26eb20 --- /dev/null +++ b/patches/linux-2.6.11/udp-frag.patch @@ -0,0 +1,55 @@ +diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -738,7 +738,7 @@ int udp_ioctl(struct sock *sk, int cmd, + unsigned long amount; + + amount = 0; +- spin_lock_irq(&sk->sk_receive_queue.lock); ++ spin_lock_bh(&sk->sk_receive_queue.lock); + skb = skb_peek(&sk->sk_receive_queue); + if (skb != NULL) { + /* +@@ -748,7 +748,7 @@ int udp_ioctl(struct sock *sk, int cmd, + */ + amount = skb->len - sizeof(struct udphdr); + } +- spin_unlock_irq(&sk->sk_receive_queue.lock); ++ spin_unlock_bh(&sk->sk_receive_queue.lock); + return put_user(amount, (int __user *)arg); + } + +@@ -848,12 +848,12 @@ csum_copy_err: + /* Clear queue. */ + if (flags&MSG_PEEK) { + int clear = 0; +- spin_lock_irq(&sk->sk_receive_queue.lock); ++ spin_lock_bh(&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); ++ spin_unlock_bh(&sk->sk_receive_queue.lock); + if (clear) + kfree_skb(skb); + } +@@ -1334,7 +1334,7 @@ unsigned int udp_poll(struct file *file, + struct sk_buff_head *rcvq = &sk->sk_receive_queue; + struct sk_buff *skb; + +- spin_lock_irq(&rcvq->lock); ++ spin_lock_bh(&rcvq->lock); + while ((skb = skb_peek(rcvq)) != NULL) { + if (udp_checksum_complete(skb)) { + UDP_INC_STATS_BH(UDP_MIB_INERRORS); +@@ -1345,7 +1345,7 @@ unsigned int udp_poll(struct file *file, + break; + } + } +- spin_unlock_irq(&rcvq->lock); ++ spin_unlock_bh(&rcvq->lock); + + /* nothing to see, move along */ + if (skb == NULL) + -- cgit v1.2.3