]> git.hungrycats.org Git - linux/commitdiff
[IPV4]: Do not BUG() on icmp_xmit_lock() contention, just drop.
authorDavid S. Miller <davem@nuts.ninka.net>
Tue, 2 Sep 2003 07:34:26 +0000 (00:34 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Tue, 2 Sep 2003 07:34:26 +0000 (00:34 -0700)
net/ipv4/icmp.c

index c9f456eaa74505cd2bea1015fe086cd44ca15bcc..715919c772346a5e6079c0306be8582535b8c242 100644 (file)
@@ -230,12 +230,18 @@ static struct icmp_control icmp_pointers[NR_ICMP_TYPES+1];
 static DEFINE_PER_CPU(struct socket *, __icmp_socket) = NULL;
 #define icmp_socket    __get_cpu_var(__icmp_socket)
 
-static __inline__ void icmp_xmit_lock(void)
+static __inline__ int icmp_xmit_lock(void)
 {
        local_bh_disable();
 
-       if (unlikely(!spin_trylock(&icmp_socket->sk->sk_lock.slock)))
-               BUG();
+       if (unlikely(!spin_trylock(&icmp_socket->sk->sk_lock.slock))) {
+               /* This can happen if the output path signals a
+                * dst_link_failure() for an outgoing ICMP packet.
+                */
+               local_bh_enable();
+               return 1;
+       }
+       return 0;
 }
 
 static void icmp_xmit_unlock(void)
@@ -376,7 +382,8 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
        if (ip_options_echo(&icmp_param->replyopts, skb))
                goto out;
 
-       icmp_xmit_lock();
+       if (icmp_xmit_lock())
+               return;
 
        icmp_param->data.icmph.checksum = 0;
        icmp_out_count(icmp_param->data.icmph.type);
@@ -488,7 +495,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, u32 info)
                }
        }
 
-       icmp_xmit_lock();
+       if (icmp_xmit_lock())
+               return;
 
        /*
         *      Construct source address and options.